From a220b29303f4d964c85f3d1f0d3bf98734a282f1 Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Tue, 19 Apr 2022 11:34:35 -0600 Subject: [PATCH] Update member events, fix error if activitylog channel no longer exists --- jarvis/client.py | 50 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/jarvis/client.py b/jarvis/client.py index be20753..2458802 100644 --- a/jarvis/client.py +++ b/jarvis/client.py @@ -6,14 +6,19 @@ from datetime import datetime, timezone from aiohttp import ClientSession from dis_snek import Snake, listen -from dis_snek.api.events.discord import MessageCreate, MessageDelete, MessageUpdate +from dis_snek.api.events.discord import ( + MemberAdd, + MemberRemove, + MessageCreate, + MessageDelete, + MessageUpdate, +) from dis_snek.client.errors import CommandCheckFailure, CommandOnCooldown from dis_snek.client.utils.misc_utils import find_all from dis_snek.models.discord.channel import DMChannel from dis_snek.models.discord.embed import EmbedField from dis_snek.models.discord.enums import Permissions from dis_snek.models.discord.message import Message -from dis_snek.models.discord.user import Member from dis_snek.models.snek.context import Context, InteractionContext from dis_snek.models.snek.tasks.task import Task from dis_snek.models.snek.tasks.triggers import IntervalTrigger @@ -162,7 +167,7 @@ class Jarvis(Snake): async def on_command(self, ctx: InteractionContext) -> None: """Lepton on_command override.""" if not isinstance(ctx.channel, DMChannel) and ctx.invoked_name not in ["pw"]: - modlog = await Setting.find_one(q(guild=ctx.guild.id, setting="modlog")) + modlog = await Setting.find_one(q(guild=ctx.guild.id, setting="activitylog")) if modlog: channel = await ctx.guild.fetch_channel(modlog.value) args = [] @@ -192,13 +197,21 @@ class Jarvis(Snake): embed.set_footer( text=f"{ctx.author.user.username}#{ctx.author.discriminator} | {ctx.author.id}" ) - await channel.send(embed=embed) + if channel: + await channel.send(embed=embed) + else: + self.logger.warning( + f"Activitylog channel no longer exists in {ctx.guild.name}, removing" + ) + await modlog.delete() # Events + # Member @listen() - async def on_member_join(self, user: Member) -> None: - """Handle on_member_join event.""" - guild = user.guild + async def on_member_add(self, event: MemberAdd) -> None: + """Handle on_member_add event.""" + user = event.member + guild = event.guild unverified = await Setting.find_one(q(guild=guild.id, setting="unverified")) if unverified: self.logger.debug(f"Applying unverified role to {user.id} in {guild.id}") @@ -206,6 +219,25 @@ class Jarvis(Snake): if role not in user.roles: await user.add_role(role, reason="User just joined and is unverified") + @listen() + async def on_member_remove(self, event: MemberRemove) -> None: + """Handle on_member_remove event.""" + user = event.member + guild = event.guild + log = await Setting.find_one(q(guild=guild.id, setting="activitylog")) + if log: + self.logger.debug(f"User {user.id} left {guild.id}") + channel = await guild.fetch_channel(log.channel) + embed = build_embed( + title="Member Left", + desciption=f"{user.username}#{user.discriminator} left {guild.name}", + fields=[], + ) + embed.set_author(name=user.username, icon_url=user.avatar.url) + embed.set_footer(text=f"{user.username}#{user.discriminator} | {user.id}") + await channel.send(embed=embed) + + # Message async def autopurge(self, message: Message) -> None: """Handle autopurge events.""" autopurge = await Autopurge.find_one(q(guild=message.guild.id, channel=message.channel.id)) @@ -429,7 +461,7 @@ class Jarvis(Snake): before = event.before after = event.after if not after.author.bot: - modlog = await Setting.find_one(q(guild=after.guild.id, setting="modlog")) + modlog = await Setting.find_one(q(guild=after.guild.id, setting="activitylog")) if modlog: if not before or before.content == after.content or before.content is None: return @@ -481,7 +513,7 @@ class Jarvis(Snake): async def on_message_delete(self, event: MessageDelete) -> None: """Process on_message_delete events.""" message = event.message - modlog = await Setting.find_one(q(guild=message.guild.id, setting="modlog")) + modlog = await Setting.find_one(q(guild=message.guild.id, setting="activitylog")) if modlog: try: content = message.content or "N/A"