fix(aurora): bandaid fixes so pylint passes

these are not good changes in the slightest and are only here because
pylint is failing otherwise, you should really be using aurora v3
instead of v2 even though it's in development
This commit is contained in:
cswimr 2025-03-28 10:13:14 -05:00
parent cc1745a9d2
commit 336e01456c
Signed by: cswimr
GPG key ID: 0EC431A8DA8F8087
2 changed files with 244 additions and 323 deletions

View file

@ -40,7 +40,7 @@ class Aurora(commands.Cog):
This cog stores all of its data in an SQLite database.""" This cog stores all of its data in an SQLite database."""
__author__ = ["cswimr"] __author__ = ["cswimr"]
__version__ = "2.1.3" __version__ = "2.1.4"
__documentation__ = "https://seacogs.coastalcommits.com/aurora/" __documentation__ = "https://seacogs.coastalcommits.com/aurora/"
async def red_delete_data_for_user(self, *, requester, user_id: int): async def red_delete_data_for_user(self, *, requester, user_id: int):
@ -70,7 +70,8 @@ class Aurora(commands.Cog):
await config.user_from_id(user_id).clear() await config.user_from_id(user_id).clear()
else: else:
logger.warning( logger.warning(
"Invalid requester passed to red_delete_data_for_user: %s", requester "Invalid requester passed to red_delete_data_for_user: %s",
requester,
) )
def __init__(self, bot: Red): def __init__(self, bot: Red):
@ -135,8 +136,7 @@ class Aurora(commands.Cog):
if await config.guild(entry.guild).ignore_other_bots() is True: if await config.guild(entry.guild).ignore_other_bots() is True:
if entry.user.bot or entry.target.bot: if entry.user.bot or entry.target.bot:
return return
else: elif entry.user.id == self.bot.user.id:
if entry.user.id == self.bot.user.id:
return return
duration = "NULL" duration = "NULL"
@ -159,10 +159,10 @@ class Aurora(commands.Cog):
elif entry.action == discord.AuditLogAction.member_update: elif entry.action == discord.AuditLogAction.member_update:
if entry.after.timed_out_until is not None: if entry.after.timed_out_until is not None:
timed_out_until_aware = entry.after.timed_out_until.replace( timed_out_until_aware = entry.after.timed_out_until.replace(
tzinfo=timezone.utc tzinfo=timezone.utc,
) )
duration_datetime = timed_out_until_aware - datetime.now( duration_datetime = timed_out_until_aware - datetime.now(
tz=timezone.utc tz=timezone.utc,
) )
minutes = round(duration_datetime.total_seconds() / 60) minutes = round(duration_datetime.total_seconds() / 60)
duration = timedelta(minutes=minutes) duration = timedelta(minutes=minutes)
@ -209,7 +209,7 @@ class Aurora(commands.Cog):
return return
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has recieved a note!\n**Reason** - `{reason}`" content=f"{target.mention} has recieved a note!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -239,7 +239,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has received a note! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has received a note! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -268,7 +268,7 @@ class Aurora(commands.Cog):
return return
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been warned!\n**Reason** - `{reason}`" content=f"{target.mention} has been warned!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -298,7 +298,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been warned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been warned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -342,7 +342,8 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration) parsed_time = parse_timedelta(duration)
if parsed_time is None: if parsed_time is None:
await interaction.response.send_message( await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True content=error("Please provide a valid duration!"),
ephemeral=True,
) )
return return
else: else:
@ -350,12 +351,15 @@ class Aurora(commands.Cog):
if role.id not in addrole_whitelist: if role.id not in addrole_whitelist:
await interaction.response.send_message( await interaction.response.send_message(
content=error("That role isn't whitelisted!"), ephemeral=True content=error("That role isn't whitelisted!"),
ephemeral=True,
) )
return return
if not await check_moddable( if not await check_moddable(
target, interaction, ["moderate_members", "manage_roles"] target,
interaction,
["moderate_members", "manage_roles"],
): ):
return return
@ -390,7 +394,7 @@ class Aurora(commands.Cog):
reason=f"Role added by {interaction.user.id}{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''} for: {reason}", reason=f"Role added by {interaction.user.id}{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''} for: {reason}",
) )
response: discord.WebhookMessage = await interaction.followup.send( response: discord.WebhookMessage = await interaction.followup.send(
content=f"{target.mention} has been given the {role.mention} role{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}!\n**Reason** - `{reason}`" content=f"{target.mention} has been given the {role.mention} role{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}!\n**Reason** - `{reason}`",
) )
moderation_id = await mysql_log( moderation_id = await mysql_log(
@ -448,7 +452,8 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration) parsed_time = parse_timedelta(duration)
if parsed_time is None: if parsed_time is None:
await interaction.response.send_message( await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True content=error("Please provide a valid duration!"),
ephemeral=True,
) )
return return
else: else:
@ -456,12 +461,15 @@ class Aurora(commands.Cog):
if role.id not in addrole_whitelist: if role.id not in addrole_whitelist:
await interaction.response.send_message( await interaction.response.send_message(
content=error("That role isn't whitelisted!"), ephemeral=True content=error("That role isn't whitelisted!"),
ephemeral=True,
) )
return return
if not await check_moddable( if not await check_moddable(
target, interaction, ["moderate_members", "manage_roles"] target,
interaction,
["moderate_members", "manage_roles"],
): ):
return return
@ -496,7 +504,7 @@ class Aurora(commands.Cog):
reason=f"Role removed by {interaction.user.id}{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''} for: {reason}", reason=f"Role removed by {interaction.user.id}{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''} for: {reason}",
) )
response: discord.WebhookMessage = await interaction.followup.send( response: discord.WebhookMessage = await interaction.followup.send(
content=f"{target.mention} has had the {role.mention} role removed{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}!\n**Reason** - `{reason}`" content=f"{target.mention} has had the {role.mention} role removed{' for ' + humanize_timedelta(timedelta=parsed_time) if parsed_time != 'NULL' else ''}!\n**Reason** - `{reason}`",
) )
moderation_id = await mysql_log( moderation_id = await mysql_log(
@ -553,21 +561,24 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration, maximum=timedelta(days=28)) parsed_time = parse_timedelta(duration, maximum=timedelta(days=28))
if parsed_time is None: if parsed_time is None:
await interaction.response.send_message( await interaction.response.send_message(
error("Please provide a valid duration!"), ephemeral=True error("Please provide a valid duration!"),
ephemeral=True,
) )
return return
except commands.BadArgument: except commands.BadArgument:
await interaction.response.send_message( await interaction.response.send_message(
error("Please provide a duration that is less than 28 days."), ephemeral=True error("Please provide a duration that is less than 28 days."),
ephemeral=True,
) )
return return
await target.timeout( await target.timeout(
parsed_time, reason=f"Muted by {interaction.user.id} for: {reason}" parsed_time,
reason=f"Muted by {interaction.user.id} for: {reason}",
) )
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`" content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -598,7 +609,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been muted for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -636,14 +647,15 @@ class Aurora(commands.Cog):
if reason: if reason:
await target.timeout( await target.timeout(
None, reason=f"Unmuted by {interaction.user.id} for: {reason}" None,
reason=f"Unmuted by {interaction.user.id} for: {reason}",
) )
else: else:
await target.timeout(None, reason=f"Unbanned by {interaction.user.id}") await target.timeout(None, reason=f"Unbanned by {interaction.user.id}")
reason = "No reason given." reason = "No reason given."
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been unmuted!\n**Reason** - `{reason}`" content=f"{target.mention} has been unmuted!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -673,7 +685,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been unmuted! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been unmuted! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -702,7 +714,7 @@ class Aurora(commands.Cog):
return return
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been kicked!\n**Reason** - `{reason}`" content=f"{target.mention} has been kicked!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -734,7 +746,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been kicked! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been kicked! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -750,7 +762,7 @@ class Aurora(commands.Cog):
Choice(name="1 Day", value=86400), Choice(name="1 Day", value=86400),
Choice(name="3 Days", value=259200), Choice(name="3 Days", value=259200),
Choice(name="7 Days", value=604800), Choice(name="7 Days", value=604800),
] ],
) )
async def ban( async def ban(
self, self,
@ -786,7 +798,8 @@ class Aurora(commands.Cog):
try: try:
await interaction.guild.fetch_ban(target) await interaction.guild.fetch_ban(target)
await interaction.response.send_message( await interaction.response.send_message(
content=error(f"{target.mention} is already banned!"), ephemeral=True content=error(f"{target.mention} is already banned!"),
ephemeral=True,
) )
return return
except discord.errors.NotFound: except discord.errors.NotFound:
@ -796,19 +809,21 @@ class Aurora(commands.Cog):
parsed_time = parse_relativedelta(duration) parsed_time = parse_relativedelta(duration)
if parsed_time is None: if parsed_time is None:
await interaction.response.send_message( await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True content=error("Please provide a valid duration!"),
ephemeral=True,
) )
return return
try: try:
parsed_time = timedelta_from_relativedelta(parsed_time) parsed_time = timedelta_from_relativedelta(parsed_time)
except ValueError: except ValueError:
await interaction.response.send_message( await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True content=error("Please provide a valid duration!"),
ephemeral=True,
) )
return return
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`" content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}!\n**Reason** - `{reason}`",
) )
try: try:
@ -842,7 +857,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been banned for {humanize_timedelta(timedelta=parsed_time)}! (Case `#{moderation_id}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -850,7 +865,7 @@ class Aurora(commands.Cog):
await send_evidenceformat(interaction, case) await send_evidenceformat(interaction, case)
else: else:
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been banned!\n**Reason** - `{reason}`" content=f"{target.mention} has been banned!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -886,7 +901,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been banned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been banned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -918,22 +933,25 @@ class Aurora(commands.Cog):
await interaction.guild.fetch_ban(target) await interaction.guild.fetch_ban(target)
except discord.errors.NotFound: except discord.errors.NotFound:
await interaction.response.send_message( await interaction.response.send_message(
content=error(f"{target.mention} is not banned!"), ephemeral=True content=error(f"{target.mention} is not banned!"),
ephemeral=True,
) )
return return
if reason: if reason:
await interaction.guild.unban( await interaction.guild.unban(
target, reason=f"Unbanned by {interaction.user.id} for: {reason}" target,
reason=f"Unbanned by {interaction.user.id} for: {reason}",
) )
else: else:
await interaction.guild.unban( await interaction.guild.unban(
target, reason=f"Unbanned by {interaction.user.id}" target,
reason=f"Unbanned by {interaction.user.id}",
) )
reason = "No reason given." reason = "No reason given."
await interaction.response.send_message( await interaction.response.send_message(
content=f"{target.mention} has been unbanned!\n**Reason** - `{reason}`" content=f"{target.mention} has been unbanned!\n**Reason** - `{reason}`",
) )
if silent is None: if silent is None:
@ -963,7 +981,7 @@ class Aurora(commands.Cog):
reason, reason,
) )
await interaction.edit_original_response( await interaction.edit_original_response(
content=f"{target.mention} has been unbanned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`" content=f"{target.mention} has been unbanned! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`",
) )
await log(interaction, moderation_id) await log(interaction, moderation_id)
@ -1001,42 +1019,28 @@ class Aurora(commands.Cog):
export: bool export: bool
Exports the server's entire moderation history to a JSON file""" Exports the server's entire moderation history to a JSON file"""
if ephemeral is None: if ephemeral is None:
ephemeral = ( ephemeral = await config.user(interaction.user).history_ephemeral() or await config.guild(interaction.guild).history_ephemeral() or False
await config.user(interaction.user).history_ephemeral()
or await config.guild(interaction.guild).history_ephemeral()
or False
)
if inline is None: if inline is None:
inline = ( inline = await config.user(interaction.user).history_inline() or await config.guild(interaction.guild).history_inline() or False
await config.user(interaction.user).history_inline()
or await config.guild(interaction.guild).history_inline()
or False
)
if pagesize is None: if pagesize is None:
if inline is True: if inline is True:
pagesize = ( pagesize = await config.user(interaction.user).history_inline_pagesize() or await config.guild(interaction.guild).history_inline_pagesize() or 6
await config.user(interaction.user).history_inline_pagesize()
or await config.guild(interaction.guild).history_inline_pagesize()
or 6
)
else: else:
pagesize = ( pagesize = await config.user(interaction.user).history_pagesize() or await config.guild(interaction.guild).history_pagesize() or 5
await config.user(interaction.user).history_pagesize()
or await config.guild(interaction.guild).history_pagesize()
or 5
)
await interaction.response.defer(ephemeral=ephemeral) await interaction.response.defer(ephemeral=ephemeral)
permissions = check_permissions( permissions = check_permissions(
interaction.client.user, ["embed_links"], interaction interaction.client.user,
["embed_links"],
interaction,
) )
if permissions: if permissions:
await interaction.followup.send( await interaction.followup.send(
error( error(
f"I do not have the `{permissions}` permission, required for this action." f"I do not have the `{permissions}` permission, required for this action.",
), ),
ephemeral=True, ephemeral=True,
) )
@ -1061,18 +1065,15 @@ class Aurora(commands.Cog):
cases.append(case) cases.append(case)
try: try:
filename = ( filename = str(data_manager.cog_data_path(cog_instance=self)) + str(os.sep) + f"moderation_{interaction.guild.id}.json"
str(data_manager.cog_data_path(cog_instance=self))
+ str(os.sep)
+ f"moderation_{interaction.guild.id}.json"
)
with open(filename, "w", encoding="utf-8") as f: with open(filename, "w", encoding="utf-8") as f:
json.dump(cases, f, indent=2) json.dump(cases, f, indent=2)
await interaction.followup.send( await interaction.followup.send(
file=discord.File( file=discord.File(
filename, f"moderation_{interaction.guild.id}.json" filename,
f"moderation_{interaction.guild.id}.json",
), ),
ephemeral=ephemeral, ephemeral=ephemeral,
) )
@ -1081,7 +1082,7 @@ class Aurora(commands.Cog):
except json.JSONDecodeError as e: except json.JSONDecodeError as e:
await interaction.followup.send( await interaction.followup.send(
content=error( content=error(
"An error occured while exporting the moderation history.\nError:\n" "An error occured while exporting the moderation history.\nError:\n",
) )
+ box(e, "py"), + box(e, "py"),
ephemeral=ephemeral, ephemeral=ephemeral,
@ -1127,7 +1128,7 @@ class Aurora(commands.Cog):
embed = discord.Embed(color=await self.bot.get_embed_color(interaction.channel)) embed = discord.Embed(color=await self.bot.get_embed_color(interaction.channel))
embed.set_author(icon_url=interaction.guild.icon.url, name="Infraction History") embed.set_author(icon_url=interaction.guild.icon.url, name="Infraction History")
embed.set_footer( embed.set_footer(
text=f"Page {page:,}/{page_quantity:,} | {case_quantity:,} Results" text=f"Page {page:,}/{page_quantity:,} | {case_quantity:,} Results",
) )
memory_dict = {} memory_dict = {}
@ -1136,33 +1137,30 @@ class Aurora(commands.Cog):
if case["target_id"] not in memory_dict: if case["target_id"] not in memory_dict:
if case["target_type"] == "USER": if case["target_type"] == "USER":
memory_dict[str(case["target_id"])] = await fetch_user_dict( memory_dict[str(case["target_id"])] = await fetch_user_dict(
interaction.client, case["target_id"] interaction.client,
case["target_id"],
) )
elif case["target_type"] == "CHANNEL": elif case["target_type"] == "CHANNEL":
memory_dict[str(case["target_id"])] = await fetch_channel_dict( memory_dict[str(case["target_id"])] = await fetch_channel_dict(
interaction.guild, case["target_id"] interaction.guild,
case["target_id"],
) )
target_user = memory_dict[str(case["target_id"])] target_user = memory_dict[str(case["target_id"])]
if case["target_type"] == "USER": if case["target_type"] == "USER":
target_name = ( target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
elif case["target_type"] == "CHANNEL": elif case["target_type"] == "CHANNEL":
target_name = f"`{target_user['mention']}`" target_name = f"`{target_user['mention']}`"
else:
target_name = ""
if case["moderator_id"] not in memory_dict: if case["moderator_id"] not in memory_dict:
memory_dict[str(case["moderator_id"])] = await fetch_user_dict( memory_dict[str(case["moderator_id"])] = await fetch_user_dict(
interaction.client, case["moderator_id"] interaction.client,
case["moderator_id"],
) )
moderator_user = memory_dict[str(case["moderator_id"])] moderator_user = memory_dict[str(case["moderator_id"])]
moderator_name = ( moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
field_name = f"Case #{case['moderation_id']:,} ({str.title(case['moderation_type'])})" field_name = f"Case #{case['moderation_id']:,} ({str.title(case['moderation_type'])})"
field_value = f"**Target:** {target_name} ({target_user['id']})\n**Moderator:** {moderator_name} ({moderator_user['id']})" field_value = f"**Target:** {target_name} ({target_user['id']})\n**Moderator:** {moderator_name} ({moderator_user['id']})"
@ -1177,20 +1175,15 @@ class Aurora(commands.Cog):
**{ **{
unit: int(val) unit: int(val)
for unit, val in zip( for unit, val in zip(
["hours", "minutes", "seconds"], case["duration"].split(":") ["hours", "minutes", "seconds"],
case["duration"].split(":"),
) )
} },
)
duration_embed = (
f"{humanize_timedelta(timedelta=td)} | <t:{case['end_timestamp']}:R>"
if bool(case["expired"]) is False
else f"{humanize_timedelta(timedelta=td)} | Expired"
) )
duration_embed = f"{humanize_timedelta(timedelta=td)} | <t:{case['end_timestamp']}:R>" if bool(case["expired"]) is False else f"{humanize_timedelta(timedelta=td)} | Expired"
field_value += f"\n**Duration:** {duration_embed}" field_value += f"\n**Duration:** {duration_embed}"
field_value += ( field_value += f"\n**Timestamp:** <t:{case['timestamp']}> | <t:{case['timestamp']}:R>"
f"\n**Timestamp:** <t:{case['timestamp']}> | <t:{case['timestamp']}:R>"
)
if case["role_id"] != "0": if case["role_id"] != "0":
role = interaction.guild.get_role(int(case["role_id"])) role = interaction.guild.get_role(int(case["role_id"]))
@ -1208,7 +1201,10 @@ class Aurora(commands.Cog):
@app_commands.command(name="resolve") @app_commands.command(name="resolve")
async def resolve( async def resolve(
self, interaction: discord.Interaction, case: int, reason: str = None self,
interaction: discord.Interaction,
case: int,
reason: str = None,
): ):
"""Resolve a specific case. """Resolve a specific case.
@ -1226,7 +1222,7 @@ class Aurora(commands.Cog):
if permissions: if permissions:
await interaction.response.send_message( await interaction.response.send_message(
error( error(
f"I do not have the `{permissions}` permission, required for this action." f"I do not have the `{permissions}` permission, required for this action.",
), ),
ephemeral=True, ephemeral=True,
) )
@ -1235,9 +1231,7 @@ class Aurora(commands.Cog):
database = connect() database = connect()
cursor = database.cursor() cursor = database.cursor()
query_1 = ( query_1 = f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ?;"
f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ?;"
)
cursor.execute(query_1, (case,)) cursor.execute(query_1, (case,))
result_1 = cursor.fetchone() result_1 = cursor.fetchone()
if result_1 is None or case == 0: if result_1 is None or case == 0:
@ -1253,7 +1247,7 @@ class Aurora(commands.Cog):
if result_2 is None: if result_2 is None:
await interaction.response.send_message( await interaction.response.send_message(
content=error( content=error(
f"This moderation has already been resolved!\nUse `/case {case}` for more information." f"This moderation has already been resolved!\nUse `/case {case}` for more information.",
), ),
ephemeral=True, ephemeral=True,
) )
@ -1267,7 +1261,7 @@ class Aurora(commands.Cog):
if len(changes) > 25: if len(changes) > 25:
await interaction.response.send_message( await interaction.response.send_message(
content=error( content=error(
"Due to limitations with Discord's embed system, you cannot edit a case more than 25 times." "Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.",
), ),
ephemeral=True, ephemeral=True,
) )
@ -1279,7 +1273,7 @@ class Aurora(commands.Cog):
"timestamp": case_dict["timestamp"], "timestamp": case_dict["timestamp"],
"reason": case_dict["reason"], "reason": case_dict["reason"],
"user_id": case_dict["moderator_id"], "user_id": case_dict["moderator_id"],
} },
) )
changes.append( changes.append(
{ {
@ -1287,7 +1281,7 @@ class Aurora(commands.Cog):
"timestamp": int(time.time()), "timestamp": int(time.time()),
"reason": reason, "reason": reason,
"user_id": interaction.user.id, "user_id": interaction.user.id,
} },
) )
if case_dict["moderation_type"] in ["UNMUTE", "UNBAN"]: if case_dict["moderation_type"] in ["UNMUTE", "UNBAN"]:
@ -1301,11 +1295,12 @@ class Aurora(commands.Cog):
if case_dict["moderation_type"] == "MUTE": if case_dict["moderation_type"] == "MUTE":
try: try:
member = await interaction.guild.fetch_member( member = await interaction.guild.fetch_member(
case_dict["target_id"] case_dict["target_id"],
) )
await member.timeout( await member.timeout(
None, reason=f"Case #{case:,} resolved by {interaction.user.id}" None,
reason=f"Case #{case:,} resolved by {interaction.user.id}",
) )
except discord.NotFound: except discord.NotFound:
pass pass
@ -1315,7 +1310,8 @@ class Aurora(commands.Cog):
user = await interaction.client.fetch_user(case_dict["target_id"]) user = await interaction.client.fetch_user(case_dict["target_id"])
await interaction.guild.unban( await interaction.guild.unban(
user, reason=f"Case #{case} resolved by {interaction.user.id}" user,
reason=f"Case #{case} resolved by {interaction.user.id}",
) )
except discord.NotFound: except discord.NotFound:
pass pass
@ -1340,7 +1336,8 @@ class Aurora(commands.Cog):
case_dict=await fetch_case(case, interaction.guild.id), case_dict=await fetch_case(case, interaction.guild.id),
) )
await interaction.response.send_message( await interaction.response.send_message(
content=f"✅ Moderation #{case:,} resolved!", embed=embed content=f"✅ Moderation #{case:,} resolved!",
embed=embed,
) )
await log(interaction, case, resolved=True) await log(interaction, case, resolved=True)
@ -1352,7 +1349,7 @@ class Aurora(commands.Cog):
export=[ export=[
Choice(name="Export as File", value="file"), Choice(name="Export as File", value="file"),
Choice(name="Export as Codeblock", value="codeblock"), Choice(name="Export as Codeblock", value="codeblock"),
] ],
) )
async def case( async def case(
self, self,
@ -1376,41 +1373,35 @@ class Aurora(commands.Cog):
export: bool export: bool
Export the case to a JSON file or codeblock""" Export the case to a JSON file or codeblock"""
permissions = check_permissions( permissions = check_permissions(
interaction.client.user, ["embed_links"], interaction interaction.client.user,
["embed_links"],
interaction,
) )
if permissions: if permissions:
await interaction.response.send_message( await interaction.response.send_message(
error( error(
f"I do not have the `{permissions}` permission, required for this action." f"I do not have the `{permissions}` permission, required for this action.",
), ),
ephemeral=True, ephemeral=True,
) )
return return
if ephemeral is None: if ephemeral is None:
ephemeral = ( ephemeral = await config.user(interaction.user).history_ephemeral() or await config.guild(interaction.guild).history_ephemeral() or False
await config.user(interaction.user).history_ephemeral()
or await config.guild(interaction.guild).history_ephemeral()
or False
)
if case != 0: if case != 0:
case_dict = await fetch_case(case, interaction.guild.id) case_dict = await fetch_case(case, interaction.guild.id)
if case_dict: if case_dict:
if export: if export:
if export.value == "file" or len(str(case_dict)) > 1800: if export.value == "file" or len(str(case_dict)) > 1800:
filename = ( filename = str(data_manager.cog_data_path(cog_instance=self)) + str(os.sep) + f"moderation_{interaction.guild.id}_case_{case}.json"
str(data_manager.cog_data_path(cog_instance=self))
+ str(os.sep)
+ f"moderation_{interaction.guild.id}_case_{case}.json"
)
with open(filename, "w", encoding="utf-8") as f: with open(filename, "w", encoding="utf-8") as f:
json.dump(case_dict, f, indent=2) json.dump(case_dict, f, indent=2)
if export.value == "codeblock": if export.value == "codeblock":
content = f"Case #{case:,} exported.\n" + warning( content = f"Case #{case:,} exported.\n" + warning(
"Case was too large to export as codeblock, so it has been uploaded as a `.json` file." "Case was too large to export as codeblock, so it has been uploaded as a `.json` file.",
) )
else: else:
content = f"Case #{case:,} exported." content = f"Case #{case:,} exported."
@ -1427,34 +1418,41 @@ class Aurora(commands.Cog):
os.remove(filename) os.remove(filename)
return return
await interaction.response.send_message( await interaction.response.send_message(
content=box(json.dumps(case_dict, indent=2), 'json'), content=box(json.dumps(case_dict, indent=2), "json"),
ephemeral=ephemeral, ephemeral=ephemeral,
) )
return return
if changes: if changes:
embed = await changes_factory( embed = await changes_factory(
interaction=interaction, case_dict=case_dict interaction=interaction,
case_dict=case_dict,
) )
await interaction.response.send_message( await interaction.response.send_message(
embed=embed, ephemeral=ephemeral embed=embed,
ephemeral=ephemeral,
) )
elif evidenceformat: elif evidenceformat:
content = await evidenceformat_factory( content = await evidenceformat_factory(
interaction=interaction, case_dict=case_dict interaction=interaction,
case_dict=case_dict,
) )
await interaction.response.send_message( await interaction.response.send_message(
content=content, ephemeral=ephemeral content=content,
ephemeral=ephemeral,
) )
else: else:
embed = await case_factory( embed = await case_factory(
interaction=interaction, case_dict=case_dict interaction=interaction,
case_dict=case_dict,
) )
await interaction.response.send_message( await interaction.response.send_message(
embed=embed, ephemeral=ephemeral embed=embed,
ephemeral=ephemeral,
) )
return return
await interaction.response.send_message( await interaction.response.send_message(
content=f"No case with case number `{case}` found.", ephemeral=True content=f"No case with case number `{case}` found.",
ephemeral=True,
) )
@app_commands.command(name="edit") @app_commands.command(name="edit")
@ -1476,13 +1474,16 @@ class Aurora(commands.Cog):
duration: str duration: str
What is the new duration? Does not reapply the moderation if it has already expired. What is the new duration? Does not reapply the moderation if it has already expired.
""" """
end_timestamp = None
permissions = check_permissions( permissions = check_permissions(
interaction.client.user, ["embed_links"], interaction interaction.client.user,
["embed_links"],
interaction,
) )
if permissions: if permissions:
await interaction.response.send_message( await interaction.response.send_message(
error( error(
f"I do not have the `{permissions}` permission, required for this action." f"I do not have the `{permissions}` permission, required for this action.",
), ),
ephemeral=True, ephemeral=True,
) )
@ -1496,26 +1497,25 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration) parsed_time = parse_timedelta(duration)
if parsed_time is None: if parsed_time is None:
await interaction.response.send_message( await interaction.response.send_message(
error("Please provide a valid duration!"), ephemeral=True error("Please provide a valid duration!"),
ephemeral=True,
) )
return return
end_timestamp = case_dict["timestamp"] + parsed_time.total_seconds() end_timestamp = case_dict["timestamp"] + parsed_time.total_seconds()
if case_dict["moderation_type"] == "MUTE": if case_dict["moderation_type"] == "MUTE":
if ( if (time.time() - case_dict["timestamp"]) + parsed_time.total_seconds() > 2419200:
time.time() - case_dict["timestamp"]
) + parsed_time.total_seconds() > 2419200:
await interaction.response.send_message( await interaction.response.send_message(
error( error(
"Please provide a duration that is less than 28 days from the initial moderation." "Please provide a duration that is less than 28 days from the initial moderation.",
) ),
) )
return return
try: try:
member = await interaction.guild.fetch_member( member = await interaction.guild.fetch_member(
case_dict["target_id"] case_dict["target_id"],
) )
await member.timeout( await member.timeout(
@ -1529,7 +1529,7 @@ class Aurora(commands.Cog):
if len(changes) > 25: if len(changes) > 25:
await interaction.response.send_message( await interaction.response.send_message(
content=error( content=error(
"Due to limitations with Discord's embed system, you cannot edit a case more than 25 times." "Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.",
), ),
ephemeral=True, ephemeral=True,
) )
@ -1543,9 +1543,10 @@ class Aurora(commands.Cog):
"user_id": case_dict["moderator_id"], "user_id": case_dict["moderator_id"],
"duration": case_dict["duration"], "duration": case_dict["duration"],
"end_timestamp": case_dict["end_timestamp"], "end_timestamp": case_dict["end_timestamp"],
} },
) )
if parsed_time: if parsed_time:
assert end_timestamp is not None
changes.append( changes.append(
{ {
"type": "EDIT", "type": "EDIT",
@ -1554,7 +1555,7 @@ class Aurora(commands.Cog):
"user_id": interaction.user.id, "user_id": interaction.user.id,
"duration": convert_timedelta_to_str(parsed_time), "duration": convert_timedelta_to_str(parsed_time),
"end_timestamp": end_timestamp, "end_timestamp": end_timestamp,
} },
) )
else: else:
changes.append( changes.append(
@ -1565,7 +1566,7 @@ class Aurora(commands.Cog):
"user_id": interaction.user.id, "user_id": interaction.user.id,
"duration": case_dict["duration"], "duration": case_dict["duration"],
"end_timestamp": case_dict["end_timestamp"], "end_timestamp": case_dict["end_timestamp"],
} },
) )
database = connect() database = connect()
@ -1602,7 +1603,8 @@ class Aurora(commands.Cog):
database.close() database.close()
return return
await interaction.response.send_message( await interaction.response.send_message(
content=error(f"No case with case number `{case}` found."), ephemeral=True content=error(f"No case with case number `{case}` found."),
ephemeral=True,
) )
@tasks.loop(minutes=1) @tasks.loop(minutes=1)
@ -1634,14 +1636,11 @@ class Aurora(commands.Cog):
unban_num = 0 unban_num = 0
for target_id, moderation_id in zip(target_ids, moderation_ids): for target_id, moderation_id in zip(target_ids, moderation_ids):
user: discord.User = await self.bot.fetch_user(target_id) user: discord.User = await self.bot.fetch_user(target_id)
name = ( name = f"{user.name}#{user.discriminator}" if user.discriminator != "0" else user.name
f"{user.name}#{user.discriminator}"
if user.discriminator != "0"
else user.name
)
try: try:
await guild.unban( await guild.unban(
user, reason=f"Automatic unban from case #{moderation_id}" user,
reason=f"Automatic unban from case #{moderation_id}",
) )
embed = await message_factory( embed = await message_factory(
@ -1690,13 +1689,16 @@ class Aurora(commands.Cog):
role_ids = [row[2] for row in result] role_ids = [row[2] for row in result]
for target_id, moderation_id, role_id in zip( for target_id, moderation_id, role_id in zip(
target_ids, moderation_ids, role_ids target_ids,
moderation_ids,
role_ids,
): ):
try: try:
member = await guild.fetch_member(target_id) member = await guild.fetch_member(target_id)
await member.remove_roles( await member.remove_roles(
Object(role_id), reason=f"Automatic role removal from case #{moderation_id}" Object(role_id),
reason=f"Automatic role removal from case #{moderation_id}",
) )
removerole_num = removerole_num + 1 removerole_num = removerole_num + 1
@ -1725,13 +1727,16 @@ class Aurora(commands.Cog):
role_ids = [row[2] for row in result] role_ids = [row[2] for row in result]
for target_id, moderation_id, role_id in zip( for target_id, moderation_id, role_id in zip(
target_ids, moderation_ids, role_ids target_ids,
moderation_ids,
role_ids,
): ):
try: try:
member = await guild.fetch_member(target_id) member = await guild.fetch_member(target_id)
await member.add_roles( await member.add_roles(
Object(role_id), reason=f"Automatic role addition from case #{moderation_id}" Object(role_id),
reason=f"Automatic role addition from case #{moderation_id}",
) )
addrole_num = addrole_num + 1 addrole_num = addrole_num + 1
@ -1827,15 +1832,11 @@ class Aurora(commands.Cog):
@commands.admin() @commands.admin()
async def aurora_import_aurora(self, ctx: commands.Context): async def aurora_import_aurora(self, ctx: commands.Context):
"""Import moderation history from another bot using Aurora.""" """Import moderation history from another bot using Aurora."""
if ( if ctx.message.attachments and ctx.message.attachments[0].content_type == "application/json; charset=utf-8":
ctx.message.attachments
and ctx.message.attachments[0].content_type
== "application/json; charset=utf-8"
):
message = await ctx.send( message = await ctx.send(
warning( warning(
"Are you sure you want to import moderations from another bot?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*" "Are you sure you want to import moderations from another bot?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*",
) ),
) )
await message.edit(view=ImportAuroraView(60, ctx, message)) await message.edit(view=ImportAuroraView(60, ctx, message))
else: else:
@ -1845,20 +1846,16 @@ class Aurora(commands.Cog):
@commands.admin() @commands.admin()
async def aurora_import_galacticbot(self, ctx: commands.Context): async def aurora_import_galacticbot(self, ctx: commands.Context):
"""Import moderation history from GalacticBot.""" """Import moderation history from GalacticBot."""
if ( if ctx.message.attachments and ctx.message.attachments[0].content_type == "application/json; charset=utf-8":
ctx.message.attachments
and ctx.message.attachments[0].content_type
== "application/json; charset=utf-8"
):
message = await ctx.send( message = await ctx.send(
warning( warning(
"Are you sure you want to import GalacticBot moderations?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*" "Are you sure you want to import GalacticBot moderations?\n**This will overwrite any moderations that already exist in this guild's moderation table.**\n*The import process will block the rest of your bot until it is complete.*",
) ),
) )
await message.edit(view=ImportGalacticBotView(60, ctx, message)) await message.edit(view=ImportGalacticBotView(60, ctx, message))
else: else:
await ctx.send( await ctx.send(
error("Please provide a valid GalacticBot moderation export file.") error("Please provide a valid GalacticBot moderation export file."),
) )
@aurora.command(aliases=["tdc", "td", "timedeltaconvert"]) @aurora.command(aliases=["tdc", "td", "timedeltaconvert"])

View file

@ -75,7 +75,9 @@ async def message_factory(
if await config.guild(guild).show_moderator() and moderator is not None: if await config.guild(guild).show_moderator() and moderator is not None:
embed.add_field( embed.add_field(
name="Moderator", value=f"`{moderator.name} ({moderator.id})`", inline=False name="Moderator",
value=f"`{moderator.name} ({moderator.id})`",
inline=False,
) )
embed.add_field(name="Reason", value=f"`{reason}`", inline=False) embed.add_field(name="Reason", value=f"`{reason}`", inline=False)
@ -94,7 +96,9 @@ async def message_factory(
async def log_factory( async def log_factory(
interaction: Interaction, case_dict: dict, resolved: bool = False interaction: Interaction,
case_dict: dict,
resolved: bool = False,
) -> Embed: ) -> Embed:
"""This function creates a log embed from set parameters, meant for moderation logging. """This function creates a log embed from set parameters, meant for moderation logging.
@ -103,14 +107,11 @@ async def log_factory(
case_dict (dict): The case dictionary. case_dict (dict): The case dictionary.
resolved (bool, optional): Whether the case is resolved or not. Defaults to False. resolved (bool, optional): Whether the case is resolved or not. Defaults to False.
""" """
target_name = ""
if resolved: if resolved:
if case_dict["target_type"] == "USER": if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = ( target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
elif case_dict["target_type"] == "CHANNEL": elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
if target_user["mention"]: if target_user["mention"]:
@ -119,11 +120,7 @@ async def log_factory(
target_name = f"`{target_user['name']}`" target_name = f"`{target_user['name']}`"
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = ( moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
embed = Embed( embed = Embed(
title=f"📕 Case #{case_dict['moderation_id']:,} Resolved", title=f"📕 Case #{case_dict['moderation_id']:,} Resolved",
@ -140,40 +137,24 @@ async def log_factory(
["hours", "minutes", "seconds"], ["hours", "minutes", "seconds"],
case_dict["duration"].split(":"), case_dict["duration"].split(":"),
) )
} },
)
duration_embed = (
f"{humanize_timedelta(timedelta=td)} | <t:{case_dict['end_timestamp']}:R>"
if case_dict["expired"] == "0"
else str(humanize_timedelta(timedelta=td))
)
embed.description = (
embed.description
+ f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}"
) )
duration_embed = f"{humanize_timedelta(timedelta=td)} | <t:{case_dict['end_timestamp']}:R>" if case_dict["expired"] == "0" else str(humanize_timedelta(timedelta=td))
embed.description = embed.description + f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}"
embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False) embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False)
resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"]) resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"])
resolved_name = ( resolved_name = resolved_user["name"] if resolved_user["discriminator"] == "0" else f"{resolved_user['name']}#{resolved_user['discriminator']}"
resolved_user["name"]
if resolved_user["discriminator"] == "0"
else f"{resolved_user['name']}#{resolved_user['discriminator']}"
)
embed.add_field( embed.add_field(
name="Resolve Reason", name="Resolve Reason",
value=f"Resolved by `{resolved_name}` ({resolved_user['id']}) for:\n" value=f"Resolved by `{resolved_name}` ({resolved_user['id']}) for:\n" + box(case_dict["resolve_reason"]),
+ box(case_dict["resolve_reason"]),
inline=False, inline=False,
) )
else: else:
if case_dict["target_type"] == "USER": if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = ( target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
elif case_dict["target_type"] == "CHANNEL": elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
if target_user["mention"]: if target_user["mention"]:
@ -182,11 +163,7 @@ async def log_factory(
target_name = f"`{target_user['name']}`" target_name = f"`{target_user['name']}`"
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = ( moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
embed = Embed( embed = Embed(
title=f"📕 Case #{case_dict['moderation_id']:,}", title=f"📕 Case #{case_dict['moderation_id']:,}",
@ -202,12 +179,9 @@ async def log_factory(
["hours", "minutes", "seconds"], ["hours", "minutes", "seconds"],
case_dict["duration"].split(":"), case_dict["duration"].split(":"),
) )
} },
)
embed.description = (
embed.description
+ f"\n**Duration:** {humanize_timedelta(timedelta=td)} | <t:{case_dict['end_timestamp']}:R>"
) )
embed.description = embed.description + f"\n**Duration:** {humanize_timedelta(timedelta=td)} | <t:{case_dict['end_timestamp']}:R>"
embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False) embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False)
return embed return embed
@ -220,13 +194,10 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed:
interaction (Interaction): The interaction object. interaction (Interaction): The interaction object.
case_dict (dict): The case dictionary. case_dict (dict): The case dictionary.
""" """
target_name = ""
if case_dict["target_type"] == "USER": if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = ( target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
elif case_dict["target_type"] == "CHANNEL": elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
if target_user["mention"]: if target_user["mention"]:
@ -235,11 +206,7 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed:
target_name = f"`{target_user['name']}`" target_name = f"`{target_user['name']}`"
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = ( moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
embed = Embed( embed = Embed(
title=f"📕 Case #{case_dict['moderation_id']:,}", title=f"📕 Case #{case_dict['moderation_id']:,}",
@ -252,41 +219,28 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed:
**{ **{
unit: int(val) unit: int(val)
for unit, val in zip( for unit, val in zip(
["hours", "minutes", "seconds"], case_dict["duration"].split(":") ["hours", "minutes", "seconds"],
case_dict["duration"].split(":"),
) )
} },
)
duration_embed = (
f"{humanize_timedelta(timedelta=td)} | <t:{case_dict['end_timestamp']}:R>"
if bool(case_dict["expired"]) is False
else str(humanize_timedelta(timedelta=td))
) )
duration_embed = f"{humanize_timedelta(timedelta=td)} | <t:{case_dict['end_timestamp']}:R>" if bool(case_dict["expired"]) is False else str(humanize_timedelta(timedelta=td))
embed.description += f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}" embed.description += f"\n**Duration:** {duration_embed}\n**Expired:** {bool(case_dict['expired'])}"
embed.description += ( embed.description += f"\n**Changes:** {len(case_dict['changes']) - 1}" if case_dict["changes"] else "\n**Changes:** 0"
f"\n**Changes:** {len(case_dict['changes']) - 1}"
if case_dict["changes"]
else "\n**Changes:** 0"
)
if case_dict["role_id"]: if case_dict["role_id"]:
embed.description += f"\n**Role:** <@&{case_dict['role_id']}>" embed.description += f"\n**Role:** <@&{case_dict['role_id']}>"
if case_dict["metadata"]: if case_dict["metadata"]:
if case_dict["metadata"]["imported_from"]: if case_dict["metadata"]["imported_from"]:
embed.description += ( embed.description += f"\n**Imported From:** {case_dict['metadata']['imported_from']}"
f"\n**Imported From:** {case_dict['metadata']['imported_from']}"
)
embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False) embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False)
if case_dict["resolved"] == 1: if case_dict["resolved"] == 1:
resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"]) resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"])
resolved_name = ( resolved_name = f"`{resolved_user['name']}`" if resolved_user["discriminator"] == "0" else f"`{resolved_user['name']}#{resolved_user['discriminator']}`"
f"`{resolved_user['name']}`"
if resolved_user["discriminator"] == "0"
else f"`{resolved_user['name']}#{resolved_user['discriminator']}`"
)
embed.add_field( embed.add_field(
name="Resolve Reason", name="Resolve Reason",
value=f"Resolved by {resolved_name} ({resolved_user['id']}) for:\n{box(case_dict['resolve_reason'])}", value=f"Resolved by {resolved_name} ({resolved_user['id']}) for:\n{box(case_dict['resolve_reason'])}",
@ -314,15 +268,12 @@ async def changes_factory(interaction: Interaction, case_dict: dict) -> Embed:
for change in case_dict["changes"]: for change in case_dict["changes"]:
if change["user_id"] not in memory_dict: if change["user_id"] not in memory_dict:
memory_dict[str(change["user_id"])] = await fetch_user_dict( memory_dict[str(change["user_id"])] = await fetch_user_dict(
interaction.client, change["user_id"] interaction.client,
change["user_id"],
) )
user = memory_dict[str(change["user_id"])] user = memory_dict[str(change["user_id"])]
name = ( name = user["name"] if user["discriminator"] == "0" else f"{user['name']}#{user['discriminator']}"
user["name"]
if user["discriminator"] == "0"
else f"{user['name']}#{user['discriminator']}"
)
timestamp = f"<t:{change['timestamp']}> | <t:{change['timestamp']}:R>" timestamp = f"<t:{change['timestamp']}> | <t:{change['timestamp']}:R>"
@ -360,24 +311,17 @@ async def evidenceformat_factory(interaction: Interaction, case_dict: dict) -> s
interaction (Interaction): The interaction object. interaction (Interaction): The interaction object.
case_dict (dict): The case dictionary. case_dict (dict): The case dictionary.
""" """
target_name = ""
if case_dict["target_type"] == "USER": if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"]) target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = ( target_name = target_user["name"] if target_user["discriminator"] == "0" else f"{target_user['name']}#{target_user['discriminator']}"
target_user["name"]
if target_user["discriminator"] == "0"
else f"{target_user['name']}#{target_user['discriminator']}"
)
elif case_dict["target_type"] == "CHANNEL": elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"]) target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
target_name = target_user["name"] target_name = target_user["name"]
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"]) moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = ( moderator_name = moderator_user["name"] if moderator_user["discriminator"] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}"
moderator_user["name"]
if moderator_user["discriminator"] == "0"
else f"{moderator_user['name']}#{moderator_user['discriminator']}"
)
content = f"Case: {case_dict['moderation_id']:,} ({str.title(case_dict['moderation_type'])})\nTarget: {target_name} ({target_user['id']})\nModerator: {moderator_name} ({moderator_user['id']})" content = f"Case: {case_dict['moderation_id']:,} ({str.title(case_dict['moderation_type'])})\nTarget: {target_name} ({target_user['id']})\nModerator: {moderator_name} ({moderator_user['id']})"
@ -419,17 +363,11 @@ async def overrides_embed(ctx: commands.Context) -> Embed:
} }
override_str = [ override_str = [
"- " "- " + bold("Auto Evidence Format: ") + get_bool_emoji(override_settings["auto_evidenceformat"]),
+ bold("Auto Evidence Format: ")
+ get_bool_emoji(override_settings["auto_evidenceformat"]),
"- " + bold("Ephemeral: ") + get_bool_emoji(override_settings["ephemeral"]), "- " + bold("Ephemeral: ") + get_bool_emoji(override_settings["ephemeral"]),
"- " + bold("History Inline: ") + get_bool_emoji(override_settings["inline"]), "- " + bold("History Inline: ") + get_bool_emoji(override_settings["inline"]),
"- " "- " + bold("History Inline Pagesize: ") + get_pagesize_str(override_settings["inline_pagesize"]),
+ bold("History Inline Pagesize: ") "- " + bold("History Pagesize: ") + get_pagesize_str(override_settings["pagesize"]),
+ get_pagesize_str(override_settings["inline_pagesize"]),
"- "
+ bold("History Pagesize: ")
+ get_pagesize_str(override_settings["pagesize"]),
] ]
override_str = "\n".join(override_str) override_str = "\n".join(override_str)
@ -451,7 +389,7 @@ async def guild_embed(ctx: commands.Context) -> Embed:
guild_settings = { guild_settings = {
"show_moderator": await config.guild(ctx.guild).show_moderator(), "show_moderator": await config.guild(ctx.guild).show_moderator(),
"use_discord_permissions": await config.guild( "use_discord_permissions": await config.guild(
ctx.guild ctx.guild,
).use_discord_permissions(), ).use_discord_permissions(),
"ignore_modlog": await config.guild(ctx.guild).ignore_modlog(), "ignore_modlog": await config.guild(ctx.guild).ignore_modlog(),
"ignore_other_bots": await config.guild(ctx.guild).ignore_other_bots(), "ignore_other_bots": await config.guild(ctx.guild).ignore_other_bots(),
@ -461,7 +399,7 @@ async def guild_embed(ctx: commands.Context) -> Embed:
"history_inline": await config.guild(ctx.guild).history_inline(), "history_inline": await config.guild(ctx.guild).history_inline(),
"history_pagesize": await config.guild(ctx.guild).history_pagesize(), "history_pagesize": await config.guild(ctx.guild).history_pagesize(),
"history_inline_pagesize": await config.guild( "history_inline_pagesize": await config.guild(
ctx.guild ctx.guild,
).history_inline_pagesize(), ).history_inline_pagesize(),
"auto_evidenceformat": await config.guild(ctx.guild).auto_evidenceformat(), "auto_evidenceformat": await config.guild(ctx.guild).auto_evidenceformat(),
"respect_hierarchy": await config.guild(ctx.guild).respect_hierarchy(), "respect_hierarchy": await config.guild(ctx.guild).respect_hierarchy(),
@ -474,37 +412,17 @@ async def guild_embed(ctx: commands.Context) -> Embed:
channel = channel.mention channel = channel.mention
guild_str = [ guild_str = [
"- " "- " + bold("Show Moderator: ") + get_bool_emoji(guild_settings["show_moderator"]),
+ bold("Show Moderator: ") "- " + bold("Use Discord Permissions: ") + get_bool_emoji(guild_settings["use_discord_permissions"]),
+ get_bool_emoji(guild_settings["show_moderator"]), "- " + bold("Respect Hierarchy: ") + get_bool_emoji(guild_settings["respect_hierarchy"]),
"- " "- " + bold("Ignore Modlog: ") + get_bool_emoji(guild_settings["ignore_modlog"]),
+ bold("Use Discord Permissions: ") "- " + bold("Ignore Other Bots: ") + get_bool_emoji(guild_settings["ignore_other_bots"]),
+ get_bool_emoji(guild_settings["use_discord_permissions"]),
"- "
+ bold("Respect Hierarchy: ")
+ get_bool_emoji(guild_settings["respect_hierarchy"]),
"- "
+ bold("Ignore Modlog: ")
+ get_bool_emoji(guild_settings["ignore_modlog"]),
"- "
+ bold("Ignore Other Bots: ")
+ get_bool_emoji(guild_settings["ignore_other_bots"]),
"- " + bold("DM Users: ") + get_bool_emoji(guild_settings["dm_users"]), "- " + bold("DM Users: ") + get_bool_emoji(guild_settings["dm_users"]),
"- " "- " + bold("Auto Evidence Format: ") + get_bool_emoji(guild_settings["auto_evidenceformat"]),
+ bold("Auto Evidence Format: ") "- " + bold("Ephemeral: ") + get_bool_emoji(guild_settings["history_ephemeral"]),
+ get_bool_emoji(guild_settings["auto_evidenceformat"]), "- " + bold("History Inline: ") + get_bool_emoji(guild_settings["history_inline"]),
"- " "- " + bold("History Pagesize: ") + get_pagesize_str(guild_settings["history_pagesize"]),
+ bold("Ephemeral: ") "- " + bold("History Inline Pagesize: ") + get_pagesize_str(guild_settings["history_inline_pagesize"]),
+ get_bool_emoji(guild_settings["history_ephemeral"]),
"- "
+ bold("History Inline: ")
+ get_bool_emoji(guild_settings["history_inline"]),
"- "
+ bold("History Pagesize: ")
+ get_pagesize_str(guild_settings["history_pagesize"]),
"- "
+ bold("History Inline Pagesize: ")
+ get_pagesize_str(guild_settings["history_inline_pagesize"]),
"- " + bold("Log Channel: ") + channel, "- " + bold("Log Channel: ") + channel,
] ]
guild_str = "\n".join(guild_str) guild_str = "\n".join(guild_str)
@ -528,17 +446,21 @@ async def addrole_embed(ctx: commands.Context) -> Embed:
for role in whitelist: for role in whitelist:
evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)") evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)")
if isinstance(evalulated_role, Role): if isinstance(evalulated_role, Role):
roles.append({ roles.append(
{
"id": evalulated_role.id, "id": evalulated_role.id,
"mention": evalulated_role.mention, "mention": evalulated_role.mention,
"position": evalulated_role.position "position": evalulated_role.position,
}) }
)
else: else:
roles.append({ roles.append(
{
"id": role, "id": role,
"mention": error(f"`{role}` (Not Found)"), "mention": error(f"`{role}` (Not Found)"),
"position": 0 "position": 0,
}) }
)
if roles: if roles:
roles = sorted(roles, key=lambda x: x["position"], reverse=True) roles = sorted(roles, key=lambda x: x["position"], reverse=True)
@ -549,9 +471,7 @@ async def addrole_embed(ctx: commands.Context) -> Embed:
e = await _config(ctx) e = await _config(ctx)
e.title += ": Addrole Whitelist" e.title += ": Addrole Whitelist"
e.description = ( e.description = "Use the select menu below to manage this guild's addrole whitelist."
"Use the select menu below to manage this guild's addrole whitelist."
)
if len(whitelist_str) > 4000 and len(whitelist_str) < 5000: if len(whitelist_str) > 4000 and len(whitelist_str) < 5000:
lines = whitelist_str.split("\n") lines = whitelist_str.split("\n")
@ -581,17 +501,21 @@ async def immune_embed(ctx: commands.Context) -> Embed:
for role in immune_roles: for role in immune_roles:
evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)") evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)")
if isinstance(evalulated_role, Role): if isinstance(evalulated_role, Role):
roles.append({ roles.append(
{
"id": evalulated_role.id, "id": evalulated_role.id,
"mention": evalulated_role.mention, "mention": evalulated_role.mention,
"position": evalulated_role.position "position": evalulated_role.position,
}) }
)
else: else:
roles.append({ roles.append(
{
"id": role, "id": role,
"mention": error(f"`{role}` (Not Found)"), "mention": error(f"`{role}` (Not Found)"),
"position": 0 "position": 0,
}) }
)
if roles: if roles:
roles = sorted(roles, key=lambda x: x["position"], reverse=True) roles = sorted(roles, key=lambda x: x["position"], reverse=True)