diff --git a/handlers/event.py b/handlers/event.py new file mode 100644 index 0000000..e901a2f --- /dev/null +++ b/handlers/event.py @@ -0,0 +1,98 @@ +import discord +from discord.ext import commands +from loguru import logger + +from services.blacklist_service import BlacklistUserService +from services.config_service import GuildConfig +from ui.config import create_boost_embed, create_greet_embed + + +class EventHandler(commands.Cog): + def __init__(self, bot: commands.Bot): + self.bot = bot + + @commands.Cog.listener() + async def on_member_join(self, member: discord.Member): + if BlacklistUserService.is_user_blacklisted(member.id): + return + + config = GuildConfig(member.guild.id) + + if not config.welcome_channel_id: + return + + embed = create_greet_embed( + user_name=member.name, + user_avatar_url=member.display_avatar.url, + guild_name=member.guild.name, + template=config.welcome_message, + ) + + try: + channel = member.guild.get_channel(config.welcome_channel_id) + if isinstance(channel, discord.TextChannel): + await channel.send( + embed=embed, + content=member.mention, + ) + except Exception as e: + logger.warning( + f"Greet message not sent in '{member.guild.name}'. Channel ID may be invalid. {e}", + ) + + @commands.Cog.listener() + async def on_member_update(self, before: discord.Member, after: discord.Member): + if BlacklistUserService.is_user_blacklisted(after.id): + return + + if before.premium_since is None and after.premium_since is not None: + await self.on_nitro_boost(after) + + @staticmethod + async def on_nitro_boost(member: discord.Member): + config = GuildConfig(member.guild.id) + + if not config.boost_channel_id: + return + + embed = create_boost_embed( + user_name=member.name, + user_avatar_url=member.display_avatar.url, + boost_count=member.guild.premium_subscription_count, + template=config.boost_message, + image_url=config.boost_image_url, + ) + + try: + channel = member.guild.get_channel(config.boost_channel_id) + if isinstance(channel, discord.TextChannel): + await channel.send( + embed=embed, + content=member.mention, + ) + except Exception as e: + logger.warning( + f"Boost message not sent in '{member.guild.name}'. Channel ID may be invalid. {e}", + ) + + @commands.Cog.listener() + async def on_command_completion(self, ctx: commands.Context[commands.Bot]) -> None: + log_msg = f"{ctx.author.name} executed .{ctx.command.qualified_name if ctx.command else 'Unknown'}" + + if ctx.guild is not None: + logger.debug(f"{log_msg} | guild: {ctx.guild.name} ") + else: + logger.debug(f"{log_msg} in DMs") + + @commands.Cog.listener() + async def on_application_command_completion(self, ctx: discord.Interaction) -> None: + log_msg = f"{ctx.user.name} executed /{ctx.command.qualified_name if ctx.command else 'Unknown'}" + + if ctx.guild is not None: + logger.debug(f"{log_msg} | guild: {ctx.guild.name} ") + else: + logger.debug(f"{log_msg} in DMs") + + +async def setup(bot: commands.Bot): + await bot.add_cog(EventHandler(bot)) diff --git a/modules/config/config.py b/modules/config/config.py index 0967a88..4cdb2f5 100644 --- a/modules/config/config.py +++ b/modules/config/config.py @@ -279,7 +279,7 @@ class Config(commands.GroupCog, group_name="config"): await interaction.response.send_message(embed=embed) - example_embed = await create_boost_embed( + example_embed = create_boost_embed( user_name=interaction.user.name, user_avatar_url=interaction.user.display_avatar.url, boost_count=interaction.guild.premium_subscription_count, @@ -330,7 +330,7 @@ class Config(commands.GroupCog, group_name="config"): await interaction.response.send_message(embed=embed) - example_embed = await create_boost_embed( + example_embed = create_boost_embed( user_name=interaction.user.name, user_avatar_url=interaction.user.display_avatar.url, boost_count=interaction.guild.premium_subscription_count, diff --git a/ui/config.py b/ui/config.py index 9e6f57f..f0ec732 100644 --- a/ui/config.py +++ b/ui/config.py @@ -4,7 +4,7 @@ import lib.format from lib.const import CONST -async def create_boost_embed( +def create_boost_embed( user_name: str, user_avatar_url: str, boost_count: int,