forked from sh-edraft.de/sh_discord_bot
		
	Merge pull request 'Sprint 0.2' (#55) from 0.2 into master
Reviewed-on: sh-edraft.de/kd_discord_bot#55 Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
This commit is contained in:
		| @@ -15,7 +15,11 @@ | |||||||
|     "Scripts": { |     "Scripts": { | ||||||
|       "prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;", |       "prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;", | ||||||
|       "stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;", |       "stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;", | ||||||
|       "dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;" |       "dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;", | ||||||
|  |  | ||||||
|  |       "build-docker": "cpl b; docker-compose down; docker build -t kdb .", | ||||||
|  |       "compose": "docker-compose up -d", | ||||||
|  |       "docker": "cpl build-docker; cpl compose;" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
							
								
								
									
										50
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | version: "3.9" | ||||||
|  |  | ||||||
|  | services: | ||||||
|  |   kdb_prod_1: | ||||||
|  |     image: kdb | ||||||
|  |     container_name: kdb_1 | ||||||
|  |     depends_on: | ||||||
|  |       - kdb_db_1 | ||||||
|  |     environment: | ||||||
|  |       KDB_ENVIRONMENT: "production" | ||||||
|  |       KDB_TOKEN: "" | ||||||
|  |       KDB_PREFIX: "!k " | ||||||
|  |     restart: unless-stopped | ||||||
|  |  | ||||||
|  |   kdb_staging_1: | ||||||
|  |     image: kdb | ||||||
|  |     container_name: kdb_1 | ||||||
|  |     depends_on: | ||||||
|  |       - kdb_db_1 | ||||||
|  |     environment: | ||||||
|  |       KDB_ENVIRONMENT: "staging" | ||||||
|  |       KDB_TOKEN: "" | ||||||
|  |       KDB_PREFIX: "!kt " | ||||||
|  |     restart: unless-stopped | ||||||
|  |  | ||||||
|  |   kdb_db_1: | ||||||
|  |     image: mysql:latest | ||||||
|  |     container_name: kdb_db_1 | ||||||
|  |     command: mysqld --default-authentication-plugin=mysql_native_password | ||||||
|  |     restart: unless-stopped | ||||||
|  |     environment: | ||||||
|  |       MYSQL_ROOT_PASSWORD: "kd_kdb" | ||||||
|  |       MYSQL_USER: "kd_kdb" | ||||||
|  |       MYSQL_PASSWORD: "kd_kdb" | ||||||
|  |       MYSQL_DATABASE: "kd_kdb" | ||||||
|  |     ports: | ||||||
|  |       - "3307:3306" | ||||||
|  |  | ||||||
|  |   kdb_db_2: | ||||||
|  |     image: mysql:latest | ||||||
|  |     container_name: kdb_db_2 | ||||||
|  |     command: mysqld --default-authentication-plugin=mysql_native_password | ||||||
|  |     restart: unless-stopped | ||||||
|  |     environment: | ||||||
|  |       MYSQL_ROOT_PASSWORD: "kd_kdb" | ||||||
|  |       MYSQL_USER: "kd_kdb" | ||||||
|  |       MYSQL_PASSWORD: "kd_kdb" | ||||||
|  |       MYSQL_DATABASE: "kd_kdb" | ||||||
|  |     ports: | ||||||
|  |       - "3308:3306" | ||||||
							
								
								
									
										16
									
								
								dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | # syntax=docker/dockerfile:1 | ||||||
|  | FROM python:3.10 | ||||||
|  |  | ||||||
|  | WORKDIR /app | ||||||
|  | COPY ./dist/bot/build/ . | ||||||
|  |  | ||||||
|  | RUN pip install cpl-core --extra-index-url https://pip.sh-edraft.de | ||||||
|  | RUN pip install cpl-discord --extra-index-url https://pip.sh-edraft.de | ||||||
|  | RUN pip install cpl-query --extra-index-url https://pip.sh-edraft.de | ||||||
|  | RUN pip install cpl-translation --extra-index-url https://pip.sh-edraft.de | ||||||
|  |  | ||||||
|  | ENV KDB_TOKEN="" | ||||||
|  | ENV KDB_PREFIX="!kdb " | ||||||
|  | ENV KDB_ENVIRONMENT="production" | ||||||
|  |  | ||||||
|  | CMD [ "bash", "/app/bot/bot"] | ||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports:  | # imports:  | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| from typing import Optional, Type | from typing import Optional, Type, Callable | ||||||
|  |  | ||||||
| from cpl_core.configuration import ConfigurationABC, ConfigurationModelABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.console import Console | from cpl_core.console import Console | ||||||
| from cpl_core.dependency_injection import ServiceProviderABC | from cpl_core.dependency_injection import ServiceProviderABC | ||||||
| from cpl_core.logging import LoggerABC | from cpl_core.logging import LoggerABC | ||||||
| @@ -9,13 +9,12 @@ from cpl_discord.configuration import DiscordBotSettings | |||||||
| from cpl_discord.service import DiscordBotServiceABC, DiscordBotService | from cpl_discord.service import DiscordBotServiceABC, DiscordBotService | ||||||
| from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSettings | from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSettings | ||||||
|  |  | ||||||
|  | from bot_core.configuration.bot_logging_settings import BotLoggingSettings | ||||||
| from bot_core.configuration.bot_settings import BotSettings | from bot_core.configuration.bot_settings import BotSettings | ||||||
| from bot_core.configuration.server_settings import ServerSettings | from bot_core.logging.command_logger import CommandLogger | ||||||
| from modules.base.configuration.base_server_settings import BaseServerSettings | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from modules.base.configuration.base_settings import BaseSettings | from modules.base.configuration.base_settings import BaseSettings | ||||||
| from modules.boot_log.configuration.boot_log_server_settings import BootLogServerSettings |  | ||||||
| from modules.boot_log.configuration.boot_log_settings import BootLogSettings | from modules.boot_log.configuration.boot_log_settings import BootLogSettings | ||||||
| from modules.permission.configuration.permission_server_settings import PermissionServerSettings |  | ||||||
| from modules.permission.configuration.permission_settings import PermissionSettings | from modules.permission.configuration.permission_settings import PermissionSettings | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -24,6 +23,8 @@ class Application(DiscordBotApplicationABC): | |||||||
|     def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): |     def __init__(self, config: ConfigurationABC, services: ServiceProviderABC): | ||||||
|         DiscordBotApplicationABC.__init__(self, config, services) |         DiscordBotApplicationABC.__init__(self, config, services) | ||||||
|  |  | ||||||
|  |         self._services = services | ||||||
|  |  | ||||||
|         # cpl-core |         # cpl-core | ||||||
|         self._logger: LoggerABC = services.get_service(LoggerABC) |         self._logger: LoggerABC = services.get_service(LoggerABC) | ||||||
|         # cpl-discord |         # cpl-discord | ||||||
| @@ -33,31 +34,25 @@ class Application(DiscordBotApplicationABC): | |||||||
|         self._translation: TranslationServiceABC = services.get_service(TranslationServiceABC) |         self._translation: TranslationServiceABC = services.get_service(TranslationServiceABC) | ||||||
|         self._translate: TranslatePipe = services.get_service(TranslatePipe) |         self._translate: TranslatePipe = services.get_service(TranslatePipe) | ||||||
|  |  | ||||||
|     def _configure_settings_with_servers(self, settings: Type, server_settings: Type): |         self._is_stopping = False | ||||||
|         settings: Optional[settings] = self._configuration.get_configuration(settings) |  | ||||||
|         if settings is None: |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         for server in settings.servers: |  | ||||||
|             self._logger.trace(__name__, f'Saved config: {type(server).__name__}_{server.id}') |  | ||||||
|             self._configuration.add_configuration(f'{type(server).__name__}_{server.id}', server) |  | ||||||
|  |  | ||||||
|     async def configure(self): |     async def configure(self): | ||||||
|         self._translation.load_by_settings(self._configuration.get_configuration(TranslationSettings)) |         self._translation.load_by_settings(self._configuration.get_configuration(TranslationSettings)) | ||||||
|         self._configure_settings_with_servers(BotSettings, ServerSettings) |  | ||||||
|         self._configure_settings_with_servers(BaseSettings, BaseServerSettings) |  | ||||||
|         self._configure_settings_with_servers(BootLogSettings, BootLogServerSettings) |  | ||||||
|         self._configure_settings_with_servers(PermissionSettings, PermissionServerSettings) |  | ||||||
|  |  | ||||||
|     async def main(self): |     async def main(self): | ||||||
|         try: |         try: | ||||||
|             self._logger.debug(__name__, f'Starting...\n') |             self._logger.debug(__name__, f'Starting...\n') | ||||||
|             self._logger.trace(__name__, f'Try to start {DiscordBotService.__name__}') |             self._logger.trace(__name__, f'Try to start {DiscordBotService.__name__}') | ||||||
|             await self._bot.start_async() |             await self._bot.start_async() | ||||||
|  |             await self._bot.stop_async() | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             self._logger.error(__name__, 'Start failed', e) |             self._logger.error(__name__, 'Start failed', e) | ||||||
|  |  | ||||||
|     async def stop_async(self): |     async def stop_async(self): | ||||||
|  |         if self._is_stopping: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         self._is_stopping = True | ||||||
|         try: |         try: | ||||||
|             self._logger.trace(__name__, f'Try to stop {DiscordBotService.__name__}') |             self._logger.trace(__name__, f'Try to stop {DiscordBotService.__name__}') | ||||||
|             await self._bot.close() |             await self._bot.close() | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ | |||||||
|   "ProjectSettings": { |   "ProjectSettings": { | ||||||
|     "Name": "bot", |     "Name": "bot", | ||||||
|     "Version": { |     "Version": { | ||||||
|       "Major": "1", |       "Major": "0", | ||||||
|       "Minor": "0", |       "Minor": "2", | ||||||
|       "Micro": "0.dev3" |       "Micro": "0" | ||||||
|     }, |     }, | ||||||
|     "Author": "Sven Heidemann", |     "Author": "Sven Heidemann", | ||||||
|     "AuthorEmail": "sven.heidemann@sh-edraft.de", |     "AuthorEmail": "sven.heidemann@sh-edraft.de", | ||||||
| @@ -16,13 +16,13 @@ | |||||||
|     "LicenseName": "MIT", |     "LicenseName": "MIT", | ||||||
|     "LicenseDescription": "MIT, see LICENSE for more details.", |     "LicenseDescription": "MIT, see LICENSE for more details.", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post4", |       "cpl-core>=2022.10.0", | ||||||
|       "cpl-translation==2022.7.0.post2", |       "cpl-translation>=2022.10.0", | ||||||
|       "cpl-query==2022.7.0", |       "cpl-query>=2022.10.0", | ||||||
|       "cpl-discord==2022.7.0.post4" |       "cpl-discord>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
| @@ -7,16 +7,44 @@ | |||||||
|   }, |   }, | ||||||
|   "LoggingSettings": { |   "LoggingSettings": { | ||||||
|     "Path": "logs/", |     "Path": "logs/", | ||||||
|     "Filename": "log_dev.log", |     "Filename": "bot.log", | ||||||
|     "ConsoleLogLevel": "DEBUG", |     "ConsoleLogLevel": "DEBUG", | ||||||
|     "FileLogLevel": "DEBUG" |     "FileLogLevel": "DEBUG" | ||||||
|   }, |   }, | ||||||
|  |   "BotLoggingSettings": { | ||||||
|  |     "Command": { | ||||||
|  |       "Path": "logs/", | ||||||
|  |       "Filename": "commands.log", | ||||||
|  |       "ConsoleLogLevel": "DEBUG", | ||||||
|  |       "FileLogLevel": "DEBUG" | ||||||
|  |     }, | ||||||
|  |     "Database": { | ||||||
|  |       "Path": "logs/", | ||||||
|  |       "Filename": "database.log", | ||||||
|  |       "ConsoleLogLevel": "DEBUG", | ||||||
|  |       "FileLogLevel": "DEBUG" | ||||||
|  |     }, | ||||||
|  |     "Message": { | ||||||
|  |       "Path": "logs/", | ||||||
|  |       "Filename": "message.log", | ||||||
|  |       "ConsoleLogLevel": "DEBUG", | ||||||
|  |       "FileLogLevel": "DEBUG" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|   "Translation": { |   "Translation": { | ||||||
|     "DefaultLanguage": "de", |     "DefaultLanguage": "de", | ||||||
|     "Languages": [ |     "Languages": [ | ||||||
|       "de" |       "de" | ||||||
|     ] |     ] | ||||||
|   }, |   }, | ||||||
|  |   "FeatureFlags": { | ||||||
|  |     "AdminModule": true, | ||||||
|  |     "BaseModule": true, | ||||||
|  |     "BootLogModule": true, | ||||||
|  |     "DatabaseModule": true, | ||||||
|  |     "ModeratorModule": true, | ||||||
|  |     "PermissionModule": true | ||||||
|  |   }, | ||||||
|   "DiscordBot": { |   "DiscordBot": { | ||||||
|     "Token": "OTk4MTU5NjczODkzMDYwNzM4.GN3QyA.yvWO6L7Eu36gXQ7ARDs0Jg2J1VqIDnHLou5lT4", |     "Token": "OTk4MTU5NjczODkzMDYwNzM4.GN3QyA.yvWO6L7Eu36gXQ7ARDs0Jg2J1VqIDnHLou5lT4", | ||||||
|     "Prefix": "!kd " |     "Prefix": "!kd " | ||||||
|   | |||||||
							
								
								
									
										87
									
								
								src/bot/config/appsettings.edrafts-pc-ubuntu.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/bot/config/appsettings.edrafts-pc-ubuntu.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | |||||||
|  | { | ||||||
|  |   "LoggingSettings": { | ||||||
|  |     "Path": "logs/", | ||||||
|  |     "Filename": "bot.log", | ||||||
|  |     "ConsoleLogLevel": "DEBUG", | ||||||
|  |     "FileLogLevel": "TRACE" | ||||||
|  |   }, | ||||||
|  |   "BotLoggingSettings": { | ||||||
|  |     "Command": { | ||||||
|  |       "Path": "logs/", | ||||||
|  |       "Filename": "commands.log", | ||||||
|  |       "ConsoleLogLevel": "DEBUG", | ||||||
|  |       "FileLogLevel": "TRACE" | ||||||
|  |     }, | ||||||
|  |     "Database": { | ||||||
|  |       "Path": "logs/", | ||||||
|  |       "Filename": "database.log", | ||||||
|  |       "ConsoleLogLevel": "DEBUG", | ||||||
|  |       "FileLogLevel": "TRACE" | ||||||
|  |     }, | ||||||
|  |     "Message": { | ||||||
|  |       "Path": "logs/", | ||||||
|  |       "Filename": "message.log", | ||||||
|  |       "ConsoleLogLevel": "DEBUG", | ||||||
|  |       "FileLogLevel": "TRACE" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "DatabaseSettings": { | ||||||
|  |     "Host": "localhost", | ||||||
|  |     "User": "kd_kdb", | ||||||
|  |     "Password": "VGpZcihrb0N2T2MyZUlURQ==", | ||||||
|  |     "Database": "keksdose_bot_dev", | ||||||
|  |     "Charset": "utf8mb4", | ||||||
|  |     "UseUnicode": "true", | ||||||
|  |     "Buffered": "true", | ||||||
|  |     "AuthPlugin": "mysql_native_password" | ||||||
|  |   }, | ||||||
|  |   "DiscordBot": { | ||||||
|  |     "Token": "OTk4MTYwNDI3Njg5MTgxMjM3.GI7h67.BqD6Lu1Tz0MuG8iktYrcLnHi1pNozyMiWFGTKI", | ||||||
|  |     "Prefix": "!ke " | ||||||
|  |   }, | ||||||
|  |   "FeatureFlags": { | ||||||
|  |     "AdminModule": true, | ||||||
|  |     "BaseModule": true, | ||||||
|  |     "BootLogModule": true, | ||||||
|  |     "DatabaseModule": true, | ||||||
|  |     "ModeratorModule": true, | ||||||
|  |     "PermissionModule": true | ||||||
|  |   }, | ||||||
|  |   "Bot": { | ||||||
|  |     "910199451145076828": { | ||||||
|  |       "MessageDeleteTimer": 2 | ||||||
|  |     }, | ||||||
|  |     "Technicians": [ | ||||||
|  |       240160344557879316 | ||||||
|  |     ], | ||||||
|  |     "DeployFilesPath": "../../deploy" | ||||||
|  |   }, | ||||||
|  |   "Base": { | ||||||
|  |     "910199451145076828": { | ||||||
|  |       "MaxVoiceStateHours": 24, | ||||||
|  |       "XpPerMessage": 2, | ||||||
|  |       "XpPerOntimeHour": 4, | ||||||
|  |       "AFKChannelIds": [ | ||||||
|  |         910199452915093593, | ||||||
|  |         910199452915093594 | ||||||
|  |       ], | ||||||
|  |       "AFKCommandChannelId": 910199452915093594, | ||||||
|  |       "HelpCommandReferenceUrl": "https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot/wiki/Befehle" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "BootLog": { | ||||||
|  |     "910199451145076828": { | ||||||
|  |       "LoginMessageChannelId": "910199452915093588" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "Permission": { | ||||||
|  |     "910199451145076828": { | ||||||
|  |       "AdminRoleIds": [ | ||||||
|  |         925072155203477584 | ||||||
|  |       ], | ||||||
|  |       "ModeratorRoleIds": [ | ||||||
|  |         925072209884635167 | ||||||
|  |       ] | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -6,9 +6,29 @@ | |||||||
|     "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" |     "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" | ||||||
|   }, |   }, | ||||||
|   "LoggingSettings": { |   "LoggingSettings": { | ||||||
|     "Path": "logs/", |     "Path": "logs/$date_now/", | ||||||
|     "Filename": "log_$start_time.log", |     "Filename": "bot.log", | ||||||
|     "ConsoleLogLevel": "ERROR", |     "ConsoleLogLevel": "ERROR", | ||||||
|     "FileLogLevel": "WARN" |     "FileLogLevel": "WARN" | ||||||
|  |   }, | ||||||
|  |   "BotLoggingSettings": { | ||||||
|  |     "Command": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "commands.log", | ||||||
|  |       "ConsoleLogLevel": "ERROR", | ||||||
|  |       "FileLogLevel": "WARN" | ||||||
|  |     }, | ||||||
|  |     "Database": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "database.log", | ||||||
|  |       "ConsoleLogLevel": "ERROR", | ||||||
|  |       "FileLogLevel": "WARN" | ||||||
|  |     }, | ||||||
|  |     "Message": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "message.log", | ||||||
|  |       "ConsoleLogLevel": "ERROR", | ||||||
|  |       "FileLogLevel": "WARN" | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -6,17 +6,56 @@ | |||||||
|     "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" |     "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" | ||||||
|   }, |   }, | ||||||
|   "LoggingSettings": { |   "LoggingSettings": { | ||||||
|     "Path": "logs/", |     "Path": "logs/$date_now/", | ||||||
|     "Filename": "log_$start_time.log", |     "Filename": "bot.log", | ||||||
|     "ConsoleLogLevel": "ERROR", |     "ConsoleLogLevel": "ERROR", | ||||||
|     "FileLogLevel": "INFO" |     "FileLogLevel": "INFO" | ||||||
|   }, |   }, | ||||||
|  |   "BotLoggingSettings": { | ||||||
|  |     "Command": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "commands.log", | ||||||
|  |       "ConsoleLogLevel": "ERROR", | ||||||
|  |       "FileLogLevel": "INFO" | ||||||
|  |     }, | ||||||
|  |     "Database": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "database.log", | ||||||
|  |       "ConsoleLogLevel": "ERROR", | ||||||
|  |       "FileLogLevel": "INFO" | ||||||
|  |     }, | ||||||
|  |     "Message": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "message.log", | ||||||
|  |       "ConsoleLogLevel": "ERROR", | ||||||
|  |       "FileLogLevel": "INFO" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|   "Translation": { |   "Translation": { | ||||||
|     "DefaultLanguage": "de", |     "DefaultLanguage": "de", | ||||||
|     "Languages": [ |     "Languages": [ | ||||||
|       "de" |       "de" | ||||||
|     ] |     ] | ||||||
|   }, |   }, | ||||||
|  |   "DatabaseSettings": { | ||||||
|  |     "Host": "localhost", | ||||||
|  |     "User": "kd_kdb", | ||||||
|  |     "Password": "a2Rfa2Ri", | ||||||
|  |     "Database": "kd_kdb", | ||||||
|  |     "Port": "3307", | ||||||
|  |     "Charset": "utf8mb4", | ||||||
|  |     "UseUnicode": "true", | ||||||
|  |     "Buffered": "true", | ||||||
|  |     "AuthPlugin": "mysql_native_password" | ||||||
|  |   }, | ||||||
|  |   "FeatureFlags": { | ||||||
|  |     "AdminModule": true, | ||||||
|  |     "BaseModule": true, | ||||||
|  |     "BootLogModule": true, | ||||||
|  |     "DatabaseModule": true, | ||||||
|  |     "ModeratorModule": true, | ||||||
|  |     "PermissionModule": true | ||||||
|  |   }, | ||||||
|   "Bot": { |   "Bot": { | ||||||
|     "650366049023295514": { |     "650366049023295514": { | ||||||
|       "MessageDeleteTimer": 2 |       "MessageDeleteTimer": 2 | ||||||
|   | |||||||
| @@ -6,17 +6,56 @@ | |||||||
|     "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" |     "DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S" | ||||||
|   }, |   }, | ||||||
|   "LoggingSettings": { |   "LoggingSettings": { | ||||||
|     "Path": "logs/", |     "Path": "logs/$date_now/", | ||||||
|     "Filename": "log_staging_$start_time.log", |     "Filename": "bot.log", | ||||||
|     "ConsoleLogLevel": "INFO", |     "ConsoleLogLevel": "INFO", | ||||||
|     "FileLogLevel": "DEBUG" |     "FileLogLevel": "DEBUG" | ||||||
|   }, |   }, | ||||||
|  |   "BotLoggingSettings": { | ||||||
|  |     "Command": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "commands.log", | ||||||
|  |       "ConsoleLogLevel": "INFO", | ||||||
|  |       "FileLogLevel": "DEBUG" | ||||||
|  |     }, | ||||||
|  |     "Database": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "database.log", | ||||||
|  |       "ConsoleLogLevel": "INFO", | ||||||
|  |       "FileLogLevel": "DEBUG" | ||||||
|  |     }, | ||||||
|  |     "Message": { | ||||||
|  |       "Path": "logs/$date_now/", | ||||||
|  |       "Filename": "message.log", | ||||||
|  |       "ConsoleLogLevel": "INFO", | ||||||
|  |       "FileLogLevel": "DEBUG" | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|   "Translation": { |   "Translation": { | ||||||
|     "DefaultLanguage": "de", |     "DefaultLanguage": "de", | ||||||
|     "Languages": [ |     "Languages": [ | ||||||
|       "de" |       "de" | ||||||
|     ] |     ] | ||||||
|   }, |   }, | ||||||
|  |   "DatabaseSettings": { | ||||||
|  |     "Host": "localhost", | ||||||
|  |     "User": "kd_kdb", | ||||||
|  |     "Password": "a2Rfa2Ri", | ||||||
|  |     "Database": "kd_kdb", | ||||||
|  |     "Port": "3308", | ||||||
|  |     "Charset": "utf8mb4", | ||||||
|  |     "UseUnicode": "true", | ||||||
|  |     "Buffered": "true", | ||||||
|  |     "AuthPlugin": "mysql_native_password" | ||||||
|  |   }, | ||||||
|  |   "FeatureFlags": { | ||||||
|  |     "AdminModule": true, | ||||||
|  |     "BaseModule": true, | ||||||
|  |     "BootLogModule": true, | ||||||
|  |     "DatabaseModule": true, | ||||||
|  |     "ModeratorModule": true, | ||||||
|  |     "PermissionModule": true | ||||||
|  |   }, | ||||||
|   "Bot": { |   "Bot": { | ||||||
|     "910199451145076828": { |     "910199451145076828": { | ||||||
|       "MessageDeleteTimer": 4 |       "MessageDeleteTimer": 4 | ||||||
|   | |||||||
| @@ -8,6 +8,8 @@ from bot.application import Application | |||||||
| from bot.startup import Startup | from bot.startup import Startup | ||||||
| from bot.startup_discord_extension import StartupDiscordExtension | from bot.startup_discord_extension import StartupDiscordExtension | ||||||
| from bot.startup_migration_extension import StartupMigrationExtension | from bot.startup_migration_extension import StartupMigrationExtension | ||||||
|  | from bot.startup_module_extension import StartupModuleExtension | ||||||
|  | from bot.startup_settings_extension import StartupSettingsExtension | ||||||
| from modules.boot_log.boot_log_extension import BootLogExtension | from modules.boot_log.boot_log_extension import BootLogExtension | ||||||
| from modules.database.database_extension import DatabaseExtension | from modules.database.database_extension import DatabaseExtension | ||||||
|  |  | ||||||
| @@ -18,16 +20,21 @@ class Program: | |||||||
|         self.app: Optional[Application] = None |         self.app: Optional[Application] = None | ||||||
|  |  | ||||||
|     async def start(self): |     async def start(self): | ||||||
|         app_builder = ApplicationBuilder(Application) |         # discord extension has to be loaded before modules (modules depends on discord stuff) | ||||||
|         app_builder.use_extension(StartupDiscordExtension) |         app_builder = ApplicationBuilder(Application) \ | ||||||
|         app_builder.use_extension(StartupMigrationExtension) |             .use_extension(StartupSettingsExtension) \ | ||||||
|         app_builder.use_extension(BootLogExtension) |             .use_extension(StartupDiscordExtension) \ | ||||||
|         app_builder.use_extension(DatabaseExtension) |             .use_extension(StartupModuleExtension) \ | ||||||
|         app_builder.use_startup(Startup) |             .use_extension(StartupMigrationExtension) \ | ||||||
|  |             .use_extension(BootLogExtension) \ | ||||||
|  |             .use_extension(DatabaseExtension) \ | ||||||
|  |             .use_startup(Startup) | ||||||
|         self.app: Application = await app_builder.build_async() |         self.app: Application = await app_builder.build_async() | ||||||
|         await self.app.run_async() |         await self.app.run_async() | ||||||
|  |  | ||||||
|     async def stop(self): |     async def stop(self): | ||||||
|  |         if self.app is None: | ||||||
|  |             return | ||||||
|         await self.app.stop_async() |         await self.app.stop_async() | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,9 +7,15 @@ from cpl_core.configuration import ConfigurationABC | |||||||
| from cpl_core.database import DatabaseSettings | from cpl_core.database import DatabaseSettings | ||||||
| from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC | from cpl_core.dependency_injection import ServiceProviderABC, ServiceCollectionABC | ||||||
| from cpl_core.environment import ApplicationEnvironment | from cpl_core.environment import ApplicationEnvironment | ||||||
|  | from cpl_core.logging import LoggerABC | ||||||
|  | from cpl_discord import get_discord_collection | ||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
|  | from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  | from bot_core.logging.message_logger import MessageLogger | ||||||
| from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe | from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe | ||||||
| from bot_core.service.client_utils_service import ClientUtilsService | from bot_core.service.client_utils_service import ClientUtilsService | ||||||
| from bot_core.service.message_service import MessageService | from bot_core.service.message_service import MessageService | ||||||
| @@ -41,23 +47,17 @@ class Startup(StartupABC): | |||||||
|         self._config: Optional[ConfigurationABC] = None |         self._config: Optional[ConfigurationABC] = None | ||||||
|  |  | ||||||
|     def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC: |     def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC: | ||||||
|         environment.set_working_directory(os.path.dirname(os.path.realpath(__file__))) |  | ||||||
|         configuration.add_environment_variables('KDB_') |  | ||||||
|         configuration.add_environment_variables('DISCORD_') |  | ||||||
|  |  | ||||||
|         configuration.add_json_file(f'config/appsettings.json', optional=False) |  | ||||||
|         configuration.add_json_file(f'config/appsettings.{environment.environment_name}.json', optional=True) |  | ||||||
|         configuration.add_json_file(f'config/appsettings.{environment.host_name}.json', optional=True) |  | ||||||
|  |  | ||||||
|         configuration.add_configuration('Startup_StartTime', str(self._start_time)) |  | ||||||
|  |  | ||||||
|         self._config = configuration |         self._config = configuration | ||||||
|         return configuration |         return configuration | ||||||
|  |  | ||||||
|     def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC: |     def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC: | ||||||
|         services.add_logging() |         services.add_logging() | ||||||
|         services.add_translation() |         # custom logging | ||||||
|  |         services.add_singleton(LoggerABC, CommandLogger) | ||||||
|  |         services.add_singleton(LoggerABC, DatabaseLogger) | ||||||
|  |         services.add_singleton(LoggerABC, MessageLogger) | ||||||
|  |  | ||||||
|  |         services.add_translation() | ||||||
|         services.add_db_context(DBContext, self._config.get_configuration(DatabaseSettings)) |         services.add_db_context(DBContext, self._config.get_configuration(DatabaseSettings)) | ||||||
|  |  | ||||||
|         # general services |         # general services | ||||||
| @@ -79,4 +79,9 @@ class Startup(StartupABC): | |||||||
|         services.add_transient(UserJoinedServerRepositoryABC, UserJoinedServerRepositoryService) |         services.add_transient(UserJoinedServerRepositoryABC, UserJoinedServerRepositoryService) | ||||||
|         services.add_transient(UserJoinedVoiceChannelRepositoryABC, UserJoinedVoiceChannelRepositoryService) |         services.add_transient(UserJoinedVoiceChannelRepositoryABC, UserJoinedVoiceChannelRepositoryService) | ||||||
|  |  | ||||||
|         return services.build_service_provider() |         provider = services.build_service_provider() | ||||||
|  |         # instantiate custom logger | ||||||
|  |         for c in CustomFileLoggerABC.__subclasses__(): | ||||||
|  |             i: LoggerABC = provider.get_service(c) | ||||||
|  |  | ||||||
|  |         return provider | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | from typing import Optional | ||||||
|  |  | ||||||
| from cpl_core.application import StartupExtensionABC | from cpl_core.application import StartupExtensionABC | ||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.dependency_injection import ServiceCollectionABC | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
| @@ -5,7 +7,7 @@ from cpl_core.environment import ApplicationEnvironmentABC | |||||||
| from cpl_discord import get_discord_collection | from cpl_discord import get_discord_collection | ||||||
| from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | ||||||
|  |  | ||||||
| from modules.admin.command.deploy_command import DeployCommand | from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||||
| from modules.admin.command.restart_command import RestartCommand | from modules.admin.command.restart_command import RestartCommand | ||||||
| from modules.admin.command.shutdown_command import ShutdownCommand | from modules.admin.command.shutdown_command import ShutdownCommand | ||||||
| from modules.base.command.afk_command import AFKCommand | from modules.base.command.afk_command import AFKCommand | ||||||
| @@ -13,6 +15,7 @@ from modules.base.command.help_command import HelpCommand | |||||||
| from modules.base.command.info_command import InfoCommand | from modules.base.command.info_command import InfoCommand | ||||||
| from modules.base.command.ping_command import PingCommand | from modules.base.command.ping_command import PingCommand | ||||||
| from modules.base.events.base_on_command_error_event import BaseOnCommandErrorEvent | from modules.base.events.base_on_command_error_event import BaseOnCommandErrorEvent | ||||||
|  | from modules.base.events.base_on_command_event import BaseOnCommandEvent | ||||||
| from modules.moderator.command.purge_command import PurgeCommand | from modules.moderator.command.purge_command import PurgeCommand | ||||||
| from modules.base.command.user_info_command import UserInfoCommand | from modules.base.command.user_info_command import UserInfoCommand | ||||||
| from modules.base.events.base_on_member_join_event import BaseOnMemberJoinEvent | from modules.base.events.base_on_member_join_event import BaseOnMemberJoinEvent | ||||||
| @@ -35,34 +38,4 @@ class StartupDiscordExtension(StartupExtensionABC): | |||||||
|  |  | ||||||
|     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): |     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|         services.add_discord() |         services.add_discord() | ||||||
|         dc = get_discord_collection(services) |         dcc = get_discord_collection(services) | ||||||
|         """ commands """ |  | ||||||
|         # admin |  | ||||||
|         dc.add_command(RestartCommand) |  | ||||||
|         dc.add_command(ShutdownCommand) |  | ||||||
|         dc.add_command(DeployCommand) |  | ||||||
|         # moderator |  | ||||||
|         dc.add_command(PurgeCommand) |  | ||||||
|         # simple |  | ||||||
|         dc.add_command(AFKCommand) |  | ||||||
|         dc.add_command(HelpCommand) |  | ||||||
|         dc.add_command(InfoCommand) |  | ||||||
|         dc.add_command(PingCommand) |  | ||||||
|         dc.add_command(UserInfoCommand) |  | ||||||
|         """ events """ |  | ||||||
|         # on_command_error |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_command_error.value, BaseOnCommandErrorEvent) |  | ||||||
|         # on_member_join |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberJoinEvent) |  | ||||||
|         # on_member_remove |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberRemoveEvent) |  | ||||||
|         # on_member_update |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_member_update.value, PermissionOnMemberUpdateEvent) |  | ||||||
|         # on_message |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_message.value, BaseOnMessageEvent) |  | ||||||
|         # on_voice_state_update |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_voice_state_update.value, BaseOnVoiceStateUpdateEvent) |  | ||||||
|         # on_ready |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_ready.value, DatabaseOnReadyEvent) |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_ready.value, PermissionOnReadyEvent) |  | ||||||
|         dc.add_event(DiscordEventTypesEnum.on_ready.value, BootLogOnReadyEvent)  # has to be last |  | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								src/bot/startup_module_extension.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/bot/startup_module_extension.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | from typing import Optional | ||||||
|  |  | ||||||
|  | from cpl_core.application import StartupExtensionABC | ||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.console import Console, ForegroundColorEnum | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||||
|  | from modules.admin.admin_module import AdminModule | ||||||
|  | from modules.base.base_module import BaseModule | ||||||
|  | from modules.boot_log.boot_log_module import BootLogModule | ||||||
|  | from modules.database.database_module import DatabaseModule | ||||||
|  | from modules.moderator.moderator_module import ModeratorModule | ||||||
|  | from modules.permission.permission_module import PermissionModule | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class StartupModuleExtension(StartupExtensionABC): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self._config: Optional[ConfigurationABC] = None | ||||||
|  |         self._feature_flags: Optional[FeatureFlagsSettings] = None | ||||||
|  |  | ||||||
|  |         self._modules = List(type, [ | ||||||
|  |             AdminModule, | ||||||
|  |             BaseModule, | ||||||
|  |             DatabaseModule, | ||||||
|  |             ModeratorModule, | ||||||
|  |             PermissionModule, | ||||||
|  |             BootLogModule  # has to be last! | ||||||
|  |         ]) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         self._config = config | ||||||
|  |         self._feature_flags = config.get_configuration(FeatureFlagsSettings) | ||||||
|  |  | ||||||
|  |     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         provider = services.build_service_provider() | ||||||
|  |         dc_collection: DiscordCollectionABC = provider.get_service(DiscordCollectionABC) | ||||||
|  |  | ||||||
|  |         for module_type in self._modules: | ||||||
|  |             module = module_type(dc_collection) | ||||||
|  |             if not module.feature_flag(self._feature_flags): | ||||||
|  |                 continue | ||||||
|  |  | ||||||
|  |             Console.set_foreground_color(ForegroundColorEnum.green) | ||||||
|  |             Console.write_line(f'[{__name__}] Loaded module: {module_type}') | ||||||
|  |             Console.color_reset() | ||||||
|  |             module.configure_configuration(self._config, env) | ||||||
|  |             module.configure_services(services, env) | ||||||
							
								
								
									
										52
									
								
								src/bot/startup_settings_extension.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/bot/startup_settings_extension.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | import os | ||||||
|  | from datetime import datetime | ||||||
|  | from typing import Callable, Type, Optional | ||||||
|  |  | ||||||
|  | from cpl_core.application import StartupExtensionABC | ||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_core.logging import LoggerABC | ||||||
|  |  | ||||||
|  | from bot_core.configuration.bot_logging_settings import BotLoggingSettings | ||||||
|  | from bot_core.configuration.bot_settings import BotSettings | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  | from modules.base.configuration.base_settings import BaseSettings | ||||||
|  | from modules.boot_log.configuration.boot_log_settings import BootLogSettings | ||||||
|  | from modules.permission.configuration.permission_settings import PermissionSettings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class StartupSettingsExtension(StartupExtensionABC): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self._start_time = datetime.now() | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironmentABC): | ||||||
|  |         # this shit has to be done here because we need settings in subsequent startup extensions | ||||||
|  |         environment.set_working_directory(os.path.dirname(os.path.realpath(__file__))) | ||||||
|  |         configuration.add_environment_variables('KDB_') | ||||||
|  |         configuration.add_environment_variables('DISCORD_') | ||||||
|  |  | ||||||
|  |         configuration.add_json_file(f'config/appsettings.json', optional=False) | ||||||
|  |         configuration.add_json_file(f'config/appsettings.{environment.environment_name}.json', optional=True) | ||||||
|  |         configuration.add_json_file(f'config/appsettings.{environment.host_name}.json', optional=True) | ||||||
|  |  | ||||||
|  |         configuration.add_configuration('Startup_StartTime', str(self._start_time)) | ||||||
|  |         self._configure_settings_with_sub_settings(configuration, BotSettings, lambda x: x.servers, lambda x: x.id) | ||||||
|  |         self._configure_settings_with_sub_settings(configuration, BaseSettings, lambda x: x.servers, lambda x: x.id) | ||||||
|  |         self._configure_settings_with_sub_settings(configuration, BootLogSettings, lambda x: x.servers, lambda x: x.id) | ||||||
|  |         self._configure_settings_with_sub_settings(configuration, PermissionSettings, lambda x: x.servers, lambda x: x.id) | ||||||
|  |         self._configure_settings_with_sub_settings(configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key) | ||||||
|  |  | ||||||
|  |     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def _configure_settings_with_sub_settings(config: ConfigurationABC, settings: Type, list_atr: Callable, atr: Callable): | ||||||
|  |         settings: Optional[settings] = config.get_configuration(settings) | ||||||
|  |         if settings is None: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         for sub_settings in list_atr(settings): | ||||||
|  |             config.add_configuration(f'{type(sub_settings).__name__}_{atr(sub_settings)}', sub_settings) | ||||||
| @@ -37,7 +37,8 @@ | |||||||
|       "extension_already_loaded": "Fehler: Erweiterung wurde bereits geladen!", |       "extension_already_loaded": "Fehler: Erweiterung wurde bereits geladen!", | ||||||
|       "extension_not_loaded": "Fehler: Erweiterung wurde nicht geladen!", |       "extension_not_loaded": "Fehler: Erweiterung wurde nicht geladen!", | ||||||
|       "no_entry_point_error": "Fehler: Kein Eintrittspunkt!", |       "no_entry_point_error": "Fehler: Kein Eintrittspunkt!", | ||||||
|       "extension_failed": "Fehler: Erweiterung ist fehlgeschlagen!" |       "extension_failed": "Fehler: Erweiterung ist fehlgeschlagen!", | ||||||
|  |       "bot_not_ready_yet": "Ey Alter! Gedulde dich doch mal! ..." | ||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   "modules": { |   "modules": { | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_core' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_core.abc' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,5 +1,7 @@ | |||||||
| from abc import ABC, abstractmethod | from abc import ABC, abstractmethod | ||||||
|  |  | ||||||
|  | from discord.ext.commands import Context | ||||||
|  |  | ||||||
|  |  | ||||||
| class ClientUtilsServiceABC(ABC): | class ClientUtilsServiceABC(ABC): | ||||||
|  |  | ||||||
| @@ -14,3 +16,6 @@ class ClientUtilsServiceABC(ABC): | |||||||
|  |  | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     def get_client(self, dc_ic: int, guild_id: int): pass |     def get_client(self, dc_ic: int, guild_id: int): pass | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     async def check_if_bot_is_ready_yet_and_respond(self, ctx: Context) -> bool: pass | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								src/bot_core/abc/custom_file_logger_abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/bot_core/abc/custom_file_logger_abc.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | from abc import ABC, abstractmethod | ||||||
|  |  | ||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_core.logging import LoggingSettings, Logger, LoggingLevelEnum, LoggerABC | ||||||
|  | from cpl_core.time import TimeFormatSettings | ||||||
|  |  | ||||||
|  | from bot_core.configuration.file_logging_settings import FileLoggingSettings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CustomFileLoggerABC(Logger, ABC): | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def __init__(self, key: str, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC): | ||||||
|  |         self._key = key | ||||||
|  |         settings: LoggingSettings = config.get_configuration(f'{FileLoggingSettings.__name__}_{key}') | ||||||
|  |         Logger.__init__(self, settings, time_format, env) | ||||||
|  |         self._begin_log() | ||||||
|  |  | ||||||
|  |     def _begin_log(self): | ||||||
|  |         console_level = self._console.value | ||||||
|  |         self._console = LoggingLevelEnum.OFF | ||||||
|  |         self.info(__name__, f'Starting...') | ||||||
|  |         self._console = LoggingLevelEnum(console_level) | ||||||
|  |  | ||||||
|  |     def _get_string(self, name_list_as_str: str, level: LoggingLevelEnum, message: str) -> str: | ||||||
|  |         names = name_list_as_str.split(' ') | ||||||
|  |         log_level = level.name | ||||||
|  |         string = f'<{self._get_datetime_now()}> [ {log_level} ]' | ||||||
|  |         for name in names: | ||||||
|  |             string += f' [ {name} ]' | ||||||
|  |         string += f': {message}' | ||||||
|  |         return string | ||||||
|  |  | ||||||
|  |     def header(self, string: str): | ||||||
|  |         super().header(string) | ||||||
|  |  | ||||||
|  |     def trace(self, name: str, message: str): | ||||||
|  |         name = f'{name} {self._key}' | ||||||
|  |         super().trace(name, message) | ||||||
|  |  | ||||||
|  |     def debug(self, name: str, message: str): | ||||||
|  |         name = f'{name} {self._key}' | ||||||
|  |         super().debug(name, message) | ||||||
|  |  | ||||||
|  |     def info(self, name: str, message: str): | ||||||
|  |         name = f'{name} {self._key}' | ||||||
|  |         super().info(name, message) | ||||||
|  |  | ||||||
|  |     def warn(self, name: str, message: str): | ||||||
|  |         name = f'{name} {self._key}' | ||||||
|  |         super().warn(name, message) | ||||||
|  |  | ||||||
|  |     def error(self, name: str, message: str, ex: Exception = None): | ||||||
|  |         name = f'{name} {self._key}' | ||||||
|  |         super().error(name, message, ex) | ||||||
|  |  | ||||||
|  |     def fatal(self, name: str, message: str, ex: Exception = None): | ||||||
|  |         name = f'{name} {self._key}' | ||||||
|  |         super().fatal(name, message, ex) | ||||||
							
								
								
									
										19
									
								
								src/bot_core/abc/module_abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/bot_core/abc/module_abc.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | from abc import abstractmethod | ||||||
|  | from typing import Callable | ||||||
|  |  | ||||||
|  | from cpl_core.application import StartupExtensionABC | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ModuleABC(StartupExtensionABC): | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC, feature_flag: Callable = None): | ||||||
|  |         StartupExtensionABC.__init__(self) | ||||||
|  |  | ||||||
|  |         self._dc = dc | ||||||
|  |         self._feature_flag = feature_flag | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def feature_flag(self) -> Callable: | ||||||
|  |         return self._feature_flag | ||||||
| @@ -4,7 +4,7 @@ | |||||||
|     "Version": { |     "Version": { | ||||||
|       "Major": "1", |       "Major": "1", | ||||||
|       "Minor": "0", |       "Minor": "0", | ||||||
|       "Micro": "0.dev1" |       "Micro": "0" | ||||||
|     }, |     }, | ||||||
|     "Author": "Sven Heidemann", |     "Author": "Sven Heidemann", | ||||||
|     "AuthorEmail": "sven.heidemann@sh-edraft.de", |     "AuthorEmail": "sven.heidemann@sh-edraft.de", | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "MIT", |     "LicenseName": "MIT", | ||||||
|     "LicenseDescription": "MIT, see LICENSE for more details.", |     "LicenseDescription": "MIT, see LICENSE for more details.", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0" |       "cpl-core>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_core.configuration' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
							
								
								
									
										33
									
								
								src/bot_core/configuration/bot_logging_settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/bot_core/configuration/bot_logging_settings.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | import traceback | ||||||
|  |  | ||||||
|  | from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC | ||||||
|  | from cpl_core.console import Console, ForegroundColorEnum | ||||||
|  | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.configuration.file_logging_settings import FileLoggingSettings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BotLoggingSettings(ConfigurationModelABC): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         ConfigurationModelABC.__init__(self) | ||||||
|  |         self._files: List[FileLoggingSettings] = List(FileLoggingSettings) | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def files(self) -> List[FileLoggingSettings]: | ||||||
|  |         return self._files | ||||||
|  |  | ||||||
|  |     def from_dict(self, settings: dict): | ||||||
|  |         try: | ||||||
|  |             files = List(FileLoggingSettings) | ||||||
|  |             for s in settings: | ||||||
|  |                 st = FileLoggingSettings() | ||||||
|  |                 settings[s]['Key'] = s | ||||||
|  |                 st.from_dict(settings[s]) | ||||||
|  |                 files.append(st) | ||||||
|  |             self._files = files | ||||||
|  |         except Exception as e: | ||||||
|  |             Console.set_foreground_color(ForegroundColorEnum.red) | ||||||
|  |             Console.write_line(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings') | ||||||
|  |             Console.write_line(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') | ||||||
|  |             Console.set_foreground_color(ForegroundColorEnum.default) | ||||||
| @@ -12,16 +12,18 @@ class BotSettings(ConfigurationModelABC): | |||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         ConfigurationModelABC.__init__(self) |         ConfigurationModelABC.__init__(self) | ||||||
|  |  | ||||||
|         self._servers: List[ServerSettings] = List() |         self._servers: List[ServerSettings] = List(ServerSettings) | ||||||
|         self._technicians: list[int] = [] |         self._technicians: List[int] = List(int) | ||||||
|         self._deploy_file_path = './' |         self._deploy_file_path = './' | ||||||
|  |         self._wait_for_restart = 2 | ||||||
|  |         self._wait_for_shutdown = 2 | ||||||
|      |      | ||||||
|     @property |     @property | ||||||
|     def servers(self) -> List[ServerSettings]: |     def servers(self) -> List[ServerSettings]: | ||||||
|         return self._servers |         return self._servers | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def technicians(self) -> list[int]: |     def technicians(self) -> List[int]: | ||||||
|         return self._technicians |         return self._technicians | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|   | |||||||
							
								
								
									
										65
									
								
								src/bot_core/configuration/feature_flags_settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/bot_core/configuration/feature_flags_settings.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | import traceback | ||||||
|  | from typing import Optional | ||||||
|  |  | ||||||
|  | from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC | ||||||
|  | from cpl_core.console import Console | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class FeatureFlagsSettings(ConfigurationModelABC): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         ConfigurationModelABC.__init__(self) | ||||||
|  |  | ||||||
|  |         self._admin_module = False  # 02.10.2022 #48 | ||||||
|  |         self._base_module = True  # 02.10.2022 #48 | ||||||
|  |         self._boot_log_module = True  # 02.10.2022 #48 | ||||||
|  |         self._database_module = True  # 02.10.2022 #48 | ||||||
|  |         self._moderator_module = False  # 02.10.2022 #48 | ||||||
|  |         self._permission_module = True  # 02.10.2022 #48 | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def admin_module(self) -> bool: | ||||||
|  |         return self._admin_module | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def base_module(self) -> bool: | ||||||
|  |         return self._base_module | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def boot_log_module(self) -> bool: | ||||||
|  |         return self._boot_log_module | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def database_module(self) -> bool: | ||||||
|  |         return self._database_module | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def moderator_module(self) -> bool: | ||||||
|  |         return self._moderator_module | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def permission_module(self) -> bool: | ||||||
|  |         return self._permission_module | ||||||
|  |  | ||||||
|  |     def from_dict(self, settings: dict): | ||||||
|  |         try: | ||||||
|  |             if 'AdminModule' in settings: | ||||||
|  |                 self._admin_module = settings['AdminModule'] | ||||||
|  |  | ||||||
|  |             if 'BaseModule' in settings: | ||||||
|  |                 self._base_module = settings['BaseModule'] | ||||||
|  |  | ||||||
|  |             if 'BootLogModule' in settings: | ||||||
|  |                 self._boot_log_module = settings['BootLogModule'] | ||||||
|  |  | ||||||
|  |             if 'DatabaseModule' in settings: | ||||||
|  |                 self._database_module = settings['DatabaseModule'] | ||||||
|  |  | ||||||
|  |             if 'ModeratorModule' in settings: | ||||||
|  |                 self._moderator_module = settings['ModeratorModule'] | ||||||
|  |  | ||||||
|  |             if 'PermissionModule' in settings: | ||||||
|  |                 self._permission_module = settings['PermissionModule'] | ||||||
|  |         except Exception as e: | ||||||
|  |             Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings') | ||||||
|  |             Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') | ||||||
							
								
								
									
										24
									
								
								src/bot_core/configuration/file_logging_settings.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/bot_core/configuration/file_logging_settings.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | import traceback | ||||||
|  |  | ||||||
|  | from cpl_core.console import Console | ||||||
|  | from cpl_core.logging import LoggingSettings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class FileLoggingSettings(LoggingSettings): | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         LoggingSettings.__init__(self) | ||||||
|  |  | ||||||
|  |         self._key = '' | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def key(self) -> str: | ||||||
|  |         return self._key | ||||||
|  |  | ||||||
|  |     def from_dict(self, settings: dict): | ||||||
|  |         try: | ||||||
|  |             self._key = settings['Key'] | ||||||
|  |             super().from_dict(settings) | ||||||
|  |         except Exception as e: | ||||||
|  |             Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings') | ||||||
|  |             Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}') | ||||||
							
								
								
									
										0
									
								
								src/bot_core/helper/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/bot_core/helper/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										9
									
								
								src/bot_core/helper/log_message_helper.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/bot_core/helper/log_message_helper.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | import discord | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class LogMessageHelper: | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def get_log_string(message: discord.Message): | ||||||
|  |         content = message.content.replace("\n", "\n\t") | ||||||
|  |         return f'{message.author} @ {message.channel} -> \n\t{content}' | ||||||
							
								
								
									
										1
									
								
								src/bot_core/logging/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/bot_core/logging/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | # imports | ||||||
							
								
								
									
										11
									
								
								src/bot_core/logging/command_logger.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/bot_core/logging/command_logger.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_core.time import TimeFormatSettings | ||||||
|  |  | ||||||
|  | from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CommandLogger(CustomFileLoggerABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC): | ||||||
|  |         CustomFileLoggerABC.__init__(self, 'Command', config, time_format, env) | ||||||
							
								
								
									
										11
									
								
								src/bot_core/logging/database_logger.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/bot_core/logging/database_logger.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_core.time import TimeFormatSettings | ||||||
|  |  | ||||||
|  | from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DatabaseLogger(CustomFileLoggerABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC): | ||||||
|  |         CustomFileLoggerABC.__init__(self, 'Database', config, time_format, env) | ||||||
							
								
								
									
										11
									
								
								src/bot_core/logging/message_logger.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/bot_core/logging/message_logger.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_core.time import TimeFormatSettings | ||||||
|  |  | ||||||
|  | from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MessageLogger(CustomFileLoggerABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC): | ||||||
|  |         CustomFileLoggerABC.__init__(self, 'Message', config, time_format, env) | ||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_core.pipes' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_core.service' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,8 +1,13 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
|  | from cpl_core.logging import LoggerABC | ||||||
|  |  | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
|  | from cpl_translation import TranslatePipe | ||||||
|  | from discord.ext.commands import Context | ||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
|  | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
|  |  | ||||||
| @@ -11,16 +16,24 @@ class ClientUtilsService(ClientUtilsServiceABC): | |||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|  |             config: ConfigurationABC, | ||||||
|  |             logger: LoggerABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
|             servers: ServerRepositoryABC, |             servers: ServerRepositoryABC, | ||||||
|             clients: ClientRepositoryABC, |             clients: ClientRepositoryABC, | ||||||
|             db: DatabaseContextABC |             message_service: MessageServiceABC, | ||||||
|  |             db: DatabaseContextABC, | ||||||
|  |             t: TranslatePipe | ||||||
|     ): |     ): | ||||||
|         ClientUtilsServiceABC.__init__(self) |         ClientUtilsServiceABC.__init__(self) | ||||||
|  |         self._config = config | ||||||
|  |         self._logger = logger | ||||||
|         self._bot = bot |         self._bot = bot | ||||||
|         self._servers = servers |         self._servers = servers | ||||||
|         self._clients = clients |         self._clients = clients | ||||||
|  |         self._message_service = message_service | ||||||
|         self._db = db |         self._db = db | ||||||
|  |         self._t = t | ||||||
|  |  | ||||||
|     def received_command(self, guild_id: int): |     def received_command(self, guild_id: int): | ||||||
|         server = self._servers.get_server_by_discord_id(guild_id) |         server = self._servers.get_server_by_discord_id(guild_id) | ||||||
| @@ -40,3 +53,11 @@ class ClientUtilsService(ClientUtilsServiceABC): | |||||||
|         server = self._servers.get_server_by_discord_id(guild_id) |         server = self._servers.get_server_by_discord_id(guild_id) | ||||||
|         client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id) |         client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id) | ||||||
|         return client |         return client | ||||||
|  |  | ||||||
|  |     async def check_if_bot_is_ready_yet_and_respond(self, ctx: Context) -> bool: | ||||||
|  |         if self._config.get_configuration('IS_READY') == 'true': | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |         self._logger.debug(__name__, f'Bot is not ready yet {self._t.transform("common.errors.bot_not_ready_yet")}') | ||||||
|  |         await self._message_service.send_ctx_msg(ctx, self._t.transform('common.errors.bot_not_ready_yet'), without_tracking=True) | ||||||
|  |         return False | ||||||
|   | |||||||
| @@ -4,19 +4,20 @@ from typing import Union | |||||||
| import discord | import discord | ||||||
| from cpl_core.configuration.configuration_abc import ConfigurationABC | from cpl_core.configuration.configuration_abc import ConfigurationABC | ||||||
| from cpl_core.database.context.database_context_abc import DatabaseContextABC | from cpl_core.database.context.database_context_abc import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_query.extension import List | from cpl_query.extension import List | ||||||
| from discord.ext.commands import Context | from discord.ext.commands import Context | ||||||
|  |  | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
| from bot_core.configuration.server_settings import ServerSettings | from bot_core.configuration.server_settings import ServerSettings | ||||||
|  | from bot_core.helper.log_message_helper import LogMessageHelper | ||||||
|  | from bot_core.logging.message_logger import MessageLogger | ||||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||||
|  |  | ||||||
|  |  | ||||||
| class MessageService(MessageServiceABC): | class MessageService(MessageServiceABC): | ||||||
|  |  | ||||||
|     def __init__(self, config: ConfigurationABC, logger: LoggerABC, bot: DiscordBotServiceABC, clients: ClientRepositoryABC, db: DatabaseContextABC): |     def __init__(self, config: ConfigurationABC, logger: MessageLogger, bot: DiscordBotServiceABC, clients: ClientRepositoryABC, db: DatabaseContextABC): | ||||||
|         self._config = config |         self._config = config | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._bot = bot |         self._bot = bot | ||||||
| @@ -35,10 +36,11 @@ class MessageService(MessageServiceABC): | |||||||
|         server_st: ServerSettings = self._config.get_configuration(f'ServerSettings_{message.guild.id}') |         server_st: ServerSettings = self._config.get_configuration(f'ServerSettings_{message.guild.id}') | ||||||
|         if not mass_delete: |         if not mass_delete: | ||||||
|             await asyncio.sleep(server_st.message_delete_timer) |             await asyncio.sleep(server_st.message_delete_timer) | ||||||
|         self._logger.debug(__name__, f'Try to delete message:\n\t{message}\n\t{message.content}') |         self._logger.debug(__name__, f'Try to delete message: {LogMessageHelper.get_log_string(message)}') | ||||||
|         guild_id = message.guild.id |         guild_id = message.guild.id | ||||||
|         try: |         try: | ||||||
|             await message.delete() |             await message.delete() | ||||||
|  |             await asyncio.sleep(server_st.message_delete_timer) | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             self._logger.error(__name__, f'Deleting message failed', e) |             self._logger.error(__name__, f'Deleting message failed', e) | ||||||
|         else: |         else: | ||||||
| @@ -104,8 +106,7 @@ class MessageService(MessageServiceABC): | |||||||
|                 await asyncio.sleep(wait_before_delete) |                 await asyncio.sleep(wait_before_delete) | ||||||
|  |  | ||||||
|             if is_persistent: |             if is_persistent: | ||||||
|                 await self.delete_message(ctx.message, without_tracking) |  | ||||||
|                 return |                 return | ||||||
|  |  | ||||||
|             if ctx.guild is not None: |             if ctx.guild is not None: | ||||||
|                 await self.delete_messages(List(discord.Message, [msg, ctx.message]), ctx.guild.id) |                 await self.delete_message(msg, without_tracking) | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_data' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_data.abc' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
|     "Version": { |     "Version": { | ||||||
|       "Major": "1", |       "Major": "1", | ||||||
|       "Minor": "0", |       "Minor": "0", | ||||||
|       "Micro": "0.dev1" |       "Micro": "0" | ||||||
|     }, |     }, | ||||||
|     "Author": "Sven Heidemann", |     "Author": "Sven Heidemann", | ||||||
|     "AuthorEmail": "sven.heidemann@sh-edraft.de", |     "AuthorEmail": "sven.heidemann@sh-edraft.de", | ||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "MIT", |     "LicenseName": "MIT", | ||||||
|     "LicenseDescription": "MIT, see LICENSE for more details.", |     "LicenseDescription": "MIT, see LICENSE for more details.", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0" |       "cpl-core>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post1" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
| @@ -1,11 +1,12 @@ | |||||||
| from cpl_core.database import DatabaseSettings | from cpl_core.database import DatabaseSettings | ||||||
| from cpl_core.database.context import DatabaseContext | from cpl_core.database.context import DatabaseContext | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  |  | ||||||
|  |  | ||||||
| class DBContext(DatabaseContext): | class DBContext(DatabaseContext): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC): |     def __init__(self, logger: DatabaseLogger): | ||||||
|  |  | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|  |  | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_data.migration' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,12 +1,11 @@ | |||||||
| from cpl_core.logging import LoggerABC | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  |  | ||||||
| from bot_data.abc.migration_abc import MigrationABC | from bot_data.abc.migration_abc import MigrationABC | ||||||
| from bot_data.db_context import DBContext | from bot_data.db_context import DBContext | ||||||
|  |  | ||||||
|  |  | ||||||
| class InitialMigration(MigrationABC): | class InitialMigration(MigrationABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db: DBContext): |     def __init__(self, logger: DatabaseLogger, db: DBContext): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._db = db |         self._db = db | ||||||
|         self._cursor = db.cursor |         self._cursor = db.cursor | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_data.model' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'bot_data.service' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_query.extension import List | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
| from bot_data.model.client import Client | from bot_data.model.client import Client | ||||||
| @@ -10,7 +11,7 @@ from bot_data.model.client import Client | |||||||
|  |  | ||||||
| class ClientRepositoryService(ClientRepositoryABC): | class ClientRepositoryService(ClientRepositoryABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db_context: DatabaseContextABC, servers: ServerRepositoryABC): |     def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC, servers: ServerRepositoryABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._context = db_context |         self._context = db_context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,16 +1,17 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
| from cpl_core.database.context import DatabaseContextABC |  | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_query.extension import List |  | ||||||
| from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC |  | ||||||
|  |  | ||||||
|  | from cpl_core.database.context import DatabaseContextABC | ||||||
|  | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  | from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
| from bot_data.model.known_user import KnownUser | from bot_data.model.known_user import KnownUser | ||||||
|  |  | ||||||
|  |  | ||||||
| class KnownUserRepositoryService(KnownUserRepositoryABC): | class KnownUserRepositoryService(KnownUserRepositoryABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db_context: DatabaseContextABC, servers: ServerRepositoryABC): |     def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC, servers: ServerRepositoryABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._context = db_context |         self._context = db_context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,15 +2,15 @@ from typing import Type | |||||||
|  |  | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.dependency_injection import ServiceProviderABC | from cpl_core.dependency_injection import ServiceProviderABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from bot_data.abc.migration_abc import MigrationABC | from bot_data.abc.migration_abc import MigrationABC | ||||||
| from bot_data.model.migration_history import MigrationHistory | from bot_data.model.migration_history import MigrationHistory | ||||||
|  |  | ||||||
|  |  | ||||||
| class MigrationService: | class MigrationService: | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, services: ServiceProviderABC, db: DatabaseContextABC): |     def __init__(self, logger: DatabaseLogger, services: ServiceProviderABC, db: DatabaseContextABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._services = services |         self._services = services | ||||||
|          |          | ||||||
| @@ -31,11 +31,10 @@ class MigrationService: | |||||||
|                     # there is a table named "tableName" |                     # there is a table named "tableName" | ||||||
|                     self._logger.trace(__name__, f"Running SQL Command: {MigrationHistory.get_select_by_id_string(migration_id)}") |                     self._logger.trace(__name__, f"Running SQL Command: {MigrationHistory.get_select_by_id_string(migration_id)}") | ||||||
|                     migration_from_db = self._db.select(MigrationHistory.get_select_by_id_string(migration_id)) |                     migration_from_db = self._db.select(MigrationHistory.get_select_by_id_string(migration_id)) | ||||||
|                     self._logger.trace(__name__, str(migration_from_db)) |  | ||||||
|                     if migration_from_db is not None and len(migration_from_db) > 0: |                     if migration_from_db is not None and len(migration_from_db) > 0: | ||||||
|                         continue |                         continue | ||||||
|                  |                  | ||||||
|                 self._logger.debug(__name__, f"Running Migration {migration}") |                 self._logger.debug(__name__, f"Running Migration {migration_id}") | ||||||
|                 migration_as_service: MigrationABC = self._services.get_service(migration) |                 migration_as_service: MigrationABC = self._services.get_service(migration) | ||||||
|                 migration_as_service.upgrade() |                 migration_as_service.upgrade() | ||||||
|                 self._cursor.execute(MigrationHistory(migration_id).insert_string) |                 self._cursor.execute(MigrationHistory(migration_id).insert_string) | ||||||
|   | |||||||
| @@ -1,15 +1,16 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_query.extension import List | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
| from bot_data.model.server import Server | from bot_data.model.server import Server | ||||||
|  |  | ||||||
|  |  | ||||||
| class ServerRepositoryService(ServerRepositoryABC): | class ServerRepositoryService(ServerRepositoryABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db_context: DatabaseContextABC): |     def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._context = db_context |         self._context = db_context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,18 +1,18 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_query.extension import List | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from bot_data.abc.user_joined_server_repository_abc import \ | from bot_data.abc.user_joined_server_repository_abc import \ | ||||||
|     UserJoinedServerRepositoryABC |     UserJoinedServerRepositoryABC | ||||||
| from bot_data.abc.user_repository_abc import UserRepositoryABC | from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||||
| from bot_data.model.user import User |  | ||||||
| from bot_data.model.user_joined_server import UserJoinedServer | from bot_data.model.user_joined_server import UserJoinedServer | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserJoinedServerRepositoryService(UserJoinedServerRepositoryABC): | class UserJoinedServerRepositoryService(UserJoinedServerRepositoryABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db_context: DatabaseContextABC, users: UserRepositoryABC): |     def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC, users: UserRepositoryABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._context = db_context |         self._context = db_context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,17 +1,17 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC | from cpl_query.extension import List | ||||||
| from cpl_query.extension import List, IterableABC |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  | from bot_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC | ||||||
| from bot_data.abc.user_repository_abc import UserRepositoryABC | from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||||
| from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel | from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel | ||||||
|  |  | ||||||
| from bot_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserJoinedVoiceChannelRepositoryService(UserJoinedVoiceChannelRepositoryABC): | class UserJoinedVoiceChannelRepositoryService(UserJoinedVoiceChannelRepositoryABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db_context: DatabaseContextABC, users: UserRepositoryABC): |     def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC, users: UserRepositoryABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._context = db_context |         self._context = db_context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,9 @@ | |||||||
| from typing import Optional | from typing import Optional | ||||||
|  |  | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_query.extension import List | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
| from bot_data.abc.user_repository_abc import UserRepositoryABC | from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||||
| from bot_data.model.user import User | from bot_data.model.user import User | ||||||
| @@ -10,7 +11,7 @@ from bot_data.model.user import User | |||||||
|  |  | ||||||
| class UserRepositoryService(UserRepositoryABC): | class UserRepositoryService(UserRepositoryABC): | ||||||
|  |  | ||||||
|     def __init__(self, logger: LoggerABC, db_context: DatabaseContextABC, servers: ServerRepositoryABC): |     def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC, servers: ServerRepositoryABC): | ||||||
|         self._logger = logger |         self._logger = logger | ||||||
|         self._context = db_context |         self._context = db_context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.admin' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports:  | # imports:  | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "", |     "LicenseName": "", | ||||||
|     "LicenseDescription": "", |     "LicenseDescription": "", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post5" |       "cpl-core>=2022.10.0.post5" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								src/modules/admin/admin_module.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/modules/admin/admin_module.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  | from bot_core.abc.module_abc import ModuleABC | ||||||
|  | from modules.admin.command.restart_command import RestartCommand | ||||||
|  | from modules.admin.command.shutdown_command import ShutdownCommand | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class AdminModule(ModuleABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC): | ||||||
|  |         ModuleABC.__init__(self, dc, lambda x: x.admin_module) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def configure_services(self, service: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         # commands | ||||||
|  |         self._dc.add_command(RestartCommand) | ||||||
|  |         self._dc.add_command(ShutdownCommand) | ||||||
|  |         # events | ||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.admin.command' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,106 +0,0 @@ | |||||||
| import os |  | ||||||
| import shutil |  | ||||||
| import zipfile |  | ||||||
| from io import BytesIO |  | ||||||
|  |  | ||||||
| import requests |  | ||||||
| from cpl_core.configuration import ConfigurationABC |  | ||||||
| from cpl_core.environment import ApplicationEnvironmentABC |  | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC |  | ||||||
| from cpl_discord.service import DiscordBotServiceABC |  | ||||||
| from cpl_translation import TranslatePipe |  | ||||||
| from discord.ext import commands |  | ||||||
| from discord.ext.commands import Context |  | ||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC |  | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC |  | ||||||
| from bot_core.configuration.bot_settings import BotSettings |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class DeployCommand(DiscordCommandABC): |  | ||||||
|  |  | ||||||
|     def __init__( |  | ||||||
|             self, |  | ||||||
|             logger: LoggerABC, |  | ||||||
|             config: ConfigurationABC, |  | ||||||
|             message_service: MessageServiceABC, |  | ||||||
|             bot: DiscordBotServiceABC, |  | ||||||
|             client_utils: ClientUtilsServiceABC, |  | ||||||
|             translate: TranslatePipe, |  | ||||||
|             bot_settings: BotSettings, |  | ||||||
|             env: ApplicationEnvironmentABC |  | ||||||
|     ): |  | ||||||
|         DiscordCommandABC.__init__(self) |  | ||||||
|  |  | ||||||
|         self._logger = logger |  | ||||||
|         self._config = config |  | ||||||
|         self._message_service = message_service |  | ||||||
|         self._bot = bot |  | ||||||
|         self._client_utils = client_utils |  | ||||||
|         self._t = translate |  | ||||||
|         self._bot_settings = bot_settings |  | ||||||
|         self._env = env |  | ||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |  | ||||||
|  |  | ||||||
|     @commands.command() |  | ||||||
|     @commands.dm_only() |  | ||||||
|     async def deploy(self, ctx: Context, old_version: str): |  | ||||||
|         self._logger.debug(__name__, f'Received command deploy {ctx}') |  | ||||||
|  |  | ||||||
|         if ctx.author.id not in self._bot_settings.technicians: |  | ||||||
|             await self._message_service.send_ctx_msg(ctx, self._t.transform('common.no_permission_message')) |  | ||||||
|             self._logger.trace(__name__, f'Finished deploy command') |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         blacklist = ['venv', 'start', 'latest'] |  | ||||||
|  |  | ||||||
|         if old_version in blacklist: |  | ||||||
|             raise Exception(self._t.transform('common.errors.bad_argument')) |  | ||||||
|  |  | ||||||
|         if len(ctx.message.attachments) > 1: |  | ||||||
|             raise IndexError(self._t.transform('common.errors.too_many_arguments')) |  | ||||||
|  |  | ||||||
|         if len(ctx.message.attachments) < 1: |  | ||||||
|             raise IndexError(self._t.transform('common.errors.missing_required_argument')) |  | ||||||
|  |  | ||||||
|         try: |  | ||||||
|             attachment_url = ctx.message.attachments[0].url |  | ||||||
|             file_request = requests.get(attachment_url) |  | ||||||
|         except Exception as e: |  | ||||||
|             self._logger.error(__name__, f'An error occurred downloading the zip file', e) |  | ||||||
|             await self._message_service.send_ctx_msg(ctx, self._t.transform('common.command_error')) |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         try: |  | ||||||
|             self._logger.debug(__name__, f'Deploying files to {self._bot_settings.deploy_file_path}/latest') |  | ||||||
|             deploy_path = f'{self._bot_settings.deploy_file_path}/latest' |  | ||||||
|             deploy_old_path = f'{self._bot_settings.deploy_file_path}/{old_version}' |  | ||||||
|  |  | ||||||
|             if os.path.exists(deploy_path): |  | ||||||
|                 self._logger.debug(__name__, f'Moving files of {self._bot_settings.deploy_file_path}/latest to {self._bot_settings.deploy_file_path}/{old_version}') |  | ||||||
|                 shutil.move(deploy_path, deploy_old_path) |  | ||||||
|             os.makedirs(deploy_path) |  | ||||||
|  |  | ||||||
|             file = zipfile.ZipFile(BytesIO(file_request.content)) |  | ||||||
|             file.extractall(deploy_path) |  | ||||||
|         except Exception as e: |  | ||||||
|             self._logger.error(__name__, f'An error occurred extracting the zip file', e) |  | ||||||
|             await self._message_service.send_ctx_msg(ctx, self._t.transform('common.command_error'), without_tracking=True) |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         try: |  | ||||||
|             shutil.copy(f'{deploy_old_path}/bot/config/appsettings.{self._env.host_name}.json', f'{deploy_path}/bot/config/appsettings.{self._env.host_name}.json') |  | ||||||
|         except Exception as e: |  | ||||||
|             self._logger.error(__name__, f'An error occurred copying config file', e) |  | ||||||
|             await self._message_service.send_ctx_msg(ctx, self._t.transform('common.command_error'), without_tracking=True) |  | ||||||
|             return |  | ||||||
|  |  | ||||||
|         await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.admin.deploy_message'), without_tracking=True) |  | ||||||
|  |  | ||||||
|         self._config.add_configuration('IS_RESTART', 'true') |  | ||||||
|         await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.admin.restart_message'), without_tracking=True) |  | ||||||
|         await self._bot.stop_async() |  | ||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Finished deploy command') |  | ||||||
| @@ -1,5 +1,4 @@ | |||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| @@ -8,6 +7,7 @@ from discord.ext.commands import Context | |||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
| from modules.permission.abc.permission_service_abc import PermissionServiceABC | from modules.permission.abc.permission_service_abc import PermissionServiceABC | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -15,7 +15,7 @@ class RestartCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
| @@ -35,10 +35,13 @@ class RestartCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def restart(self, ctx: Context): |     async def restart(self, ctx: Context): | ||||||
|         self._logger.debug(__name__, f'Received command restart {ctx}') |         self._logger.debug(__name__, f'Received command restart {ctx}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|  |  | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|  |  | ||||||
|         if not self._permissions.is_member_moderator(ctx.author): |         if not self._permissions.is_member_moderator(ctx.author): | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| @@ -8,6 +7,7 @@ from discord.ext.commands import Context | |||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
| from modules.permission.abc.permission_service_abc import PermissionServiceABC | from modules.permission.abc.permission_service_abc import PermissionServiceABC | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -15,7 +15,7 @@ class ShutdownCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
| @@ -35,10 +35,13 @@ class ShutdownCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def shutdown(self, ctx: Context): |     async def shutdown(self, ctx: Context): | ||||||
|         self._logger.debug(__name__, f'Received command shutdown {ctx}') |         self._logger.debug(__name__, f'Received command shutdown {ctx}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|  |  | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|  |  | ||||||
|         if not self._permissions.is_member_moderator(ctx.author): |         if not self._permissions.is_member_moderator(ctx.author): | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.base' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.base.abc' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "", |     "LicenseName": "", | ||||||
|     "LicenseDescription": "", |     "LicenseDescription": "", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post2" |       "cpl-core>=2022.10.0.post2" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								src/modules/base/base_module.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/modules/base/base_module.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  | from bot_core.abc.module_abc import ModuleABC | ||||||
|  | from modules.base.command.afk_command import AFKCommand | ||||||
|  | from modules.base.command.help_command import HelpCommand | ||||||
|  | from modules.base.command.info_command import InfoCommand | ||||||
|  | from modules.base.command.ping_command import PingCommand | ||||||
|  | from modules.base.command.user_info_command import UserInfoCommand | ||||||
|  | from modules.base.events.base_on_command_error_event import BaseOnCommandErrorEvent | ||||||
|  | from modules.base.events.base_on_command_event import BaseOnCommandEvent | ||||||
|  | from modules.base.events.base_on_member_join_event import BaseOnMemberJoinEvent | ||||||
|  | from modules.base.events.base_on_member_remove_event import BaseOnMemberRemoveEvent | ||||||
|  | from modules.base.events.base_on_message_event import BaseOnMessageEvent | ||||||
|  | from modules.base.events.base_on_voice_state_update_event import BaseOnVoiceStateUpdateEvent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BaseModule(ModuleABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC): | ||||||
|  |         ModuleABC.__init__(self, dc, lambda x: x.base_module) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def configure_services(self, service: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         # commands | ||||||
|  |         self._dc.add_command(AFKCommand) | ||||||
|  |         self._dc.add_command(HelpCommand) | ||||||
|  |         self._dc.add_command(InfoCommand) | ||||||
|  |         self._dc.add_command(PingCommand) | ||||||
|  |         self._dc.add_command(UserInfoCommand) | ||||||
|  |         # events | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_command.value, BaseOnCommandEvent) | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_command_error.value, BaseOnCommandErrorEvent) | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberJoinEvent) | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberRemoveEvent) | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_message.value, BaseOnMessageEvent) | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_voice_state_update.value, BaseOnVoiceStateUpdateEvent) | ||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.base.command' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| @@ -9,6 +8,7 @@ from discord.ext.commands import Context | |||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
| from modules.base.configuration.base_server_settings import BaseServerSettings | from modules.base.configuration.base_server_settings import BaseServerSettings | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -16,7 +16,7 @@ class AFKCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
| @@ -34,10 +34,12 @@ class AFKCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def afk(self, ctx: Context): |     async def afk(self, ctx: Context): | ||||||
|         self._logger.debug(__name__, f'Received command afk {ctx}') |         self._logger.debug(__name__, f'Received command afk {ctx}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|         settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}') |         settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}') | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from discord.ext import commands | from discord.ext import commands | ||||||
| @@ -7,6 +6,7 @@ from discord.ext.commands import Context | |||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
| from modules.base.configuration.base_server_settings import BaseServerSettings | from modules.base.configuration.base_server_settings import BaseServerSettings | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -15,7 +15,7 @@ class HelpCommand(DiscordCommandABC): | |||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
|             client_utils: ClientUtilsServiceABC |             client_utils: ClientUtilsServiceABC | ||||||
| @@ -30,10 +30,12 @@ class HelpCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def help(self, ctx: Context, persistent_flag: str = None): |     async def help(self, ctx: Context, persistent_flag: str = None): | ||||||
|         self._logger.debug(__name__, f'Received command help {ctx}:{persistent_flag}') |         self._logger.debug(__name__, f'Received command help {ctx}:{persistent_flag}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|         settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}') |         settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}') | ||||||
|         is_persistent = persistent_flag == '--stay' |         is_persistent = persistent_flag == '--stay' | ||||||
|   | |||||||
| @@ -2,7 +2,6 @@ from datetime import datetime | |||||||
|  |  | ||||||
| import discord | import discord | ||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| @@ -12,6 +11,7 @@ from discord.ext.commands import Context | |||||||
| import bot | import bot | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
|  |  | ||||||
|  |  | ||||||
| class InfoCommand(DiscordCommandABC): | class InfoCommand(DiscordCommandABC): | ||||||
| @@ -19,7 +19,7 @@ class InfoCommand(DiscordCommandABC): | |||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
|             client_utils: ClientUtilsServiceABC, |             client_utils: ClientUtilsServiceABC, | ||||||
| @@ -36,10 +36,12 @@ class InfoCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def info(self, ctx: Context, *, wait: int = None): |     async def info(self, ctx: Context, *, wait: int = None): | ||||||
|         self._logger.debug(__name__, f'Received command info {ctx},{wait}') |         self._logger.debug(__name__, f'Received command info {ctx},{wait}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|         client = self._client_utils.get_client(self._bot.user.id, ctx.guild.id) |         client = self._client_utils.get_client(self._bot.user.id, ctx.guild.id) | ||||||
|  |  | ||||||
| @@ -58,7 +60,7 @@ class InfoCommand(DiscordCommandABC): | |||||||
|         embed.add_field(name=self._t.transform('modules.base.info.fields.deleted_message_count'), value=client.deleted_message_count, inline=False) |         embed.add_field(name=self._t.transform('modules.base.info.fields.deleted_message_count'), value=client.deleted_message_count, inline=False) | ||||||
|         embed.add_field(name=self._t.transform('modules.base.info.fields.received_command_count'), value=client.received_command_count) |         embed.add_field(name=self._t.transform('modules.base.info.fields.received_command_count'), value=client.received_command_count) | ||||||
|         embed.add_field(name=self._t.transform('modules.base.info.fields.moved_users_count'), value=client.moved_users_count) |         embed.add_field(name=self._t.transform('modules.base.info.fields.moved_users_count'), value=client.moved_users_count) | ||||||
|         modules = ['Base', 'BootLog', 'Database', 'Permission'] |         modules = ['Admin', 'Base', 'BootLog', 'Database', 'Moderator', 'Permission'] | ||||||
|         embed.add_field(name=self._t.transform('modules.base.info.fields.modules'), value='\n'.join(modules), inline=False) |         embed.add_field(name=self._t.transform('modules.base.info.fields.modules'), value='\n'.join(modules), inline=False) | ||||||
|  |  | ||||||
|         await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait) |         await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait) | ||||||
|   | |||||||
| @@ -1,4 +1,3 @@ | |||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| @@ -7,13 +6,14 @@ from discord.ext.commands import Context | |||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
|  |  | ||||||
|  |  | ||||||
| class PingCommand(DiscordCommandABC): | class PingCommand(DiscordCommandABC): | ||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
|             client_utils: ClientUtilsServiceABC, |             client_utils: ClientUtilsServiceABC, | ||||||
| @@ -29,10 +29,12 @@ class PingCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def ping(self, ctx: Context): |     async def ping(self, ctx: Context): | ||||||
|         self._logger.debug(__name__, f'Received command ping {ctx}') |         self._logger.debug(__name__, f'Received command ping {ctx}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|         await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.pong')) |         await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.pong')) | ||||||
|         self._logger.trace(__name__, f'Finished ping command') |         self._logger.trace(__name__, f'Finished ping command') | ||||||
|   | |||||||
| @@ -2,7 +2,6 @@ from typing import Optional | |||||||
|  |  | ||||||
| import discord | import discord | ||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| @@ -11,6 +10,7 @@ from discord.ext.commands import Context | |||||||
|  |  | ||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
| from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe | from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
| from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC | from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC | ||||||
| @@ -23,7 +23,7 @@ class UserInfoCommand(DiscordCommandABC): | |||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
|             client_utils: ClientUtilsServiceABC, |             client_utils: ClientUtilsServiceABC, | ||||||
| @@ -50,10 +50,12 @@ class UserInfoCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command(name='user-info') |     @commands.hybrid_command(name='user-info') | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def user_info(self, ctx: Context, member: Optional[discord.Member] = None, *, wait: int = None): |     async def user_info(self, ctx: Context, member: Optional[discord.Member] = None, *, wait: int = None): | ||||||
|         self._logger.debug(__name__, f'Received command user-info {ctx}:{member},{wait}') |         self._logger.debug(__name__, f'Received command user-info {ctx}:{member},{wait}') | ||||||
|  |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         self._client_utils.received_command(ctx.guild.id) | ||||||
|  |  | ||||||
|         if not self._permissions.is_member_moderator(ctx.author): |         if not self._permissions.is_member_moderator(ctx.author): | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.base.configuration' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ import traceback | |||||||
|  |  | ||||||
| from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC | from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC | ||||||
| from cpl_core.console import Console | from cpl_core.console import Console | ||||||
|  | from cpl_query.extension import List | ||||||
|  |  | ||||||
|  |  | ||||||
| class BaseServerSettings(ConfigurationModelABC): | class BaseServerSettings(ConfigurationModelABC): | ||||||
| @@ -13,7 +14,9 @@ class BaseServerSettings(ConfigurationModelABC): | |||||||
|         self._max_voice_state_hours: int = 0 |         self._max_voice_state_hours: int = 0 | ||||||
|         self._xp_per_message: int = 0 |         self._xp_per_message: int = 0 | ||||||
|         self._xp_per_ontime_hour: int = 0 |         self._xp_per_ontime_hour: int = 0 | ||||||
|         self._afk_channel_ids: list[int] = [] |         self._afk_channel_ids: List[int] = List(int) | ||||||
|  |         self._afk_command_channel_id: int = 0 | ||||||
|  |         self._help_command_reference_url: str = '' | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def id(self) -> int: |     def id(self) -> int: | ||||||
| @@ -32,7 +35,7 @@ class BaseServerSettings(ConfigurationModelABC): | |||||||
|         return self._xp_per_ontime_hour |         return self._xp_per_ontime_hour | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|     def afk_channel_ids(self) -> list[int]: |     def afk_channel_ids(self) -> List[int]: | ||||||
|         return self._afk_channel_ids |         return self._afk_channel_ids | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.base.events' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
							
								
								
									
										90
									
								
								src/modules/base/events/base_on_command_event.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								src/modules/base/events/base_on_command_event.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | from typing import Optional | ||||||
|  |  | ||||||
|  | import discord | ||||||
|  | from cpl_core.database.context import DatabaseContextABC | ||||||
|  | from cpl_core.time import TimeFormatSettings | ||||||
|  | from cpl_discord.events import OnCommandABC | ||||||
|  | from cpl_discord.service import DiscordBotServiceABC | ||||||
|  | from cpl_translation import TranslatePipe | ||||||
|  | from discord.ext.commands import Context | ||||||
|  |  | ||||||
|  | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
|  | from bot_core.configuration.bot_settings import BotSettings | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
|  | from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||||
|  | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
|  | from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||||
|  | from bot_data.model.user import User | ||||||
|  | from modules.base.abc.base_helper_abc import BaseHelperABC | ||||||
|  | from modules.base.configuration.base_server_settings import BaseServerSettings | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BaseOnCommandEvent(OnCommandABC): | ||||||
|  |  | ||||||
|  |     def __init__( | ||||||
|  |             self, | ||||||
|  |             logger: CommandLogger, | ||||||
|  |             bot: DiscordBotServiceABC, | ||||||
|  |             messenger: MessageServiceABC, | ||||||
|  |             bot_settings: BotSettings, | ||||||
|  |             time_format_settings: TimeFormatSettings, | ||||||
|  |             translate: TranslatePipe, | ||||||
|  |             bhs: BaseHelperABC, | ||||||
|  |             db: DatabaseContextABC, | ||||||
|  |             users: UserRepositoryABC, | ||||||
|  |             clients: ClientRepositoryABC, | ||||||
|  |             servers: ServerRepositoryABC, | ||||||
|  |     ): | ||||||
|  |         OnCommandABC.__init__(self) | ||||||
|  |         self._logger = logger | ||||||
|  |         self._bot = bot | ||||||
|  |         self._messenger = messenger | ||||||
|  |         self._bot_settings = bot_settings | ||||||
|  |         self._time_format_settings = time_format_settings | ||||||
|  |         self._t = translate | ||||||
|  |         self._base_helper = bhs | ||||||
|  |         self._db = db | ||||||
|  |         self._users = users | ||||||
|  |         self._clients = clients | ||||||
|  |         self._servers = servers | ||||||
|  |  | ||||||
|  |     def _append_received_message_count(self, g_id: int): | ||||||
|  |         try: | ||||||
|  |             self._clients.append_received_message_count(self._bot.user.id, g_id, 1) | ||||||
|  |             self._db.save_changes() | ||||||
|  |         except Exception as e: | ||||||
|  |             self._logger.error(__name__, f'Cannot edit client {self._bot.user.id}@{g_id}', e) | ||||||
|  |  | ||||||
|  |     def _handle_message_for_xp(self, message: discord.Message): | ||||||
|  |         dc_user_id = message.author.id | ||||||
|  |         try: | ||||||
|  |             server = self._servers.get_server_by_discord_id(message.guild.id) | ||||||
|  |         except Exception as e: | ||||||
|  |             self._logger.error(__name__, f'Cannot get server {message.guild.id}', e) | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         user: Optional[User] = None | ||||||
|  |         try: | ||||||
|  |             user = self._users.get_user_by_discord_id_and_server_id(dc_user_id, server.server_id) | ||||||
|  |         except Exception as e: | ||||||
|  |             self._logger.error(__name__, f'Cannot get user {dc_user_id}', e) | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         if user is None: | ||||||
|  |             self._logger.error(__name__, f'User not found {dc_user_id}') | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         settings: BaseServerSettings = self._base_helper.get_config(message.guild.id) | ||||||
|  |         old_xp = user.xp | ||||||
|  |         user.xp += settings.xp_per_message | ||||||
|  |         self._users.update_user(user) | ||||||
|  |         self._db.save_changes() | ||||||
|  |  | ||||||
|  |         self._logger.debug(__name__, f'User {user} sent message. xp: from {old_xp} to {user.xp}') | ||||||
|  |  | ||||||
|  |     async def on_command(self, ctx: Context): | ||||||
|  |         self._logger.debug(__name__, f'Module {type(self)} started') | ||||||
|  |         self._logger.info(__name__, f'Received command: {ctx.command} from {ctx.channel}') | ||||||
|  |         if ctx is None or ctx.guild is None: | ||||||
|  |             return | ||||||
|  |         self._append_received_message_count(ctx.guild.id) | ||||||
| @@ -2,10 +2,11 @@ from typing import Optional | |||||||
|  |  | ||||||
| import discord | import discord | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.events import OnMessageABC | from cpl_discord.events import OnMessageABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
|  |  | ||||||
|  | from bot_core.helper.log_message_helper import LogMessageHelper | ||||||
|  | from bot_core.logging.message_logger import MessageLogger | ||||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||||
| from bot_data.abc.user_repository_abc import UserRepositoryABC | from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||||
| @@ -18,7 +19,7 @@ class BaseOnMessageEvent(OnMessageABC): | |||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             logger: LoggerABC, |             logger: MessageLogger, | ||||||
|             bhs: BaseHelperABC, |             bhs: BaseHelperABC, | ||||||
|             db: DatabaseContextABC, |             db: DatabaseContextABC, | ||||||
|             bot: DiscordBotServiceABC, |             bot: DiscordBotServiceABC, | ||||||
| @@ -71,6 +72,7 @@ class BaseOnMessageEvent(OnMessageABC): | |||||||
|  |  | ||||||
|     async def on_message(self, message: discord.Message): |     async def on_message(self, message: discord.Message): | ||||||
|         self._logger.debug(__name__, f'Module {type(self)} started') |         self._logger.debug(__name__, f'Module {type(self)} started') | ||||||
|  |         self._logger.info(__name__, f'Received message: {LogMessageHelper.get_log_string(message)}') | ||||||
|         if message is None or message.guild is None: |         if message is None or message.guild is None: | ||||||
|             return |             return | ||||||
|         self._append_received_message_count(message.guild.id) |         self._append_received_message_count(message.guild.id) | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.base.service' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.boot_log' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports:  | # imports:  | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "", |     "LicenseName": "", | ||||||
|     "LicenseDescription": "", |     "LicenseDescription": "", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post2" |       "cpl-core>=2022.10.0.post2" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
| @@ -5,6 +5,8 @@ from cpl_core.configuration import ConfigurationABC | |||||||
| from cpl_core.dependency_injection import ServiceProviderABC | from cpl_core.dependency_injection import ServiceProviderABC | ||||||
| from cpl_core.logging import LoggerABC | from cpl_core.logging import LoggerABC | ||||||
|  |  | ||||||
|  | from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||||
|  |  | ||||||
|  |  | ||||||
| class BootLogExtension(ApplicationExtensionABC): | class BootLogExtension(ApplicationExtensionABC): | ||||||
|  |  | ||||||
| @@ -12,6 +14,9 @@ class BootLogExtension(ApplicationExtensionABC): | |||||||
|         pass |         pass | ||||||
|  |  | ||||||
|     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): |     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): | ||||||
|  |         feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings) | ||||||
|  |         if not feature_flags.boot_log_module: | ||||||
|  |             return | ||||||
|         logger: LoggerABC = services.get_service(LoggerABC) |         logger: LoggerABC = services.get_service(LoggerABC) | ||||||
|         logger.debug(__name__, 'BootLog extension started') |         logger.debug(__name__, 'BootLog extension started') | ||||||
|         config.add_configuration('Bot_StartTime', str(datetime.now())) |         config.add_configuration('Bot_StartTime', str(datetime.now())) | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/modules/boot_log/boot_log_module.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/modules/boot_log/boot_log_module.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  | from bot_core.abc.module_abc import ModuleABC | ||||||
|  | from modules.boot_log.boot_log_on_ready_event import BootLogOnReadyEvent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class BootLogModule(ModuleABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC): | ||||||
|  |         ModuleABC.__init__(self, dc, lambda x: x.boot_log_module) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def configure_services(self, service: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         # commands | ||||||
|  |         # events | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_ready.value, BootLogOnReadyEvent) | ||||||
| @@ -42,12 +42,12 @@ class BootLogOnReadyEvent(OnReadyABC): | |||||||
|             # print warning if initialisation took too long |             # print warning if initialisation took too long | ||||||
|             if init_time >= 30: |             if init_time >= 30: | ||||||
|                 self._logger.warn( |                 self._logger.warn( | ||||||
|                     __name__, 'It takes long time to start the bot!') |                     __name__, 'It takes too long to start the bot!') | ||||||
|  |  | ||||||
|             # print error if initialisation took way too long |             # print error if initialisation took way too long | ||||||
|             elif init_time >= 90: |             elif init_time >= 90: | ||||||
|                 self._logger.error( |                 self._logger.error( | ||||||
|                     __name__, 'It takes very long time to start the bot!!!') |                     __name__, 'It takes far too long to start the bot!!!') | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             self._logger.error(__name__, 'Init time calculation failed', e) |             self._logger.error(__name__, 'Init time calculation failed', e) | ||||||
|             return |             return | ||||||
| @@ -72,6 +72,7 @@ class BootLogOnReadyEvent(OnReadyABC): | |||||||
|                 ), |                 ), | ||||||
|                 self._t.transform('modules.boot_log.login_message').format(init_time) |                 self._t.transform('modules.boot_log.login_message').format(init_time) | ||||||
|             ) |             ) | ||||||
|             self._logger.info(__name__, 'Bot is ready') |  | ||||||
|  |  | ||||||
|  |         self._config.add_configuration('IS_READY', 'true') | ||||||
|  |         self._logger.info(__name__, 'Bot is ready') | ||||||
|         self._logger.trace(__name__, f'Module {type(self)} stopped') |         self._logger.trace(__name__, f'Module {type(self)} stopped') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.boot_log.configuration' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.database' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports:  | # imports:  | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "MIT", |     "LicenseName": "MIT", | ||||||
|     "LicenseDescription": "MIT, see LICENSE for more details.", |     "LicenseDescription": "MIT, see LICENSE for more details.", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post2" |       "cpl-core>=2022.10.0.post2" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
| @@ -5,6 +5,8 @@ from cpl_core.configuration import ConfigurationABC | |||||||
| from cpl_core.dependency_injection import ServiceProviderABC | from cpl_core.dependency_injection import ServiceProviderABC | ||||||
| from cpl_core.logging import LoggerABC | from cpl_core.logging import LoggerABC | ||||||
|  |  | ||||||
|  | from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
| from bot_data.service.migration_service import MigrationService | from bot_data.service.migration_service import MigrationService | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -14,7 +16,10 @@ class DatabaseExtension(ApplicationExtensionABC): | |||||||
|         pass |         pass | ||||||
|  |  | ||||||
|     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): |     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): | ||||||
|         logger: LoggerABC = services.get_service(LoggerABC) |         feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings) | ||||||
|  |         if not feature_flags.database_module: | ||||||
|  |             return | ||||||
|  |         logger: LoggerABC = services.get_service(DatabaseLogger) | ||||||
|         logger.debug(__name__, 'Database extension started') |         logger.debug(__name__, 'Database extension started') | ||||||
|         config.add_configuration('Database_StartTime', str(datetime.now())) |         config.add_configuration('Database_StartTime', str(datetime.now())) | ||||||
|         migrations: MigrationService = services.get_service(MigrationService) |         migrations: MigrationService = services.get_service(MigrationService) | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/modules/database/database_module.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/modules/database/database_module.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  | from bot_core.abc.module_abc import ModuleABC | ||||||
|  | from modules.database.database_on_ready_event import DatabaseOnReadyEvent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DatabaseModule(ModuleABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC): | ||||||
|  |         ModuleABC.__init__(self, dc, lambda x: x.database_module) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def configure_services(self, service: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         # commands | ||||||
|  |         # events | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_ready.value, DatabaseOnReadyEvent) | ||||||
| @@ -4,10 +4,11 @@ from datetime import datetime, timedelta | |||||||
| import discord | import discord | ||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.database.context import DatabaseContextABC | from cpl_core.database.context import DatabaseContextABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.events import OnReadyABC | from cpl_discord.events import OnReadyABC | ||||||
| from cpl_discord.service import DiscordBotServiceABC | from cpl_discord.service import DiscordBotServiceABC | ||||||
|  |  | ||||||
|  | from bot_core.logging.database_logger import DatabaseLogger | ||||||
|  | from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe | ||||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||||
| from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC | from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC | ||||||
| from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC | from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC | ||||||
| @@ -20,6 +21,7 @@ from bot_data.model.user import User | |||||||
| from bot_data.model.user_joined_server import UserJoinedServer | from bot_data.model.user_joined_server import UserJoinedServer | ||||||
| from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel | from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel | ||||||
| from bot_data.service.user_repository_service import ServerRepositoryABC | from bot_data.service.user_repository_service import ServerRepositoryABC | ||||||
|  | from modules.base.configuration.base_server_settings import BaseServerSettings | ||||||
|  |  | ||||||
|  |  | ||||||
| class DatabaseOnReadyEvent(OnReadyABC): | class DatabaseOnReadyEvent(OnReadyABC): | ||||||
| @@ -27,7 +29,7 @@ class DatabaseOnReadyEvent(OnReadyABC): | |||||||
|     def __init__( |     def __init__( | ||||||
|         self, |         self, | ||||||
|         config: ConfigurationABC, |         config: ConfigurationABC, | ||||||
|         logger: LoggerABC, |         logger: DatabaseLogger, | ||||||
|         bot: DiscordBotServiceABC, |         bot: DiscordBotServiceABC, | ||||||
|         db_context: DatabaseContextABC, |         db_context: DatabaseContextABC, | ||||||
|         server_repo: ServerRepositoryABC, |         server_repo: ServerRepositoryABC, | ||||||
| @@ -35,7 +37,8 @@ class DatabaseOnReadyEvent(OnReadyABC): | |||||||
|         client_repo: ClientRepositoryABC, |         client_repo: ClientRepositoryABC, | ||||||
|         known_users: KnownUserRepositoryABC, |         known_users: KnownUserRepositoryABC, | ||||||
|         user_joins: UserJoinedServerRepositoryABC, |         user_joins: UserJoinedServerRepositoryABC, | ||||||
|         user_joins_vc: UserJoinedVoiceChannelRepositoryABC |         user_joins_vc: UserJoinedVoiceChannelRepositoryABC, | ||||||
|  |         dtp: DateTimeOffsetPipe | ||||||
|     ): |     ): | ||||||
|         self._config = config |         self._config = config | ||||||
|  |  | ||||||
| @@ -48,6 +51,7 @@ class DatabaseOnReadyEvent(OnReadyABC): | |||||||
|         self._known_users = known_users |         self._known_users = known_users | ||||||
|         self._user_joins = user_joins |         self._user_joins = user_joins | ||||||
|         self._user_joins_vc = user_joins_vc |         self._user_joins_vc = user_joins_vc | ||||||
|  |         self._dtp = dtp | ||||||
|  |  | ||||||
|         OnReadyABC.__init__(self) |         OnReadyABC.__init__(self) | ||||||
|         self._logger.info(__name__, f'Module {type(self)} loaded') |         self._logger.info(__name__, f'Module {type(self)} loaded') | ||||||
| @@ -61,12 +65,12 @@ class DatabaseOnReadyEvent(OnReadyABC): | |||||||
|             # print warning if initialisation took too long |             # print warning if initialisation took too long | ||||||
|             if init_time >= 30: |             if init_time >= 30: | ||||||
|                 self._logger.warn( |                 self._logger.warn( | ||||||
|                     __name__, 'It takes long time to start the bot!') |                     __name__, 'It takes too long to prepare the database!') | ||||||
|  |  | ||||||
|             # print error if initialisation took way too long |             # print error if initialisation took way too long | ||||||
|             elif init_time >= 90: |             elif init_time >= 90: | ||||||
|                 self._logger.error( |                 self._logger.error( | ||||||
|                     __name__, 'It takes very long time to start the bot!!!') |                     __name__, 'It takes far too long to prepare the database!!!') | ||||||
|         except Exception as e:  # |         except Exception as e:  # | ||||||
|             self._logger.error(__name__, 'Database init time calculation failed', e) |             self._logger.error(__name__, 'Database init time calculation failed', e) | ||||||
|             return |             return | ||||||
| @@ -213,7 +217,7 @@ class DatabaseOnReadyEvent(OnReadyABC): | |||||||
|                     m: discord.Member = u |                     m: discord.Member = u | ||||||
|                     self._logger.warn(__name__, f'Active UserJoinedServer not found in database: {guild.id}:{u.id}@{m.joined_at}') |                     self._logger.warn(__name__, f'Active UserJoinedServer not found in database: {guild.id}:{u.id}@{m.joined_at}') | ||||||
|                     self._logger.debug(__name__, f'Add UserJoinedServer: {guild.id}:{u.id}@{m.joined_at}') |                     self._logger.debug(__name__, f'Add UserJoinedServer: {guild.id}:{u.id}@{m.joined_at}') | ||||||
|                     self._user_joins.add_user_joined_server(UserJoinedServer(user, m.joined_at, None)) |                     self._user_joins.add_user_joined_server(UserJoinedServer(user, self._dtp.transform(m.joined_at), None)) | ||||||
|                     self._db_context.save_changes() |                     self._db_context.save_changes() | ||||||
|  |  | ||||||
|                     self._logger.debug(__name__, f'Added UserJoinedServer: {u.id}') |                     self._logger.debug(__name__, f'Added UserJoinedServer: {u.id}') | ||||||
| @@ -267,7 +271,7 @@ class DatabaseOnReadyEvent(OnReadyABC): | |||||||
|                     for join in joins: |                     for join in joins: | ||||||
|                         self._logger.warn(__name__, f'Active UserJoinedVoiceChannel found in database: {guild.id}:{member.id}@{join.joined_on}') |                         self._logger.warn(__name__, f'Active UserJoinedVoiceChannel found in database: {guild.id}:{member.id}@{join.joined_on}') | ||||||
|                         join.leaved_on = datetime.now() |                         join.leaved_on = datetime.now() | ||||||
|                         settings: BaseSettings = self._config.get_configuration(f'BaseServerSettings_{guild.id}') |                         settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{guild.id}') | ||||||
|  |  | ||||||
|                         if ((join.leaved_on - join.joined_on).total_seconds() / 60 / 60) > settings.max_voice_state_hours: |                         if ((join.leaved_on - join.joined_on).total_seconds() / 60 / 60) > settings.max_voice_state_hours: | ||||||
|                             join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours) |                             join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours) | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.moderator' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports:  | # imports:  | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.moderator.command' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| import asyncio | import asyncio | ||||||
|  |  | ||||||
| from cpl_core.configuration import ConfigurationABC | from cpl_core.configuration import ConfigurationABC | ||||||
| from cpl_core.logging import LoggerABC |  | ||||||
| from cpl_discord.command import DiscordCommandABC | from cpl_discord.command import DiscordCommandABC | ||||||
| from cpl_translation import TranslatePipe | from cpl_translation import TranslatePipe | ||||||
| from discord.ext import commands | from discord.ext import commands | ||||||
| @@ -10,6 +9,7 @@ from discord.ext.commands import Context | |||||||
| from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC | ||||||
| from bot_core.abc.message_service_abc import MessageServiceABC | from bot_core.abc.message_service_abc import MessageServiceABC | ||||||
| from bot_core.configuration.server_settings import ServerSettings | from bot_core.configuration.server_settings import ServerSettings | ||||||
|  | from bot_core.logging.command_logger import CommandLogger | ||||||
| from modules.permission.abc.permission_service_abc import PermissionServiceABC | from modules.permission.abc.permission_service_abc import PermissionServiceABC | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -17,7 +17,7 @@ class PurgeCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|     def __init__( |     def __init__( | ||||||
|             self, |             self, | ||||||
|             logger: LoggerABC, |             logger: CommandLogger, | ||||||
|             config: ConfigurationABC, |             config: ConfigurationABC, | ||||||
|             message_service: MessageServiceABC, |             message_service: MessageServiceABC, | ||||||
|             permissions: PermissionServiceABC, |             permissions: PermissionServiceABC, | ||||||
| @@ -35,12 +35,14 @@ class PurgeCommand(DiscordCommandABC): | |||||||
|  |  | ||||||
|         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') |         self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') | ||||||
|  |  | ||||||
|     @commands.command() |     @commands.hybrid_command() | ||||||
|     @commands.guild_only() |     @commands.guild_only() | ||||||
|     async def purge(self, ctx: Context): |     async def purge(self, ctx: Context): | ||||||
|         self._logger.debug(__name__, f'Received command purge {ctx}') |         self._logger.debug(__name__, f'Received command purge {ctx}') | ||||||
|         self._client_utils.received_command(ctx.guild.id) |         if not await self._client_utils.check_if_bot_is_ready_yet_and_respond(ctx): | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         self._client_utils.received_command(ctx.guild.id) | ||||||
|         server_settings: ServerSettings = self._config.get_configuration(f'ServerSettings_{ctx.guild.id}') |         server_settings: ServerSettings = self._config.get_configuration(f'ServerSettings_{ctx.guild.id}') | ||||||
|  |  | ||||||
|         if not self._permissions.is_member_moderator(ctx.author): |         if not self._permissions.is_member_moderator(ctx.author): | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "", |     "LicenseName": "", | ||||||
|     "LicenseDescription": "", |     "LicenseDescription": "", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post5" |       "cpl-core>=2022.10.0.post5" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								src/modules/moderator/moderator_module.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/modules/moderator/moderator_module.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  | from bot_core.abc.module_abc import ModuleABC | ||||||
|  | from modules.moderator.command.purge_command import PurgeCommand | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ModeratorModule(ModuleABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC): | ||||||
|  |         ModuleABC.__init__(self, dc, lambda x: x.moderator_module) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def configure_services(self, service: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         # commands | ||||||
|  |         self._dc.add_command(PurgeCommand) | ||||||
|  |         # events | ||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.permission' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports:  | # imports:  | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.permission.abc' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.permission.configuration' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.permission.events' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports: | # imports: | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -16,10 +16,10 @@ | |||||||
|     "LicenseName": "", |     "LicenseName": "", | ||||||
|     "LicenseDescription": "", |     "LicenseDescription": "", | ||||||
|     "Dependencies": [ |     "Dependencies": [ | ||||||
|       "cpl-core>=2022.7.0.post2" |       "cpl-core>=2022.10.0.post2" | ||||||
|     ], |     ], | ||||||
|     "DevDependencies": [ |     "DevDependencies": [ | ||||||
|       "cpl-cli>=2022.7.0.post2" |       "cpl-cli>=2022.10.0" | ||||||
|     ], |     ], | ||||||
|     "PythonVersion": ">=3.10.4", |     "PythonVersion": ">=3.10.4", | ||||||
|     "PythonPath": { |     "PythonPath": { | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								src/modules/permission/permission_module.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/modules/permission/permission_module.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | from cpl_core.configuration import ConfigurationABC | ||||||
|  | from cpl_core.dependency_injection import ServiceCollectionABC | ||||||
|  | from cpl_core.environment import ApplicationEnvironmentABC | ||||||
|  | from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | ||||||
|  | from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||||
|  |  | ||||||
|  | from bot_core.abc.module_abc import ModuleABC | ||||||
|  | from modules.permission.events.permission_on_member_update_event import PermissionOnMemberUpdateEvent | ||||||
|  | from modules.permission.events.permission_on_ready_event import PermissionOnReadyEvent | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class PermissionModule(ModuleABC): | ||||||
|  |  | ||||||
|  |     def __init__(self, dc: DiscordCollectionABC): | ||||||
|  |         ModuleABC.__init__(self, dc, lambda x: x.permission_module) | ||||||
|  |  | ||||||
|  |     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     def configure_services(self, service: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||||
|  |         # commands | ||||||
|  |         # events | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_ready.value, PermissionOnReadyEvent) | ||||||
|  |         self._dc.add_event(DiscordEventTypesEnum.on_member_update.value, PermissionOnMemberUpdateEvent) | ||||||
| @@ -15,7 +15,7 @@ __title__ = 'modules.permission.service' | |||||||
| __author__ = 'Sven Heidemann' | __author__ = 'Sven Heidemann' | ||||||
| __license__ = 'MIT' | __license__ = 'MIT' | ||||||
| __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | __copyright__ = 'Copyright (c) 2022 sh-edraft.de' | ||||||
| __version__ = '1.0.0.dev3' | __version__ = '0.2.0' | ||||||
|  |  | ||||||
| from collections import namedtuple | from collections import namedtuple | ||||||
|  |  | ||||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | |||||||
| # imports | # imports | ||||||
|  |  | ||||||
| VersionInfo = namedtuple('VersionInfo', 'major minor micro') | VersionInfo = namedtuple('VersionInfo', 'major minor micro') | ||||||
| version_info = VersionInfo(major='1', minor='0', micro='0.dev3') | version_info = VersionInfo(major='0', minor='2', micro='0') | ||||||
|   | |||||||
| @@ -106,7 +106,7 @@ class PermissionService(PermissionServiceABC): | |||||||
|         return self._moderators[g_id] |         return self._moderators[g_id] | ||||||
|  |  | ||||||
|     def is_member_admin(self, member: discord.Member) -> bool: |     def is_member_admin(self, member: discord.Member) -> bool: | ||||||
|         return member in self._admins[member.guild.id] |         return member.guild.id in self._admins and member in self._admins[member.guild.id] | ||||||
|  |  | ||||||
|     def is_member_moderator(self, member: discord.Member) -> bool: |     def is_member_moderator(self, member: discord.Member) -> bool: | ||||||
|         return member in self._moderators[member.guild.id] or self.is_member_admin(member) |         return member.guild.id in self._moderators and member in self._moderators[member.guild.id] or self.is_member_admin(member) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user