Improved database connection
This commit is contained in:
		
							
								
								
									
										1
									
								
								src/modules/database/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/modules/database/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| # imports:  | ||||
							
								
								
									
										43
									
								
								src/modules/database/database.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/modules/database/database.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| { | ||||
|   "ProjectSettings": { | ||||
|     "Name": "modules/database", | ||||
|     "Version": { | ||||
|       "Major": "0", | ||||
|       "Minor": "0", | ||||
|       "Micro": "0" | ||||
|     }, | ||||
|     "Author": "", | ||||
|     "AuthorEmail": "", | ||||
|     "Description": "", | ||||
|     "LongDescription": "", | ||||
|     "URL": "", | ||||
|     "CopyrightDate": "", | ||||
|     "CopyrightName": "", | ||||
|     "LicenseName": "", | ||||
|     "LicenseDescription": "", | ||||
|     "Dependencies": [ | ||||
|       "sh_cpl-core>=2021.11.0.post1" | ||||
|     ], | ||||
|     "PythonVersion": ">=3.9.2", | ||||
|     "PythonPath": { | ||||
|       "linux": "" | ||||
|     }, | ||||
|     "Classifiers": [] | ||||
|   }, | ||||
|   "BuildSettings": { | ||||
|     "ProjectType": "library", | ||||
|     "SourcePath": "", | ||||
|     "OutputPath": "../../dist", | ||||
|     "Main": "modules/database.main", | ||||
|     "EntryPoint": "modules/database", | ||||
|     "IncludePackageData": false, | ||||
|     "Included": [], | ||||
|     "Excluded": [ | ||||
|       "*/__pycache__", | ||||
|       "*/logs", | ||||
|       "*/tests" | ||||
|     ], | ||||
|     "PackageData": {}, | ||||
|     "ProjectReferences": [] | ||||
|   } | ||||
| } | ||||
							
								
								
									
										120
									
								
								src/modules/database/database.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/modules/database/database.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| import asyncio | ||||
| from datetime import datetime | ||||
| import time | ||||
|  | ||||
| import discord | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.database.context import DatabaseContextABC | ||||
| from cpl_core.logging import LoggerABC | ||||
|  | ||||
| from gismo_core.abc.bot_service_abc import BotServiceABC | ||||
| from gismo_core.abc.message_service_abc import MessageServiceABC | ||||
| from gismo_core.configuration.server_settings import ServerSettings | ||||
| from gismo_data.abc.user_repository_abc import UserRepositoryABC | ||||
| from gismo_data.model.server import Server | ||||
| from gismo_data.model.user import User | ||||
| from gismo_data.service.user_repository_service import ServerRepositoryABC | ||||
| from modules_core.abc.events.on_ready_abc import OnReadyABC | ||||
| from modules_core.abc.module_abc import ModuleABC | ||||
|  | ||||
|  | ||||
| class Database(ModuleABC, OnReadyABC): | ||||
|  | ||||
|     def __init__( | ||||
|         self, | ||||
|         config: ConfigurationABC, | ||||
|         logger: LoggerABC, | ||||
|         bot: BotServiceABC, | ||||
|         db_context: DatabaseContextABC, | ||||
|         server_repo: ServerRepositoryABC, | ||||
|         user_repo: UserRepositoryABC | ||||
|     ): | ||||
|         self._config = config | ||||
|  | ||||
|         self._logger = logger | ||||
|         self._bot = bot | ||||
|         self._db_context = db_context | ||||
|         self._servers = server_repo | ||||
|         self._users = user_repo | ||||
|          | ||||
|         ModuleABC.__init__(self) | ||||
|         self._priorities[OnReadyABC] = 0 | ||||
|         self._logger.trace(__name__, f'Module {type(self)} loaded') | ||||
|      | ||||
|     def _validate_init_time(self): | ||||
|         try: | ||||
|             start_time = self._config.get_configuration('Database_StartTime') | ||||
|             init_time = round((datetime.now() - start_time).total_seconds(), 2) | ||||
|             self._config.add_configuration('Database_InitTime', init_time) | ||||
|             self._logger.debug(__name__, f'Database Init time:  {init_time}s') | ||||
|             # print warning if initialisation took too long | ||||
|             if init_time >= 30: | ||||
|                 self._logger.warn( | ||||
|                     __name__, 'It takes long time to start the bot!') | ||||
|  | ||||
|             # print error if initialisation took way too long | ||||
|             elif init_time >= 90: | ||||
|                 self._logger.error( | ||||
|                     __name__, 'It takes very long time to start the bot!!!') | ||||
|         except Exception as e:# | ||||
|             self._logger.error(__name__, 'Database init time calculation failed', e) | ||||
|             return | ||||
|      | ||||
|     def _check_servers(self): | ||||
|         for g in self._bot.guilds: | ||||
|             g: discord.Guild = g | ||||
|             try: | ||||
|                 server = self._servers.find_server_by_discord_id(g.id) | ||||
|                 if server is not None: | ||||
|                     return | ||||
|                  | ||||
|                 self._logger.warn(__name__, f'Server not found in database: {g.id}') | ||||
|                 self._logger.debug(__name__, f'Add server: {g.id}') | ||||
|                 self._servers.add_server(Server(g.id)) | ||||
|                 self._db_context.save_changes() | ||||
|                  | ||||
|                 self._logger.debug(__name__, f'Added server: {g.id}') | ||||
|             except Exception as e: | ||||
|                 self._logger.error(__name__, f'Cannot get server', e) | ||||
|                  | ||||
|         results = self._servers.get_servers() | ||||
|         if results is None or len(results) == 0: | ||||
|             self._logger.error(__name__, f'Table Servers is empty!') | ||||
|          | ||||
|     def _check_users(self): | ||||
|         for g in self._bot.guilds: | ||||
|             g: discord.Guild = g | ||||
|              | ||||
|             try: | ||||
|                 server = self._servers.find_server_by_discord_id(g.id) | ||||
|                 if server is None: | ||||
|                     self._logger.fatal(__name__, f'Server not found in database: {g.id}') | ||||
|                     break | ||||
|                      | ||||
|                 for u in g.members: | ||||
|                     u: discord.Member = u | ||||
|                     user = self._users.find_user_by_discord_id(u.id) | ||||
|                     if user is not None: | ||||
|                         break | ||||
|                      | ||||
|                     self._logger.warn(__name__, f'User not found in database: {u.id}') | ||||
|                     self._logger.debug(__name__, f'Add user: {u.id}') | ||||
|                     self._users.add_user(User(u.id, 0, server)) | ||||
|                     self._db_context.save_changes() | ||||
|                      | ||||
|                     self._logger.debug(__name__, f'Added User: {u.id}') | ||||
|             except Exception as e: | ||||
|                 self._logger.error(__name__, f'Cannot get User', e) | ||||
|                      | ||||
|             results = self._users.get_users() | ||||
|             if results is None or len(results) == 0: | ||||
|                 self._logger.error(__name__, f'Table Users is empty!') | ||||
|      | ||||
|     async def on_ready(self): | ||||
|         self._logger.debug(__name__, f'Module {type(self)} started') | ||||
|          | ||||
|         self._check_servers() | ||||
|         self._check_users() | ||||
|          | ||||
|         self._validate_init_time() | ||||
|         self._logger.trace(__name__, f'Module {type(self)} stopped') | ||||
							
								
								
									
										17
									
								
								src/modules/database/database_extension.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/modules/database/database_extension.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| from datetime import datetime | ||||
|  | ||||
| from cpl_core.application.application_extension_abc import ApplicationExtensionABC | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.dependency_injection import ServiceProviderABC | ||||
| from cpl_core.logging import LoggerABC | ||||
|  | ||||
|  | ||||
| class DatabaseExtension(ApplicationExtensionABC): | ||||
|  | ||||
|     def __init__(self): | ||||
|         pass | ||||
|  | ||||
|     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): | ||||
|         logger: LoggerABC = services.get_service(LoggerABC) | ||||
|         logger.debug(__name__, 'Database extension started') | ||||
|         config.add_configuration('Database_StartTime', datetime.now()) | ||||
		Reference in New Issue
	
	Block a user