From d108c910c2c8d35ffb300c734d83b94149357a2f Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Sun, 25 Jul 2021 16:29:23 -0600 Subject: [PATCH] Split ModlogCog into numerous other cogs --- jarvis/cogs/modlog/__init__.py | 56 ++++++ jarvis/cogs/modlog/command.py | 58 ++++++ jarvis/cogs/{modlog.py => modlog/member.py} | 197 ++------------------ jarvis/cogs/modlog/message.py | 76 ++++++++ 4 files changed, 208 insertions(+), 179 deletions(-) create mode 100644 jarvis/cogs/modlog/__init__.py create mode 100644 jarvis/cogs/modlog/command.py rename jarvis/cogs/{modlog.py => modlog/member.py} (60%) create mode 100644 jarvis/cogs/modlog/message.py diff --git a/jarvis/cogs/modlog/__init__.py b/jarvis/cogs/modlog/__init__.py new file mode 100644 index 0000000..1126ef2 --- /dev/null +++ b/jarvis/cogs/modlog/__init__.py @@ -0,0 +1,56 @@ +from datetime import datetime, timedelta + +import discord +from discord.utils import find + +from jarvis.cogs.modlog import command, member, message +from jarvis.utils import build_embed +from jarvis.utils.field import Field + + +def modlog_embed( + self, + member: discord.Member, + admin: discord.Member, + log: discord.AuditLogEntry, + title: str, + desc: str, +) -> discord.Embed: + fields = [ + Field( + name="Moderator", + value=f"{admin.mention} ({admin.name}" + + f"#{admin.discriminator})", + ), + ] + if log.reason: + fields.append(Field(name="Reason", value=log.reason, inline=False)) + embed = build_embed( + title=title, + description=desc, + color="#fc9e3f", + fields=fields, + timestamp=log.created_at, + ) + embed.set_author( + name=f"{member.name}", + icon_url=member.avatar_url, + ) + embed.set_footer( + text=f"{member.name}#{member.discriminator} | {member.id}" + ) + return embed + + +def get_latest_log(self, auditlog, target): + before = datetime.utcnow() - timedelta(seconds=10) + return find( + lambda x: x.target.id == target.id and x.created_at > before, + auditlog, + ) + + +def setup(bot): + bot.add_cog(command.ModlogCommandCog(bot)) + bot.add_cog(member.ModlogMemberCog(bot)) + bot.add_cog(message.ModlogMessageCog(bot)) diff --git a/jarvis/cogs/modlog/command.py b/jarvis/cogs/modlog/command.py new file mode 100644 index 0000000..a1d0f61 --- /dev/null +++ b/jarvis/cogs/modlog/command.py @@ -0,0 +1,58 @@ +from discord import DMChannel +from discord.ext import commands +from discord_slash import SlashContext + +from jarvis.db.types import Setting +from jarvis.utils import build_embed +from jarvis.utils.field import Field + + +class ModlogCommandCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_slash_command(self, ctx: SlashContext): + if not isinstance(ctx.channel, DMChannel): + modlog = Setting.get(guild=ctx.guild.id, setting="modlog") + if modlog: + channel = ctx.guild.get_channel(modlog.value) + fields = [ + Field("Command", ctx.name), + ] + if ctx.args: + fields.append( + Field( + "Args", + " ".join(ctx.args), + False, + ) + ) + if ctx.kwargs: + kwargs_string = " ".join( + f"{k}: {ctx.kwargs[k]}" for k in ctx.kwargs + ) + fields.append( + Field( + "Keyword Args", + kwargs_string, + False, + ) + ) + if ctx.subcommand_name: + fields.insert(1, Field("Subcommand", ctx.subcommand_name)) + embed = build_embed( + title="Command Invoked", + description=f"{ctx.author.mention} invoked a command", + fields=fields, + color="#fc9e3f", + ) + embed.set_author( + name=ctx.author.name, + icon_url=ctx.author.avatar_url, + ) + embed.set_footer( + text=f"{ctx.author.name}#{ctx.author.discriminator}" + + f" | {ctx.author.id}" + ) + await channel.send(embed=embed) diff --git a/jarvis/cogs/modlog.py b/jarvis/cogs/modlog/member.py similarity index 60% rename from jarvis/cogs/modlog.py rename to jarvis/cogs/modlog/member.py index 330fe77..f5af3c2 100644 --- a/jarvis/cogs/modlog.py +++ b/jarvis/cogs/modlog/member.py @@ -2,65 +2,20 @@ import asyncio from datetime import datetime, timedelta import discord -from discord import DMChannel from discord.ext import commands from discord.utils import find -from discord_slash import SlashContext +from jarvis.cogs.modlog import get_latest_log, modlog_embed from jarvis.config import get_config from jarvis.db.types import Ban, Kick, MongoSort, Mute, Setting from jarvis.utils import build_embed from jarvis.utils.field import Field -class ModlogCog(commands.Cog): - """ - A hybrid user/modlog functionality for J.A.R.V.I.S. - """ - - def __init__(self, bot: discord.ext.commands.Bot): +class ModlogMemberCog(commands.Cog): + def __init__(self, bot): self.bot = bot - def get_latest_log(self, auditlog, target): - before = datetime.utcnow() - timedelta(seconds=10) - return find( - lambda x: x.target.id == target.id and x.created_at > before, - auditlog, - ) - - async def modlog_embed( - self, - member: discord.Member, - admin: discord.Member, - log: discord.AuditLogEntry, - title: str, - desc: str, - ) -> discord.Embed: - fields = [ - Field( - name="Moderator", - value=f"{admin.mention} ({admin.name}" - + f"#{admin.discriminator})", - ), - ] - if log.reason: - fields.append(Field(name="Reason", value=log.reason, inline=False)) - embed = build_embed( - title=title, - description=desc, - color="#fc9e3f", - fields=fields, - timestamp=log.created_at, - ) - embed.set_author( - name=f"{member.name}", - icon_url=member.avatar_url, - ) - embed.set_footer( - text=f"{member.name}#{member.discriminator} | {member.id}" - ) - return embed - @commands.Cog.listener() async def on_member_ban(self, guild: discord.Guild, user: discord.User): modlog = Setting.get(guild=guild.id, setting="modlog") @@ -73,7 +28,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ) - log: discord.AuditLogEntry = self.get_latest_log(auditlog, user) + log: discord.AuditLogEntry = get_latest_log(auditlog, user) admin: discord.User = log.user if admin.id == get_config().client_id: ban = Ban.get( @@ -83,7 +38,7 @@ class ModlogCog(commands.Cog): sort=MongoSort(key="created_at", type="desc"), ) admin = guild.get_member(ban.admin) - embed = await self.modlog_embed( + embed = await modlog_embed( user, admin, log, @@ -105,7 +60,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ) - log: discord.AuditLogEntry = self.get_latest_log(auditlog, user) + log: discord.AuditLogEntry = get_latest_log(auditlog, user) admin: discord.User = log.user if admin.id == get_config().client_id: ban = Ban.get( @@ -115,7 +70,7 @@ class ModlogCog(commands.Cog): sort=MongoSort(key="created_at", type="desc"), ) admin = guild.get_member(ban.admin) - embed = await self.modlog_embed( + embed = await modlog_embed( user, admin, log, @@ -137,7 +92,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ) - log: discord.AuditLogEntry = self.get_latest_log(auditlog, user) + log: discord.AuditLogEntry = get_latest_log(auditlog, user) admin: discord.User = log.user if admin.id == get_config().client_id: kick = Kick.get( @@ -146,7 +101,7 @@ class ModlogCog(commands.Cog): sort=MongoSort(key="created_at", type="desc"), ) admin = user.guild.get_member(kick.admin) - embed = await self.modlog_embed( + embed = await modlog_embed( user, admin, log, @@ -163,7 +118,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ).flatten() - log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) + log: discord.AuditLogEntry = get_latest_log(auditlog, before) admin: discord.User = log.user if admin.id == get_config().client_id: mute = Mute.get( @@ -173,7 +128,7 @@ class ModlogCog(commands.Cog): sort=MongoSort(key="created_at", type="desc"), ) admin = before.guild.get_member(mute.admin) - return await self.modlog_embed( + return await modlog_embed( member=before, admin=admin, log=log, @@ -188,7 +143,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ).flatten() - log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) + log: discord.AuditLogEntry = get_latest_log(auditlog, before) admin: discord.User = log.user if admin.id == get_config().client_id: mute = Mute.get( @@ -199,7 +154,7 @@ class ModlogCog(commands.Cog): ) mute = Mute(**mute) admin = before.guild.get_member(mute.admin) - return await self.modlog_embed( + return await modlog_embed( member=before, admin=admin, log=log, @@ -214,9 +169,9 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ).flatten() - log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) + log: discord.AuditLogEntry = get_latest_log(auditlog, before) admin: discord.User = log.user - return await self.modlog_embed( + return await modlog_embed( member=before, admin=admin, log=log, @@ -231,7 +186,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ).flatten() - log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) + log: discord.AuditLogEntry = get_latest_log(auditlog, before) admin: discord.User = log.user role = None title = "User Given Role" @@ -243,7 +198,7 @@ class ModlogCog(commands.Cog): elif len(before.roles) < len(after.roles): role = find(lambda x: x not in before.roles, after.roles) role_text = role.mention if role else "||`[redacted]`||" - return await self.modlog_embed( + return await modlog_embed( member=before, admin=admin, log=log, @@ -279,9 +234,7 @@ class ModlogCog(commands.Cog): after=datetime.utcnow() - timedelta(seconds=15), oldest_first=False, ).flatten() - log: discord.AuditLogEntry = self.get_latest_log( - auditlog, before - ) + log: discord.AuditLogEntry = get_latest_log(auditlog, before) bname = before.nick if before.nick else before.name aname = after.nick if after.nick else after.name fields = [ @@ -327,117 +280,3 @@ class ModlogCog(commands.Cog): embed = await self.process_rolechange(before, after) if embed: await channel.send(embed=embed) - - @commands.Cog.listener() - async def on_message_edit( - self, before: discord.Message, after: discord.Message - ): - if before.author != get_config().client_id: - modlog = Setting.get(guild=after.guild.id, setting="modlog") - if modlog: - if before.content == after.content or before.content is None: - return - channel = before.guild.get_channel(modlog.value) - fields = [ - Field( - "Original Message", - before.content if before.content else "N/A", - False, - ), - Field( - "New Message", - after.content if after.content else "N/A", - False, - ), - ] - embed = build_embed( - title="Message Edited", - description=f"{before.author.mention} edited a message", - fields=fields, - color="#fc9e3f", - timestamp=after.edited_at, - url=after.jump_url, - ) - embed.set_author( - name=before.author.name, - icon_url=before.author.avatar_url, - url=after.jump_url, - ) - embed.set_footer( - text=f"{before.author.name}#{before.author.discriminator}" - + f" | {before.author.id}" - ) - await channel.send(embed=embed) - - @commands.Cog.listener() - async def on_message_delete(self, message: discord.Message): - modlog = Setting.get(guild=message.guild.id, setting="modlog") - if modlog: - fields = [Field("Original Message", message.content, False)] - channel = message.guild.get_channel(modlog.value) - embed = build_embed( - title="Message Deleted", - description=f"{message.author.mention}'s message was deleted", - fields=fields, - color="#fc9e3f", - ) - embed.set_author( - name=message.author.name, - icon_url=message.author.avatar_url, - url=message.jump_url, - ) - embed.set_footer( - text=f"{message.author.name}#{message.author.discriminator}" - + f" | {message.author.id}" - ) - await channel.send(embed=embed) - - @commands.Cog.listener() - async def on_slash_command(self, ctx: SlashContext): - if not isinstance(ctx.channel, DMChannel): - modlog = Setting.get(guild=ctx.guild.id, setting="modlog") - if modlog: - channel = ctx.guild.get_channel(modlog.value) - fields = [ - Field("Command", ctx.name), - ] - if ctx.args: - fields.append( - Field( - "Args", - " ".join(ctx.args), - False, - ) - ) - if ctx.kwargs: - kwargs_string = " ".join( - f"{k}: {ctx.kwargs[k]}" for k in ctx.kwargs - ) - fields.append( - Field( - "Keyword Args", - kwargs_string, - False, - ) - ) - if ctx.subcommand_name: - fields.insert(1, Field("Subcommand", ctx.subcommand_name)) - embed = build_embed( - title="Command Invoked", - description=f"{ctx.author.mention} invoked a command", - fields=fields, - color="#fc9e3f", - ) - embed.set_author( - name=ctx.author.name, - icon_url=ctx.author.avatar_url, - ) - embed.set_footer( - text=f"{ctx.author.name}#{ctx.author.discriminator}" - + f" | {ctx.author.id}" - ) - await channel.send(embed=embed) - - -def setup(bot): - bot.add_cog(ModlogCog(bot)) diff --git a/jarvis/cogs/modlog/message.py b/jarvis/cogs/modlog/message.py new file mode 100644 index 0000000..e06f433 --- /dev/null +++ b/jarvis/cogs/modlog/message.py @@ -0,0 +1,76 @@ +import discord +from discord.ext import commands + +from jarvis.config import get_config +from jarvis.db.types import Setting +from jarvis.utils import build_embed +from jarvis.utils.field import Field + + +class ModlogMessageCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message_edit( + self, before: discord.Message, after: discord.Message + ): + if before.author != get_config().client_id: + modlog = Setting.get(guild=after.guild.id, setting="modlog") + if modlog: + if before.content == after.content or before.content is None: + return + channel = before.guild.get_channel(modlog.value) + fields = [ + Field( + "Original Message", + before.content if before.content else "N/A", + False, + ), + Field( + "New Message", + after.content if after.content else "N/A", + False, + ), + ] + embed = build_embed( + title="Message Edited", + description=f"{before.author.mention} edited a message", + fields=fields, + color="#fc9e3f", + timestamp=after.edited_at, + url=after.jump_url, + ) + embed.set_author( + name=before.author.name, + icon_url=before.author.avatar_url, + url=after.jump_url, + ) + embed.set_footer( + text=f"{before.author.name}#{before.author.discriminator}" + + f" | {before.author.id}" + ) + await channel.send(embed=embed) + + @commands.Cog.listener() + async def on_message_delete(self, message: discord.Message): + modlog = Setting.get(guild=message.guild.id, setting="modlog") + if modlog: + fields = [Field("Original Message", message.content, False)] + channel = message.guild.get_channel(modlog.value) + embed = build_embed( + title="Message Deleted", + description=f"{message.author.mention}'s message was deleted", + fields=fields, + color="#fc9e3f", + ) + embed.set_author( + name=message.author.name, + icon_url=message.author.avatar_url, + url=message.jump_url, + ) + embed.set_footer( + text=f"{message.author.name}#{message.author.discriminator}" + + f" | {message.author.id}" + ) + await channel.send(embed=embed)