From be810a65334dfc7c48d1657736a7c8e704edf7cb Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Mon, 22 Nov 2021 20:08:46 +0100 Subject: [PATCH] Improved event handling with commands.Cog.listener --- src/gismo_core/abc/bot_service_abc.py | 3 - src/gismo_core/service/bot_service.py | 10 +-- src/modules/boot_log/boot_log.py | 2 +- src/modules_core/service/module_service.py | 80 +++++++++------------- 4 files changed, 37 insertions(+), 58 deletions(-) diff --git a/src/gismo_core/abc/bot_service_abc.py b/src/gismo_core/abc/bot_service_abc.py index c842923..c33aaf2 100644 --- a/src/gismo_core/abc/bot_service_abc.py +++ b/src/gismo_core/abc/bot_service_abc.py @@ -14,6 +14,3 @@ class BotServiceABC(ABC, commands.Bot): @abstractmethod async def stop_async(self): pass - - @abstractmethod - async def on_message(self, message: discord.Message): pass diff --git a/src/gismo_core/service/bot_service.py b/src/gismo_core/service/bot_service.py index 2f26e86..881743d 100644 --- a/src/gismo_core/service/bot_service.py +++ b/src/gismo_core/service/bot_service.py @@ -8,11 +8,12 @@ from gismo_core.configuration.bot_settings import BotSettings from gismo_core.configuration.discord_settings import DiscordSettings from gismo_core.configuration.server_settings import ServerSettings from modules_core.abc.module_service_abc import ModuleServiceABC +from modules_core.service.module_service import ModuleService class BotService(BotServiceABC, commands.Bot): - def __init__(self, config: ConfigurationABC, logger: LoggerABC, modules: ModuleServiceABC, discord_settings: DiscordSettings, bot_settings: BotSettings): + def __init__(self, config: ConfigurationABC, logger: LoggerABC, modules: ModuleService, discord_settings: DiscordSettings, bot_settings: BotSettings): # services self._config = config self._logger = logger @@ -27,6 +28,9 @@ class BotService(BotServiceABC, commands.Bot): async def start_async(self): self._logger.trace(__name__, 'Try to connect to discord') + + self.add_cog(self._modules) + await self.start(self._discord_settings.token) # continue at on_ready @@ -50,7 +54,3 @@ class BotService(BotServiceABC, commands.Bot): await self._modules.on_ready() - - async def on_message(self, message: discord.Message): - self._logger.debug(__name__, f'Received message:\n{message}:\n{message.content}') - await self._modules.on_message(message) diff --git a/src/modules/boot_log/boot_log.py b/src/modules/boot_log/boot_log.py index 83e6feb..141ae5d 100644 --- a/src/modules/boot_log/boot_log.py +++ b/src/modules/boot_log/boot_log.py @@ -33,7 +33,7 @@ class BootLog(ModuleABC, OnReadyABC): self._bot = bot self._message_service = message_service - ModuleABC.__init__(self) + # ModuleABC.__init__(self) self._logger.trace(__name__, f'Module {type(self)} loaded') async def on_ready(self): diff --git a/src/modules_core/service/module_service.py b/src/modules_core/service/module_service.py index 0cc4241..48b011a 100644 --- a/src/modules_core/service/module_service.py +++ b/src/modules_core/service/module_service.py @@ -1,3 +1,4 @@ +from abc import ABCMeta from datetime import datetime from typing import Optional, Sequence, Union import discord @@ -13,7 +14,10 @@ from modules_core.abc.events.on_message_abc import OnMessageABC from modules_core.abc.events.on_ready_abc import OnReadyABC -class ModuleService(ModuleServiceABC): +class _MetaCogABC(ABCMeta, commands.CogMeta): pass + + +class ModuleService(ModuleServiceABC, commands.Cog, metaclass=_MetaCogABC): def __init__(self, logger: LoggerABC, services: ServiceProviderABC, env: ApplicationEnvironmentABC): self._logger = logger @@ -38,10 +42,11 @@ class ModuleService(ModuleServiceABC): async def on_error(self, event: str, *args, **kwargs): pass - async def on_typing(self, channel: discord.abc.Messageable, - user: Union[discord.User, discord.Member], when: datetime): pass + async def on_typing(self, channel: discord.abc.Messageable, user: Union[discord.User, discord.Member], when: datetime): pass + @commands.Cog.listener() async def on_message(self, message: discord.Message): + self._logger.debug(__name__, f'Received message:\n{message}:\n{message.content}') self._logger.debug(__name__, 'Start on_message modules') modules = self._modules.where(lambda m: issubclass(m, OnMessageABC)) for module_type in modules: @@ -53,43 +58,31 @@ class ModuleService(ModuleServiceABC): async def on_bulk_message_delete(self, message: discord.Message): pass - async def on_message_edit( - self, before: discord.Message, after: discord.Message): pass + async def on_message_edit(self, before: discord.Message, after: discord.Message): pass - async def on_reaction_add( - self, reaction: discord.Reaction, user: discord.User): pass + async def on_reaction_add(self, reaction: discord.Reaction, user: discord.User): pass - async def on_reaction_remove( - self, reaction: discord.Reaction, user: discord.User): pass + async def on_reaction_remove(self, reaction: discord.Reaction, user: discord.User): pass - async def on_reaction_clear( - self, message: discord.Message, reactions: list[discord.Reaction]): pass + async def on_reaction_clear(self, message: discord.Message, reactions: list[discord.Reaction]): pass async def on_reaction_clear_emoji(self, reaction: discord.Reaction): pass - async def on_private_channel_delete( - self, channel: discord.abc.PrivateChannel): pass + async def on_private_channel_delete(self, channel: discord.abc.PrivateChannel): pass - async def on_private_channel_create( - self, channel: discord.abc.PrivateChannel): pass + async def on_private_channel_create(self, channel: discord.abc.PrivateChannel): pass - async def on_private_channel_update( - self, before: discord.GroupChannel, after: discord.GroupChannel): pass + async def on_private_channel_update(self, before: discord.GroupChannel, after: discord.GroupChannel): pass - async def on_private_channel_pins_update( - self, channel: discord.abc.PrivateChannel, list_pin: Optional[datetime]): pass + async def on_private_channel_pins_update(self, channel: discord.abc.PrivateChannel, list_pin: Optional[datetime]): pass - async def on_guild_channel_delete( - self, channel: discord.abc.GuildChannel): pass + async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel): pass - async def on_guild_channel_create( - self, channel: discord.abc.GuildChannel): pass + async def on_guild_channel_create(self, channel: discord.abc.GuildChannel): pass - async def on_guild_channel_update( - self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel): pass + async def on_guild_channel_update(self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel): pass - async def on_guild_channel_pins_update( - self, channel: discord.abc.GuildChannel, list_pin: Optional[datetime]): pass + async def on_guild_channel_pins_update(self, channel: discord.abc.GuildChannel, list_pin: Optional[datetime]): pass async def on_guild_integrations_update(self, guild: discord.Guild): pass @@ -99,41 +92,33 @@ class ModuleService(ModuleServiceABC): async def on_member_remove(self, member: discord.Member): pass - async def on_member_update( - self, before: discord.Member, after: discord.Member): pass + async def on_member_update(self, before: discord.Member, after: discord.Member): pass - async def on_user_update(self, before: discord.User, - after: discord.User): pass + async def on_user_update(self, before: discord.User, after: discord.User): pass async def on_guild_join(self, guild: discord.Guild): pass async def on_guild_remove(self, guild: discord.Guild): pass - async def on_guild_update( - self, before: discord.Guild, after: discord.Guild): pass + async def on_guild_update(self, before: discord.Guild, after: discord.Guild): pass async def on_guild_role_create(self, role: discord.Role): pass async def on_guild_role_delete(self, role: discord.Role): pass - async def on_guild_role_update( - self, before: discord.Role, after: discord.Role): pass + async def on_guild_role_update(self, before: discord.Role, after: discord.Role): pass - async def on_guild_emojis_update( - self, guild: discord.Guild, before: Sequence[discord.Emoji], after: Sequence[discord.Emoji]): pass + async def on_guild_emojis_update(self, guild: discord.Guild, before: Sequence[discord.Emoji], after: Sequence[discord.Emoji]): pass async def on_guild_available(self, guild: discord.Guild): pass async def on_guild_unavailable(self, guild: discord.Guild): pass - async def on_voice_state_update( - self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState): pass + async def on_voice_state_update(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState): pass - async def on_member_ban(self, guild: discord.Guild, - user: discord.User): pass + async def on_member_ban(self, guild: discord.Guild, user: discord.User): pass - async def on_member_unban( - self, guild: discord.Guild, user: discord.User): pass + async def on_member_unban(self, guild: discord.Guild, user: discord.User): pass async def on_invite_create(self, invite: discord.Invite): pass @@ -142,14 +127,11 @@ class ModuleService(ModuleServiceABC): async def on_group_join( self, chhanel: discord.GroupChannel, user: discord.User): pass - async def on_group_remove( - self, chhanel: discord.GroupChannel, user: discord.User): pass + async def on_group_remove(self, chhanel: discord.GroupChannel, user: discord.User): pass async def on_relationship_add( self, relationship: discord.Relationship): pass - async def on_relationship_remove( - self, relationship: discord.Relationship): pass + async def on_relationship_remove(self, relationship: discord.Relationship): pass - async def on_relationship_update( - self, before: discord.Relationship, after: discord.Relationship): pass + async def on_relationship_update(self, before: discord.Relationship, after: discord.Relationship): pass