import os from datetime import datetime from typing import Optional from cpl_core.application import StartupABC from cpl_core.configuration import ConfigurationABC from cpl_core.database import DatabaseSettings from cpl_core.dependency_injection import ServiceCollectionABC, ServiceProviderABC from cpl_core.environment import ApplicationEnvironment from cpl_core.logging import LoggerABC from gismo_core.abc.bot_service_abc import BotServiceABC from gismo_core.abc.client_utils_service_abc import ClientUtilsServiceABC from gismo_core.abc.command_abc import CommandABC from gismo_core.abc.message_service_abc import MessageServiceABC from gismo_core.service.bot_service import BotService from gismo_core.service.client_utils_service import ClientUtilsService from gismo_core.service.message_service import MessageService from gismo_data.abc.known_user_repository_abc import KnownUserRepositoryABC from gismo_data.abc.migration_abc import MigrationABC from gismo_data.abc.server_repository_abc import ServerRepositoryABC from gismo_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC from gismo_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC from gismo_data.abc.user_repository_abc import UserRepositoryABC from gismo_data.db_context import DBContext from gismo_data.migration.initial_migration import InitialMigration from gismo_data.migration.migration_0_3 import Migration_0_3 from gismo_data.migration.migration_0_3_1 import Migration_0_3_1 from gismo_data.service.client_repository_service import ( ClientRepositoryABC, ClientRepositoryService) from gismo_data.service.known_user_repository_service import \ KnownUserRepositoryService from gismo_data.service.migration_service import MigrationService from gismo_data.service.server_repository_service import \ ServerRepositoryService from gismo_data.service.user_joined_server_repository_service import UserJoinedServerRepositoryService from gismo_data.service.user_joined_voice_channel_service import UserJoinedVoiceChannelRepositoryService from gismo_data.service.user_repository_service import UserRepositoryService from modules.base.base import Base from modules.base.service.afk_command_service import AFKCommandService from modules.base.service.help_command_service import HelpCommandService from modules.base.service.ping_command_service import PingCommandService from modules.base.service.purge_command_service import PurgeCommandService from modules.boot_log.boot_log import BootLog from modules.database.database import Database from modules.permission.abc.permission_service_abc import PermissionServiceABC from modules.permission.permission import Permission from gismo_core.abc.module_abc import ModuleABC from gismo_core.abc.module_service_abc import ModuleServiceABC from gismo_core.service.module_service import ModuleService from modules.permission.service.permission_service import PermissionService class Startup(StartupABC): def __init__(self): StartupABC.__init__(self) self._start_time = datetime.now() self._config: Optional[ConfigurationABC] = None async def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC: environment.set_working_directory(os.path.dirname(os.path.realpath(__file__))) configuration.add_environment_variables('GISMO_') 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 return configuration async def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC: provider: ServiceProviderABC = services.build_service_provider() services.add_logging() services.add_db_context(DBContext, self._config.get_configuration(DatabaseSettings)) # general services services.add_singleton(ModuleServiceABC, ModuleService) services.add_singleton(BotServiceABC, BotService) services.add_transient(MessageServiceABC, MessageService) services.add_transient(MigrationService) services.add_transient(ClientUtilsServiceABC, ClientUtilsService) # data services services.add_transient(ServerRepositoryABC, ServerRepositoryService) services.add_transient(UserRepositoryABC, UserRepositoryService) services.add_transient(ClientRepositoryABC, ClientRepositoryService) services.add_transient(KnownUserRepositoryABC, KnownUserRepositoryService) services.add_transient(UserJoinedServerRepositoryABC, UserJoinedServerRepositoryService) services.add_transient(UserJoinedVoiceChannelRepositoryABC, UserJoinedVoiceChannelRepositoryService) # module services services.add_singleton(PermissionServiceABC, PermissionService) # commands services.add_singleton(CommandABC, PingCommandService) services.add_singleton(CommandABC, PurgeCommandService) services.add_singleton(CommandABC, AFKCommandService) services.add_singleton(CommandABC, HelpCommandService) # modules services.add_transient(ModuleABC, Database) services.add_transient(ModuleABC, BootLog) services.add_singleton(ModuleABC, Permission) services.add_singleton(ModuleABC, Base) # migrations services.add_transient(MigrationABC, InitialMigration) services.add_transient(MigrationABC, Migration_0_3) services.add_transient(MigrationABC, Migration_0_3_1) startup_init_time = round((datetime.now() - datetime.strptime(self._config.get_configuration('Startup_StartTime'), '%Y-%m-%d %H:%M:%S.%f')).total_seconds(), 2) self._config.add_configuration('Startup_InitTime', str(startup_init_time)) logger: LoggerABC = provider.get_service(LoggerABC) logger.debug(__name__, f'Startup Init time: {startup_init_time}s') return provider