From eae0a5d4d785ec05022de4be8a03b72747d03efc Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Sun, 4 Jul 2021 19:55:34 -0600 Subject: [PATCH] Make text in /rcauto required --- jarvis/cogs/admin.py | 6 +- jarvis/cogs/modlog.py | 225 ++++++++++++++++++++++++++++++++++++++++++ jarvis/cogs/util.py | 5 +- 3 files changed, 233 insertions(+), 3 deletions(-) create mode 100644 jarvis/cogs/modlog.py diff --git a/jarvis/cogs/admin.py b/jarvis/cogs/admin.py index 230f2e2..2dc7d84 100644 --- a/jarvis/cogs/admin.py +++ b/jarvis/cogs/admin.py @@ -112,6 +112,7 @@ class AdminCog(commands.Cog): active = True if type == "soft": active = False + self.db.jarvis.bans.insert_one( { "user": user.id, @@ -128,9 +129,10 @@ class AdminCog(commands.Cog): } ) - async def discord_apply_unban(self, ctx, user, reason): + async def discord_apply_unban( + self, ctx: SlashContext, user: User, reason: str + ): await ctx.guild.unban(user, reason=reason) - user: User = user self.db.jarvis.unbans.insert_one( { "user": user.id, diff --git a/jarvis/cogs/modlog.py b/jarvis/cogs/modlog.py new file mode 100644 index 0000000..42eda23 --- /dev/null +++ b/jarvis/cogs/modlog.py @@ -0,0 +1,225 @@ +import asyncio +from datetime import datetime, timedelta + +import discord +from discord.ext import commands +from discord.utils import find + +import jarvis +from jarvis.config import get_config +from jarvis.utils import build_embed +from jarvis.utils.db import DBManager +from jarvis.utils.field import Field + + +class ModlogCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.db = DBManager(get_config().mongo).mongo + + 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, + ) + + @commands.Cog.listener() + async def on_member_ban(self, guild: discord.Guild, user: discord.User): + modlog = self.db.jarvis.settings.find_one( + {"guild": guild.id, "setting": "modlog"} + ) + if modlog: + channel = guild.get_channel(modlog["value"]) + await asyncio.sleep(0.5) # Need to wait for audit log + auditlog = await guild.audit_logs( + limit=50, + action=discord.AuditLogAction.ban, + after=datetime.utcnow() - timedelta(seconds=15), + oldest_first=False, + ) + log: discord.AuditLogEntry = self.get_latest_log(auditlog, user) + fields = [ + Field( + name="Member", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field( + name="Moderator", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field(name="Reason", value=log.reason, inline=False), + ] + embed = build_embed( + title="User Banned", + description=f"A user was banned from {guild.name}", + color="#bf2a3e", + fields=fields, + timestamp=log.created_at, + ) + embed.set_author( + name=f"{user.name}#{user.discriminator} | {user.id}", + icon_url=user.avatar_url, + ) + + await channel.send(embed=embed) + + @commands.Cog.listener() + async def on_member_unban( + self, guild: discord.Guild, user: discord.User + ): + modlog = self.db.jarvis.settings.find_one( + {"guild": guild.id, "setting": "modlog"} + ) + if modlog: + channel = guild.get_channel(modlog["value"]) + await asyncio.sleep(0.5) # Need to wait for audit log + auditlog = await guild.audit_logs( + limit=50, + action=discord.AuditLogAction.unban, + after=datetime.utcnow() - timedelta(seconds=15), + oldest_first=False, + ) + log: discord.AuditLogEntry = self.get_latest_log( + auditlog, user + ) + fields = [ + Field( + name="Member", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field( + name="Moderator", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field(name="Reason", value=log.reason, inline=False), + ] + embed = build_embed( + title="User Unbanned", + description=f"A user was unbanned from {guild.name}", + color="#bf2a3e", + fields=fields, + timestamp=log.created_at, + ) + embed.set_author( + name=f"{user.name}#{user.discriminator} | {user.id}", + icon_url=user.avatar_url, + ) + + await channel.send(embed=embed) + + @commands.Cog.listener() + async def on_member_remove(self, user: discord.User): + modlog = self.db.jarvis.settings.find_one( + {"guild": user.guild.id, "setting": "modlog"} + ) + if modlog: + channel = user.guild.get_channel(modlog["value"]) + await asyncio.sleep(0.5) # Need to wait for audit log + auditlog = await user.guild.audit_logs( + limit=50, + action=discord.AuditLogAction.kick, + after=datetime.utcnow() - timedelta(seconds=15), + oldest_first=False, + ) + log: discord.AuditLogEntry = self.get_latest_log( + auditlog, user + ) + fields = [ + Field( + name="Member", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field( + name="Moderator", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field(name="Reason", value=log.reason, inline=False), + ] + embed = build_embed( + title="User Kicked", + description=f"A user was kicked from {guild.name}", + color="#bf2a3e", + fields=fields, + timestamp=log.created_at, + ) + embed.set_author( + name=f"{user.name}#{user.discriminator} | {user.id}", + icon_url=user.avatar_url, + ) + + await channel.send(embed=embed) + + @commands.Cog.listener() + async def on_member_update( + self, before: discord.User, after: discord.User + ): + modlog = self.db.jarvis.settings.find_one( + {"guild": user.guild.id, "setting": "modlog"} + ) + if modlog: + embed = None + mute = self.db.jarvis.settings.find_one( + {"guild": before.guild.id, "setting": "mute"} + ) + verified = self.db.jarvis.settings.find_one( + {"guild": before.guild.id, "setting": "verified"} + ) + if ( + mute + and before.guild.get_role(mute["value"]) + in after.roles + ): + # TODO: User was muted + pass + elif ( + mute + and before.guild.get_role(mute["value"]) + in before.roles + ): + # TODO: User was unmuted + pass + elif ( + verified + and before.guild.get_role(verified["value"]) + in before.roles + ): + # TODO: User was verified + pass + channel = user.guild.get_channel(modlog["value"]) + await asyncio.sleep(0.5) # Need to wait for audit log + auditlog = await user.guild.audit_logs( + limit=50, + action=discord.AuditLogAction.kick, + after=datetime.utcnow() - timedelta(seconds=15), + oldest_first=False, + ) + log: discord.AuditLogEntry = self.get_latest_log( + auditlog, user + ) + fields = [ + Field( + name="Member", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field( + name="Moderator", + value=f"{user.mention} ({user.name}#{user.descriminator})", + ), + Field( + name="Reason", value=log.reason, inline=False + ), + ] + embed = build_embed( + title="User Kicked", + description=f"A user was kicked from {guild.name}", + color="#bf2a3e", + fields=fields, + timestamp=log.created_at, + ) + embed.set_author( + name=f"{user.name}#{user.discriminator} | {user.id}", + icon_url=user.avatar_url, + ) + + await channel.send(embed=embed) diff --git a/jarvis/cogs/util.py b/jarvis/cogs/util.py index 68e3e7b..eb1c3aa 100644 --- a/jarvis/cogs/util.py +++ b/jarvis/cogs/util.py @@ -60,7 +60,10 @@ class UtilCog(commands.Cog): guild_ids=[578757004059738142], option=[ create_option( - name="text", description="Text to camo-ify", option_type=3 + name="text", + description="Text to camo-ify", + option_type=3, + required=True, ) ], )