From a939c741cbc987560f98b304de6fdcb919743089 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 2 Oct 2022 01:52:32 +0200 Subject: [PATCH] Added logic to wait before handling command & migrated shutdown command #42 --- src/bot/translation/de.json | 3 ++- src/bot_core/abc/client_utils_service_abc.py | 5 ++++ src/bot_core/configuration/bot_settings.py | 8 ++++--- src/bot_core/service/client_utils_service.py | 23 ++++++++++++++++++- src/bot_core/service/message_service.py | 3 ++- src/modules/admin/command/restart_command.py | 3 +++ src/modules/admin/command/shutdown_command.py | 5 +++- .../boot_log/boot_log_on_ready_event.py | 3 ++- .../permission/service/permission_service.py | 4 ++-- 9 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/bot/translation/de.json b/src/bot/translation/de.json index 34beb4c2..655d5d67 100644 --- a/src/bot/translation/de.json +++ b/src/bot/translation/de.json @@ -37,7 +37,8 @@ "extension_already_loaded": "Fehler: Erweiterung wurde bereits geladen!", "extension_not_loaded": "Fehler: Erweiterung wurde nicht geladen!", "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": { diff --git a/src/bot_core/abc/client_utils_service_abc.py b/src/bot_core/abc/client_utils_service_abc.py index 5abf2ed1..570e0431 100644 --- a/src/bot_core/abc/client_utils_service_abc.py +++ b/src/bot_core/abc/client_utils_service_abc.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod +from discord.ext.commands import Context + class ClientUtilsServiceABC(ABC): @@ -14,3 +16,6 @@ class ClientUtilsServiceABC(ABC): @abstractmethod 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 diff --git a/src/bot_core/configuration/bot_settings.py b/src/bot_core/configuration/bot_settings.py index 4c0656b2..21036f49 100644 --- a/src/bot_core/configuration/bot_settings.py +++ b/src/bot_core/configuration/bot_settings.py @@ -12,16 +12,18 @@ class BotSettings(ConfigurationModelABC): def __init__(self): ConfigurationModelABC.__init__(self) - self._servers: List[ServerSettings] = List() - self._technicians: list[int] = [] + self._servers: List[ServerSettings] = List(ServerSettings) + self._technicians: List[int] = List(int) self._deploy_file_path = './' + self._wait_for_restart = 2 + self._wait_for_shutdown = 2 @property def servers(self) -> List[ServerSettings]: return self._servers @property - def technicians(self) -> list[int]: + def technicians(self) -> List[int]: return self._technicians @property diff --git a/src/bot_core/service/client_utils_service.py b/src/bot_core/service/client_utils_service.py index b608d49d..1a0d9d79 100644 --- a/src/bot_core/service/client_utils_service.py +++ b/src/bot_core/service/client_utils_service.py @@ -1,8 +1,13 @@ +from cpl_core.configuration import ConfigurationABC from cpl_core.database.context import DatabaseContextABC +from cpl_core.logging import LoggerABC 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.message_service_abc import MessageServiceABC from bot_data.abc.client_repository_abc import ClientRepositoryABC from bot_data.abc.server_repository_abc import ServerRepositoryABC @@ -11,16 +16,24 @@ class ClientUtilsService(ClientUtilsServiceABC): def __init__( self, + config: ConfigurationABC, + logger: LoggerABC, bot: DiscordBotServiceABC, servers: ServerRepositoryABC, clients: ClientRepositoryABC, - db: DatabaseContextABC + message_service: MessageServiceABC, + db: DatabaseContextABC, + t: TranslatePipe ): ClientUtilsServiceABC.__init__(self) + self._config = config + self._logger = logger self._bot = bot self._servers = servers self._clients = clients + self._message_service = message_service self._db = db + self._t = t def received_command(self, guild_id: int): 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) client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id) 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 diff --git a/src/bot_core/service/message_service.py b/src/bot_core/service/message_service.py index 1052edc6..3eaf7b0a 100644 --- a/src/bot_core/service/message_service.py +++ b/src/bot_core/service/message_service.py @@ -39,6 +39,7 @@ class MessageService(MessageServiceABC): guild_id = message.guild.id try: await message.delete() + await asyncio.sleep(server_st.message_delete_timer) except Exception as e: self._logger.error(__name__, f'Deleting message failed', e) else: @@ -107,4 +108,4 @@ class MessageService(MessageServiceABC): return if ctx.guild is not None: - await self.delete_message(msg) + await self.delete_message(msg, without_tracking) diff --git a/src/modules/admin/command/restart_command.py b/src/modules/admin/command/restart_command.py index d04308fa..7deda69b 100644 --- a/src/modules/admin/command/restart_command.py +++ b/src/modules/admin/command/restart_command.py @@ -39,6 +39,9 @@ class RestartCommand(DiscordCommandABC): @commands.guild_only() async def restart(self, ctx: Context): 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) if not self._permissions.is_member_moderator(ctx.author): diff --git a/src/modules/admin/command/shutdown_command.py b/src/modules/admin/command/shutdown_command.py index f4e68499..0eeeff34 100644 --- a/src/modules/admin/command/shutdown_command.py +++ b/src/modules/admin/command/shutdown_command.py @@ -35,10 +35,13 @@ class ShutdownCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def shutdown(self, ctx: Context): 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) if not self._permissions.is_member_moderator(ctx.author): diff --git a/src/modules/boot_log/boot_log_on_ready_event.py b/src/modules/boot_log/boot_log_on_ready_event.py index 403f4628..d76a4f37 100644 --- a/src/modules/boot_log/boot_log_on_ready_event.py +++ b/src/modules/boot_log/boot_log_on_ready_event.py @@ -72,6 +72,7 @@ class BootLogOnReadyEvent(OnReadyABC): ), 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') diff --git a/src/modules/permission/service/permission_service.py b/src/modules/permission/service/permission_service.py index f9caa63a..f6376ccc 100644 --- a/src/modules/permission/service/permission_service.py +++ b/src/modules/permission/service/permission_service.py @@ -106,7 +106,7 @@ class PermissionService(PermissionServiceABC): return self._moderators[g_id] 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: - 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)