Split ModlogCog into numerous other cogs

This commit is contained in:
Zeva Rose 2021-07-25 16:29:23 -06:00
parent 98fa85b787
commit d108c910c2
4 changed files with 208 additions and 179 deletions

View file

@ -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))

View file

@ -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)

View file

@ -2,65 +2,20 @@ import asyncio
from datetime import datetime, timedelta from datetime import datetime, timedelta
import discord import discord
from discord import DMChannel
from discord.ext import commands from discord.ext import commands
from discord.utils import find 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.config import get_config
from jarvis.db.types import Ban, Kick, MongoSort, Mute, Setting from jarvis.db.types import Ban, Kick, MongoSort, Mute, Setting
from jarvis.utils import build_embed from jarvis.utils import build_embed
from jarvis.utils.field import Field from jarvis.utils.field import Field
class ModlogCog(commands.Cog): class ModlogMemberCog(commands.Cog):
""" def __init__(self, bot):
A hybrid user/modlog functionality for J.A.R.V.I.S.
"""
def __init__(self, bot: discord.ext.commands.Bot):
self.bot = 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() @commands.Cog.listener()
async def on_member_ban(self, guild: discord.Guild, user: discord.User): async def on_member_ban(self, guild: discord.Guild, user: discord.User):
modlog = Setting.get(guild=guild.id, setting="modlog") modlog = Setting.get(guild=guild.id, setting="modlog")
@ -73,7 +28,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, 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 admin: discord.User = log.user
if admin.id == get_config().client_id: if admin.id == get_config().client_id:
ban = Ban.get( ban = Ban.get(
@ -83,7 +38,7 @@ class ModlogCog(commands.Cog):
sort=MongoSort(key="created_at", type="desc"), sort=MongoSort(key="created_at", type="desc"),
) )
admin = guild.get_member(ban.admin) admin = guild.get_member(ban.admin)
embed = await self.modlog_embed( embed = await modlog_embed(
user, user,
admin, admin,
log, log,
@ -105,7 +60,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, 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 admin: discord.User = log.user
if admin.id == get_config().client_id: if admin.id == get_config().client_id:
ban = Ban.get( ban = Ban.get(
@ -115,7 +70,7 @@ class ModlogCog(commands.Cog):
sort=MongoSort(key="created_at", type="desc"), sort=MongoSort(key="created_at", type="desc"),
) )
admin = guild.get_member(ban.admin) admin = guild.get_member(ban.admin)
embed = await self.modlog_embed( embed = await modlog_embed(
user, user,
admin, admin,
log, log,
@ -137,7 +92,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, 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 admin: discord.User = log.user
if admin.id == get_config().client_id: if admin.id == get_config().client_id:
kick = Kick.get( kick = Kick.get(
@ -146,7 +101,7 @@ class ModlogCog(commands.Cog):
sort=MongoSort(key="created_at", type="desc"), sort=MongoSort(key="created_at", type="desc"),
) )
admin = user.guild.get_member(kick.admin) admin = user.guild.get_member(kick.admin)
embed = await self.modlog_embed( embed = await modlog_embed(
user, user,
admin, admin,
log, log,
@ -163,7 +118,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, oldest_first=False,
).flatten() ).flatten()
log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) log: discord.AuditLogEntry = get_latest_log(auditlog, before)
admin: discord.User = log.user admin: discord.User = log.user
if admin.id == get_config().client_id: if admin.id == get_config().client_id:
mute = Mute.get( mute = Mute.get(
@ -173,7 +128,7 @@ class ModlogCog(commands.Cog):
sort=MongoSort(key="created_at", type="desc"), sort=MongoSort(key="created_at", type="desc"),
) )
admin = before.guild.get_member(mute.admin) admin = before.guild.get_member(mute.admin)
return await self.modlog_embed( return await modlog_embed(
member=before, member=before,
admin=admin, admin=admin,
log=log, log=log,
@ -188,7 +143,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, oldest_first=False,
).flatten() ).flatten()
log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) log: discord.AuditLogEntry = get_latest_log(auditlog, before)
admin: discord.User = log.user admin: discord.User = log.user
if admin.id == get_config().client_id: if admin.id == get_config().client_id:
mute = Mute.get( mute = Mute.get(
@ -199,7 +154,7 @@ class ModlogCog(commands.Cog):
) )
mute = Mute(**mute) mute = Mute(**mute)
admin = before.guild.get_member(mute.admin) admin = before.guild.get_member(mute.admin)
return await self.modlog_embed( return await modlog_embed(
member=before, member=before,
admin=admin, admin=admin,
log=log, log=log,
@ -214,9 +169,9 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, oldest_first=False,
).flatten() ).flatten()
log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) log: discord.AuditLogEntry = get_latest_log(auditlog, before)
admin: discord.User = log.user admin: discord.User = log.user
return await self.modlog_embed( return await modlog_embed(
member=before, member=before,
admin=admin, admin=admin,
log=log, log=log,
@ -231,7 +186,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, oldest_first=False,
).flatten() ).flatten()
log: discord.AuditLogEntry = self.get_latest_log(auditlog, before) log: discord.AuditLogEntry = get_latest_log(auditlog, before)
admin: discord.User = log.user admin: discord.User = log.user
role = None role = None
title = "User Given Role" title = "User Given Role"
@ -243,7 +198,7 @@ class ModlogCog(commands.Cog):
elif len(before.roles) < len(after.roles): elif len(before.roles) < len(after.roles):
role = find(lambda x: x not in before.roles, after.roles) role = find(lambda x: x not in before.roles, after.roles)
role_text = role.mention if role else "||`[redacted]`||" role_text = role.mention if role else "||`[redacted]`||"
return await self.modlog_embed( return await modlog_embed(
member=before, member=before,
admin=admin, admin=admin,
log=log, log=log,
@ -279,9 +234,7 @@ class ModlogCog(commands.Cog):
after=datetime.utcnow() - timedelta(seconds=15), after=datetime.utcnow() - timedelta(seconds=15),
oldest_first=False, oldest_first=False,
).flatten() ).flatten()
log: discord.AuditLogEntry = self.get_latest_log( log: discord.AuditLogEntry = get_latest_log(auditlog, before)
auditlog, before
)
bname = before.nick if before.nick else before.name bname = before.nick if before.nick else before.name
aname = after.nick if after.nick else after.name aname = after.nick if after.nick else after.name
fields = [ fields = [
@ -327,117 +280,3 @@ class ModlogCog(commands.Cog):
embed = await self.process_rolechange(before, after) embed = await self.process_rolechange(before, after)
if embed: if embed:
await channel.send(embed=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))

View file

@ -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)