Split ModlogCog into numerous other cogs
This commit is contained in:
parent
98fa85b787
commit
d108c910c2
4 changed files with 208 additions and 179 deletions
56
jarvis/cogs/modlog/__init__.py
Normal file
56
jarvis/cogs/modlog/__init__.py
Normal 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))
|
58
jarvis/cogs/modlog/command.py
Normal file
58
jarvis/cogs/modlog/command.py
Normal 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)
|
|
@ -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))
|
76
jarvis/cogs/modlog/message.py
Normal file
76
jarvis/cogs/modlog/message.py
Normal 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)
|
Loading…
Add table
Reference in a new issue