From a4dc66396e6df1a7583e76237afd11bd4f7298a9 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 2 Oct 2022 01:11:54 +0200 Subject: [PATCH 1/5] Migrated restart_command #42 --- src/bot_core/service/message_service.py | 3 +-- src/modules/admin/command/restart_command.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/bot_core/service/message_service.py b/src/bot_core/service/message_service.py index f7696c6356..1052edc69d 100644 --- a/src/bot_core/service/message_service.py +++ b/src/bot_core/service/message_service.py @@ -104,8 +104,7 @@ class MessageService(MessageServiceABC): await asyncio.sleep(wait_before_delete) if is_persistent: - await self.delete_message(ctx.message, without_tracking) return if ctx.guild is not None: - await self.delete_messages(List(discord.Message, [msg, ctx.message]), ctx.guild.id) + await self.delete_message(msg) diff --git a/src/modules/admin/command/restart_command.py b/src/modules/admin/command/restart_command.py index e8de4f5b27..d04308fa19 100644 --- a/src/modules/admin/command/restart_command.py +++ b/src/modules/admin/command/restart_command.py @@ -35,7 +35,7 @@ class RestartCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def restart(self, ctx: Context): self._logger.debug(__name__, f'Received command restart {ctx}') From a939c741cbc987560f98b304de6fdcb919743089 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 2 Oct 2022 01:52:32 +0200 Subject: [PATCH 2/5] 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 34beb4c23e..655d5d6720 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 5abf2ed19a..570e0431f0 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 4c0656b2f9..21036f4942 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 b608d49dcc..1a0d9d790e 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 1052edc69d..3eaf7b0aeb 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 d04308fa19..7deda69bb1 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 f4e6849913..0eeeff3406 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 403f4628ae..d76a4f37ac 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 f9caa63a3a..f6376ccc8b 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) From 0dbf33a39f4fcf885e70e5916aa0e872f6a690fa Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 2 Oct 2022 02:00:21 +0200 Subject: [PATCH 3/5] Migrated purge command --- src/modules/moderator/command/purge_command.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/moderator/command/purge_command.py b/src/modules/moderator/command/purge_command.py index 07ecd4bf92..950ae82389 100644 --- a/src/modules/moderator/command/purge_command.py +++ b/src/modules/moderator/command/purge_command.py @@ -35,12 +35,14 @@ class PurgeCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def purge(self, ctx: Context): 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}') if not self._permissions.is_member_moderator(ctx.author): From 7496a17cfa9e574a029712ccf1f14abfc96af20c Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 2 Oct 2022 02:05:47 +0200 Subject: [PATCH 4/5] Migrated all other commands --- src/modules/base/command/afk_command.py | 4 +++- src/modules/base/command/help_command.py | 4 +++- src/modules/base/command/info_command.py | 4 +++- src/modules/base/command/ping_command.py | 4 +++- src/modules/base/command/user_info_command.py | 4 +++- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/modules/base/command/afk_command.py b/src/modules/base/command/afk_command.py index 10eb6af104..7e9fb698f9 100644 --- a/src/modules/base/command/afk_command.py +++ b/src/modules/base/command/afk_command.py @@ -34,10 +34,12 @@ class AFKCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def afk(self, ctx: Context): 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) settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}') diff --git a/src/modules/base/command/help_command.py b/src/modules/base/command/help_command.py index 4bf9747178..9bbd795790 100644 --- a/src/modules/base/command/help_command.py +++ b/src/modules/base/command/help_command.py @@ -30,10 +30,12 @@ class HelpCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def help(self, ctx: Context, persistent_flag: str = None): 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) settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}') is_persistent = persistent_flag == '--stay' diff --git a/src/modules/base/command/info_command.py b/src/modules/base/command/info_command.py index d3c7de6575..83560783c2 100644 --- a/src/modules/base/command/info_command.py +++ b/src/modules/base/command/info_command.py @@ -36,10 +36,12 @@ class InfoCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def info(self, ctx: Context, *, wait: int = None): 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) client = self._client_utils.get_client(self._bot.user.id, ctx.guild.id) diff --git a/src/modules/base/command/ping_command.py b/src/modules/base/command/ping_command.py index f8a796ef28..439b5a1528 100644 --- a/src/modules/base/command/ping_command.py +++ b/src/modules/base/command/ping_command.py @@ -29,10 +29,12 @@ class PingCommand(DiscordCommandABC): self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}') - @commands.command() + @commands.hybrid_command() @commands.guild_only() async def ping(self, ctx: Context): 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) await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.pong')) self._logger.trace(__name__, f'Finished ping command') diff --git a/src/modules/base/command/user_info_command.py b/src/modules/base/command/user_info_command.py index d9d646ba2c..200bfe66d5 100644 --- a/src/modules/base/command/user_info_command.py +++ b/src/modules/base/command/user_info_command.py @@ -50,10 +50,12 @@ class UserInfoCommand(DiscordCommandABC): 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() 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}') + 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): From 8b55db172aebb0c854165224c9e8701a69840a18 Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Sun, 2 Oct 2022 02:07:05 +0200 Subject: [PATCH 5/5] Updated info command --- src/modules/base/command/info_command.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/base/command/info_command.py b/src/modules/base/command/info_command.py index 83560783c2..1ef1085ade 100644 --- a/src/modules/base/command/info_command.py +++ b/src/modules/base/command/info_command.py @@ -60,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.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) - 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) await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait)