69 lines
3.4 KiB
Python
69 lines
3.4 KiB
Python
from typing import Optional, Type
|
|
|
|
from cpl_core.configuration import ConfigurationABC, ConfigurationModelABC
|
|
from cpl_core.console import Console
|
|
from cpl_core.dependency_injection import ServiceProviderABC
|
|
from cpl_core.logging import LoggerABC
|
|
from cpl_discord.application import DiscordBotApplicationABC
|
|
from cpl_discord.configuration import DiscordBotSettings
|
|
from cpl_discord.service import DiscordBotServiceABC, DiscordBotService
|
|
from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSettings
|
|
|
|
from bot_core.configuration.bot_settings import BotSettings
|
|
from bot_core.configuration.server_settings import ServerSettings
|
|
from modules.base.configuration.base_server_settings import BaseServerSettings
|
|
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.permission.configuration.permission_server_settings import PermissionServerSettings
|
|
from modules.permission.configuration.permission_settings import PermissionSettings
|
|
|
|
|
|
class Application(DiscordBotApplicationABC):
|
|
|
|
def __init__(self, config: ConfigurationABC, services: ServiceProviderABC):
|
|
DiscordBotApplicationABC.__init__(self, config, services)
|
|
|
|
# cpl-core
|
|
self._logger: LoggerABC = services.get_service(LoggerABC)
|
|
# cpl-discord
|
|
self._bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
|
|
self._bot_settings: DiscordBotSettings = config.get_configuration(DiscordBotSettings)
|
|
# cpl-translation
|
|
self._translation: TranslationServiceABC = services.get_service(TranslationServiceABC)
|
|
self._translate: TranslatePipe = services.get_service(TranslatePipe)
|
|
|
|
def _configure_settings_with_servers(self, settings: Type, server_settings: Type):
|
|
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):
|
|
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):
|
|
try:
|
|
self._logger.debug(__name__, f'Starting...\n')
|
|
self._logger.trace(__name__, f'Try to start {DiscordBotService.__name__}')
|
|
await self._bot.start_async()
|
|
except Exception as e:
|
|
self._logger.error(__name__, 'Start failed', e)
|
|
|
|
async def stop_async(self):
|
|
try:
|
|
self._logger.trace(__name__, f'Try to stop {DiscordBotService.__name__}')
|
|
await self._bot.close()
|
|
self._logger.trace(__name__, f'Stopped {DiscordBotService.__name__}')
|
|
except Exception as e:
|
|
self._logger.error(__name__, 'stop failed', e)
|
|
|
|
Console.write_line()
|