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."""
__author__ = ["cswimr"]
__version__ = "2.1.3"
__version__ = "2.1.4"
__documentation__ = "https://seacogs.coastalcommits.com/aurora/"
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()
else:
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):
@ -135,8 +136,7 @@ class Aurora(commands.Cog):
if await config.guild(entry.guild).ignore_other_bots() is True:
if entry.user.bot or entry.target.bot:
return
else:
if entry.user.id == self.bot.user.id:
elif entry.user.id == self.bot.user.id:
return
duration = "NULL"
@ -159,10 +159,10 @@ class Aurora(commands.Cog):
elif entry.action == discord.AuditLogAction.member_update:
if entry.after.timed_out_until is not None:
timed_out_until_aware = entry.after.timed_out_until.replace(
tzinfo=timezone.utc
tzinfo=timezone.utc,
)
duration_datetime = timed_out_until_aware - datetime.now(
tz=timezone.utc
tz=timezone.utc,
)
minutes = round(duration_datetime.total_seconds() / 60)
duration = timedelta(minutes=minutes)
@ -209,7 +209,7 @@ class Aurora(commands.Cog):
return
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:
@ -239,7 +239,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -268,7 +268,7 @@ class Aurora(commands.Cog):
return
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:
@ -298,7 +298,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -342,7 +342,8 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration)
if parsed_time is None:
await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True
content=error("Please provide a valid duration!"),
ephemeral=True,
)
return
else:
@ -350,12 +351,15 @@ class Aurora(commands.Cog):
if role.id not in addrole_whitelist:
await interaction.response.send_message(
content=error("That role isn't whitelisted!"), ephemeral=True
content=error("That role isn't whitelisted!"),
ephemeral=True,
)
return
if not await check_moddable(
target, interaction, ["moderate_members", "manage_roles"]
target,
interaction,
["moderate_members", "manage_roles"],
):
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}",
)
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(
@ -448,7 +452,8 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration)
if parsed_time is None:
await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True
content=error("Please provide a valid duration!"),
ephemeral=True,
)
return
else:
@ -456,12 +461,15 @@ class Aurora(commands.Cog):
if role.id not in addrole_whitelist:
await interaction.response.send_message(
content=error("That role isn't whitelisted!"), ephemeral=True
content=error("That role isn't whitelisted!"),
ephemeral=True,
)
return
if not await check_moddable(
target, interaction, ["moderate_members", "manage_roles"]
target,
interaction,
["moderate_members", "manage_roles"],
):
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}",
)
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(
@ -553,21 +561,24 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration, maximum=timedelta(days=28))
if parsed_time is None:
await interaction.response.send_message(
error("Please provide a valid duration!"), ephemeral=True
error("Please provide a valid duration!"),
ephemeral=True,
)
return
except commands.BadArgument:
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
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(
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:
@ -598,7 +609,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -636,14 +647,15 @@ class Aurora(commands.Cog):
if reason:
await target.timeout(
None, reason=f"Unmuted by {interaction.user.id} for: {reason}"
None,
reason=f"Unmuted by {interaction.user.id} for: {reason}",
)
else:
await target.timeout(None, reason=f"Unbanned by {interaction.user.id}")
reason = "No reason given."
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:
@ -673,7 +685,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -702,7 +714,7 @@ class Aurora(commands.Cog):
return
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:
@ -734,7 +746,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -750,7 +762,7 @@ class Aurora(commands.Cog):
Choice(name="1 Day", value=86400),
Choice(name="3 Days", value=259200),
Choice(name="7 Days", value=604800),
]
],
)
async def ban(
self,
@ -786,7 +798,8 @@ class Aurora(commands.Cog):
try:
await interaction.guild.fetch_ban(target)
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
except discord.errors.NotFound:
@ -796,19 +809,21 @@ class Aurora(commands.Cog):
parsed_time = parse_relativedelta(duration)
if parsed_time is None:
await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True
content=error("Please provide a valid duration!"),
ephemeral=True,
)
return
try:
parsed_time = timedelta_from_relativedelta(parsed_time)
except ValueError:
await interaction.response.send_message(
content=error("Please provide a valid duration!"), ephemeral=True
content=error("Please provide a valid duration!"),
ephemeral=True,
)
return
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:
@ -842,7 +857,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -850,7 +865,7 @@ class Aurora(commands.Cog):
await send_evidenceformat(interaction, case)
else:
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:
@ -886,7 +901,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -918,22 +933,25 @@ class Aurora(commands.Cog):
await interaction.guild.fetch_ban(target)
except discord.errors.NotFound:
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
if reason:
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:
await interaction.guild.unban(
target, reason=f"Unbanned by {interaction.user.id}"
target,
reason=f"Unbanned by {interaction.user.id}",
)
reason = "No reason given."
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:
@ -963,7 +981,7 @@ class Aurora(commands.Cog):
reason,
)
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)
@ -1001,42 +1019,28 @@ class Aurora(commands.Cog):
export: bool
Exports the server's entire moderation history to a JSON file"""
if ephemeral is None:
ephemeral = (
await config.user(interaction.user).history_ephemeral()
or await config.guild(interaction.guild).history_ephemeral()
or False
)
ephemeral = await config.user(interaction.user).history_ephemeral() or await config.guild(interaction.guild).history_ephemeral() or False
if inline is None:
inline = (
await config.user(interaction.user).history_inline()
or await config.guild(interaction.guild).history_inline()
or False
)
inline = await config.user(interaction.user).history_inline() or await config.guild(interaction.guild).history_inline() or False
if pagesize is None:
if inline is True:
pagesize = (
await config.user(interaction.user).history_inline_pagesize()
or await config.guild(interaction.guild).history_inline_pagesize()
or 6
)
pagesize = await config.user(interaction.user).history_inline_pagesize() or await config.guild(interaction.guild).history_inline_pagesize() or 6
else:
pagesize = (
await config.user(interaction.user).history_pagesize()
or await config.guild(interaction.guild).history_pagesize()
or 5
)
pagesize = await config.user(interaction.user).history_pagesize() or await config.guild(interaction.guild).history_pagesize() or 5
await interaction.response.defer(ephemeral=ephemeral)
permissions = check_permissions(
interaction.client.user, ["embed_links"], interaction
interaction.client.user,
["embed_links"],
interaction,
)
if permissions:
await interaction.followup.send(
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,
)
@ -1061,18 +1065,15 @@ class Aurora(commands.Cog):
cases.append(case)
try:
filename = (
str(data_manager.cog_data_path(cog_instance=self))
+ str(os.sep)
+ f"moderation_{interaction.guild.id}.json"
)
filename = 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:
json.dump(cases, f, indent=2)
await interaction.followup.send(
file=discord.File(
filename, f"moderation_{interaction.guild.id}.json"
filename,
f"moderation_{interaction.guild.id}.json",
),
ephemeral=ephemeral,
)
@ -1081,7 +1082,7 @@ class Aurora(commands.Cog):
except json.JSONDecodeError as e:
await interaction.followup.send(
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"),
ephemeral=ephemeral,
@ -1127,7 +1128,7 @@ class Aurora(commands.Cog):
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_footer(
text=f"Page {page:,}/{page_quantity:,} | {case_quantity:,} Results"
text=f"Page {page:,}/{page_quantity:,} | {case_quantity:,} Results",
)
memory_dict = {}
@ -1136,33 +1137,30 @@ class Aurora(commands.Cog):
if case["target_id"] not in memory_dict:
if case["target_type"] == "USER":
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":
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"])]
if case["target_type"] == "USER":
target_name = (
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case["target_type"] == "CHANNEL":
target_name = f"`{target_user['mention']}`"
else:
target_name = ""
if case["moderator_id"] not in memory_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_name = (
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
moderator_name = 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_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)
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**Timestamp:** <t:{case['timestamp']}> | <t:{case['timestamp']}:R>"
)
field_value += f"\n**Timestamp:** <t:{case['timestamp']}> | <t:{case['timestamp']}:R>"
if case["role_id"] != "0":
role = interaction.guild.get_role(int(case["role_id"]))
@ -1208,7 +1201,10 @@ class Aurora(commands.Cog):
@app_commands.command(name="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.
@ -1226,7 +1222,7 @@ class Aurora(commands.Cog):
if permissions:
await interaction.response.send_message(
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,
)
@ -1235,9 +1231,7 @@ class Aurora(commands.Cog):
database = connect()
cursor = database.cursor()
query_1 = (
f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ?;"
)
query_1 = f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ?;"
cursor.execute(query_1, (case,))
result_1 = cursor.fetchone()
if result_1 is None or case == 0:
@ -1253,7 +1247,7 @@ class Aurora(commands.Cog):
if result_2 is None:
await interaction.response.send_message(
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,
)
@ -1267,7 +1261,7 @@ class Aurora(commands.Cog):
if len(changes) > 25:
await interaction.response.send_message(
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,
)
@ -1279,7 +1273,7 @@ class Aurora(commands.Cog):
"timestamp": case_dict["timestamp"],
"reason": case_dict["reason"],
"user_id": case_dict["moderator_id"],
}
},
)
changes.append(
{
@ -1287,7 +1281,7 @@ class Aurora(commands.Cog):
"timestamp": int(time.time()),
"reason": reason,
"user_id": interaction.user.id,
}
},
)
if case_dict["moderation_type"] in ["UNMUTE", "UNBAN"]:
@ -1301,11 +1295,12 @@ class Aurora(commands.Cog):
if case_dict["moderation_type"] == "MUTE":
try:
member = await interaction.guild.fetch_member(
case_dict["target_id"]
case_dict["target_id"],
)
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:
pass
@ -1315,7 +1310,8 @@ class Aurora(commands.Cog):
user = await interaction.client.fetch_user(case_dict["target_id"])
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:
pass
@ -1340,7 +1336,8 @@ class Aurora(commands.Cog):
case_dict=await fetch_case(case, interaction.guild.id),
)
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)
@ -1352,7 +1349,7 @@ class Aurora(commands.Cog):
export=[
Choice(name="Export as File", value="file"),
Choice(name="Export as Codeblock", value="codeblock"),
]
],
)
async def case(
self,
@ -1376,41 +1373,35 @@ class Aurora(commands.Cog):
export: bool
Export the case to a JSON file or codeblock"""
permissions = check_permissions(
interaction.client.user, ["embed_links"], interaction
interaction.client.user,
["embed_links"],
interaction,
)
if permissions:
await interaction.response.send_message(
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,
)
return
if ephemeral is None:
ephemeral = (
await config.user(interaction.user).history_ephemeral()
or await config.guild(interaction.guild).history_ephemeral()
or False
)
ephemeral = await config.user(interaction.user).history_ephemeral() or await config.guild(interaction.guild).history_ephemeral() or False
if case != 0:
case_dict = await fetch_case(case, interaction.guild.id)
if case_dict:
if export:
if export.value == "file" or len(str(case_dict)) > 1800:
filename = (
str(data_manager.cog_data_path(cog_instance=self))
+ str(os.sep)
+ f"moderation_{interaction.guild.id}_case_{case}.json"
)
filename = 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:
json.dump(case_dict, f, indent=2)
if export.value == "codeblock":
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:
content = f"Case #{case:,} exported."
@ -1427,34 +1418,41 @@ class Aurora(commands.Cog):
os.remove(filename)
return
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,
)
return
if changes:
embed = await changes_factory(
interaction=interaction, case_dict=case_dict
interaction=interaction,
case_dict=case_dict,
)
await interaction.response.send_message(
embed=embed, ephemeral=ephemeral
embed=embed,
ephemeral=ephemeral,
)
elif evidenceformat:
content = await evidenceformat_factory(
interaction=interaction, case_dict=case_dict
interaction=interaction,
case_dict=case_dict,
)
await interaction.response.send_message(
content=content, ephemeral=ephemeral
content=content,
ephemeral=ephemeral,
)
else:
embed = await case_factory(
interaction=interaction, case_dict=case_dict
interaction=interaction,
case_dict=case_dict,
)
await interaction.response.send_message(
embed=embed, ephemeral=ephemeral
embed=embed,
ephemeral=ephemeral,
)
return
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")
@ -1476,13 +1474,16 @@ class Aurora(commands.Cog):
duration: str
What is the new duration? Does not reapply the moderation if it has already expired.
"""
end_timestamp = None
permissions = check_permissions(
interaction.client.user, ["embed_links"], interaction
interaction.client.user,
["embed_links"],
interaction,
)
if permissions:
await interaction.response.send_message(
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,
)
@ -1496,26 +1497,25 @@ class Aurora(commands.Cog):
parsed_time = parse_timedelta(duration)
if parsed_time is None:
await interaction.response.send_message(
error("Please provide a valid duration!"), ephemeral=True
error("Please provide a valid duration!"),
ephemeral=True,
)
return
end_timestamp = case_dict["timestamp"] + parsed_time.total_seconds()
if case_dict["moderation_type"] == "MUTE":
if (
time.time() - case_dict["timestamp"]
) + parsed_time.total_seconds() > 2419200:
if (time.time() - case_dict["timestamp"]) + parsed_time.total_seconds() > 2419200:
await interaction.response.send_message(
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
try:
member = await interaction.guild.fetch_member(
case_dict["target_id"]
case_dict["target_id"],
)
await member.timeout(
@ -1529,7 +1529,7 @@ class Aurora(commands.Cog):
if len(changes) > 25:
await interaction.response.send_message(
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,
)
@ -1543,9 +1543,10 @@ class Aurora(commands.Cog):
"user_id": case_dict["moderator_id"],
"duration": case_dict["duration"],
"end_timestamp": case_dict["end_timestamp"],
}
},
)
if parsed_time:
assert end_timestamp is not None
changes.append(
{
"type": "EDIT",
@ -1554,7 +1555,7 @@ class Aurora(commands.Cog):
"user_id": interaction.user.id,
"duration": convert_timedelta_to_str(parsed_time),
"end_timestamp": end_timestamp,
}
},
)
else:
changes.append(
@ -1565,7 +1566,7 @@ class Aurora(commands.Cog):
"user_id": interaction.user.id,
"duration": case_dict["duration"],
"end_timestamp": case_dict["end_timestamp"],
}
},
)
database = connect()
@ -1602,7 +1603,8 @@ class Aurora(commands.Cog):
database.close()
return
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)
@ -1634,14 +1636,11 @@ class Aurora(commands.Cog):
unban_num = 0
for target_id, moderation_id in zip(target_ids, moderation_ids):
user: discord.User = await self.bot.fetch_user(target_id)
name = (
f"{user.name}#{user.discriminator}"
if user.discriminator != "0"
else user.name
)
name = f"{user.name}#{user.discriminator}" if user.discriminator != "0" else user.name
try:
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(
@ -1690,13 +1689,16 @@ class Aurora(commands.Cog):
role_ids = [row[2] for row in result]
for target_id, moderation_id, role_id in zip(
target_ids, moderation_ids, role_ids
target_ids,
moderation_ids,
role_ids,
):
try:
member = await guild.fetch_member(target_id)
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
@ -1725,13 +1727,16 @@ class Aurora(commands.Cog):
role_ids = [row[2] for row in result]
for target_id, moderation_id, role_id in zip(
target_ids, moderation_ids, role_ids
target_ids,
moderation_ids,
role_ids,
):
try:
member = await guild.fetch_member(target_id)
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
@ -1827,15 +1832,11 @@ class Aurora(commands.Cog):
@commands.admin()
async def aurora_import_aurora(self, ctx: commands.Context):
"""Import moderation history from another bot using Aurora."""
if (
ctx.message.attachments
and ctx.message.attachments[0].content_type
== "application/json; charset=utf-8"
):
if ctx.message.attachments and ctx.message.attachments[0].content_type == "application/json; charset=utf-8":
message = await ctx.send(
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))
else:
@ -1845,20 +1846,16 @@ class Aurora(commands.Cog):
@commands.admin()
async def aurora_import_galacticbot(self, ctx: commands.Context):
"""Import moderation history from GalacticBot."""
if (
ctx.message.attachments
and ctx.message.attachments[0].content_type
== "application/json; charset=utf-8"
):
if ctx.message.attachments and ctx.message.attachments[0].content_type == "application/json; charset=utf-8":
message = await ctx.send(
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))
else:
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"])

View file

@ -75,7 +75,9 @@ async def message_factory(
if await config.guild(guild).show_moderator() and moderator is not None:
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)
@ -94,7 +96,9 @@ async def message_factory(
async def log_factory(
interaction: Interaction, case_dict: dict, resolved: bool = False
interaction: Interaction,
case_dict: dict,
resolved: bool = False,
) -> Embed:
"""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.
resolved (bool, optional): Whether the case is resolved or not. Defaults to False.
"""
target_name = ""
if resolved:
if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = (
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
if target_user["mention"]:
@ -119,11 +120,7 @@ async def log_factory(
target_name = f"`{target_user['name']}`"
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = (
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
embed = Embed(
title=f"📕 Case #{case_dict['moderation_id']:,} Resolved",
@ -140,40 +137,24 @@ async def log_factory(
["hours", "minutes", "seconds"],
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)
resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"])
resolved_name = (
resolved_user["name"]
if resolved_user["discriminator"] == "0"
else f"{resolved_user['name']}#{resolved_user['discriminator']}"
)
resolved_name = resolved_user["name"] if resolved_user["discriminator"] == "0" else f"{resolved_user['name']}#{resolved_user['discriminator']}"
embed.add_field(
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"]),
inline=False,
)
else:
if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = (
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
if target_user["mention"]:
@ -182,11 +163,7 @@ async def log_factory(
target_name = f"`{target_user['name']}`"
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = (
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
embed = Embed(
title=f"📕 Case #{case_dict['moderation_id']:,}",
@ -202,12 +179,9 @@ async def log_factory(
["hours", "minutes", "seconds"],
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)
return embed
@ -220,13 +194,10 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed:
interaction (Interaction): The interaction object.
case_dict (dict): The case dictionary.
"""
target_name = ""
if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = (
f"`{target_user['name']}`"
if target_user["discriminator"] == "0"
else f"`{target_user['name']}#{target_user['discriminator']}`"
)
target_name = f"`{target_user['name']}`" if target_user["discriminator"] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
if target_user["mention"]:
@ -235,11 +206,7 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed:
target_name = f"`{target_user['name']}`"
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = (
f"`{moderator_user['name']}`"
if moderator_user["discriminator"] == "0"
else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
)
moderator_name = f"`{moderator_user['name']}`" if moderator_user["discriminator"] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
embed = Embed(
title=f"📕 Case #{case_dict['moderation_id']:,}",
@ -252,41 +219,28 @@ async def case_factory(interaction: Interaction, case_dict: dict) -> Embed:
**{
unit: int(val)
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**Changes:** {len(case_dict['changes']) - 1}"
if case_dict["changes"]
else "\n**Changes:** 0"
)
embed.description += f"\n**Changes:** {len(case_dict['changes']) - 1}" if case_dict["changes"] else "\n**Changes:** 0"
if case_dict["role_id"]:
embed.description += f"\n**Role:** <@&{case_dict['role_id']}>"
if case_dict["metadata"]:
if case_dict["metadata"]["imported_from"]:
embed.description += (
f"\n**Imported From:** {case_dict['metadata']['imported_from']}"
)
embed.description += f"\n**Imported From:** {case_dict['metadata']['imported_from']}"
embed.add_field(name="Reason", value=box(case_dict["reason"]), inline=False)
if case_dict["resolved"] == 1:
resolved_user = await fetch_user_dict(interaction.client, case_dict["resolved_by"])
resolved_name = (
f"`{resolved_user['name']}`"
if resolved_user["discriminator"] == "0"
else f"`{resolved_user['name']}#{resolved_user['discriminator']}`"
)
resolved_name = f"`{resolved_user['name']}`" if resolved_user["discriminator"] == "0" else f"`{resolved_user['name']}#{resolved_user['discriminator']}`"
embed.add_field(
name="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"]:
if change["user_id"] not in memory_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"])]
name = (
user["name"]
if user["discriminator"] == "0"
else f"{user['name']}#{user['discriminator']}"
)
name = user["name"] if user["discriminator"] == "0" else f"{user['name']}#{user['discriminator']}"
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.
case_dict (dict): The case dictionary.
"""
target_name = ""
if case_dict["target_type"] == "USER":
target_user = await fetch_user_dict(interaction.client, case_dict["target_id"])
target_name = (
target_user["name"]
if target_user["discriminator"] == "0"
else f"{target_user['name']}#{target_user['discriminator']}"
)
target_name = target_user["name"] if target_user["discriminator"] == "0" else f"{target_user['name']}#{target_user['discriminator']}"
elif case_dict["target_type"] == "CHANNEL":
target_user = await fetch_channel_dict(interaction.guild, case_dict["target_id"])
target_name = target_user["name"]
moderator_user = await fetch_user_dict(interaction.client, case_dict["moderator_id"])
moderator_name = (
moderator_user["name"]
if moderator_user["discriminator"] == "0"
else f"{moderator_user['name']}#{moderator_user['discriminator']}"
)
moderator_name = 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']})"
@ -419,17 +363,11 @@ async def overrides_embed(ctx: commands.Context) -> Embed:
}
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("History Inline: ") + get_bool_emoji(override_settings["inline"]),
"- "
+ bold("History Inline Pagesize: ")
+ get_pagesize_str(override_settings["inline_pagesize"]),
"- "
+ bold("History Pagesize: ")
+ get_pagesize_str(override_settings["pagesize"]),
"- " + bold("History Inline Pagesize: ") + get_pagesize_str(override_settings["inline_pagesize"]),
"- " + bold("History Pagesize: ") + get_pagesize_str(override_settings["pagesize"]),
]
override_str = "\n".join(override_str)
@ -451,7 +389,7 @@ async def guild_embed(ctx: commands.Context) -> Embed:
guild_settings = {
"show_moderator": await config.guild(ctx.guild).show_moderator(),
"use_discord_permissions": await config.guild(
ctx.guild
ctx.guild,
).use_discord_permissions(),
"ignore_modlog": await config.guild(ctx.guild).ignore_modlog(),
"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_pagesize": await config.guild(ctx.guild).history_pagesize(),
"history_inline_pagesize": await config.guild(
ctx.guild
ctx.guild,
).history_inline_pagesize(),
"auto_evidenceformat": await config.guild(ctx.guild).auto_evidenceformat(),
"respect_hierarchy": await config.guild(ctx.guild).respect_hierarchy(),
@ -474,37 +412,17 @@ async def guild_embed(ctx: commands.Context) -> Embed:
channel = channel.mention
guild_str = [
"- "
+ bold("Show Moderator: ")
+ get_bool_emoji(guild_settings["show_moderator"]),
"- "
+ bold("Use Discord Permissions: ")
+ 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("Show Moderator: ") + get_bool_emoji(guild_settings["show_moderator"]),
"- " + bold("Use Discord Permissions: ") + 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("Auto Evidence Format: ")
+ get_bool_emoji(guild_settings["auto_evidenceformat"]),
"- "
+ bold("Ephemeral: ")
+ 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("Auto Evidence Format: ") + get_bool_emoji(guild_settings["auto_evidenceformat"]),
"- " + bold("Ephemeral: ") + 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,
]
guild_str = "\n".join(guild_str)
@ -528,17 +446,21 @@ async def addrole_embed(ctx: commands.Context) -> Embed:
for role in whitelist:
evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)")
if isinstance(evalulated_role, Role):
roles.append({
roles.append(
{
"id": evalulated_role.id,
"mention": evalulated_role.mention,
"position": evalulated_role.position
})
"position": evalulated_role.position,
}
)
else:
roles.append({
roles.append(
{
"id": role,
"mention": error(f"`{role}` (Not Found)"),
"position": 0
})
"position": 0,
}
)
if roles:
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.title += ": Addrole Whitelist"
e.description = (
"Use the select menu below to manage this guild's addrole whitelist."
)
e.description = "Use the select menu below to manage this guild's addrole whitelist."
if len(whitelist_str) > 4000 and len(whitelist_str) < 5000:
lines = whitelist_str.split("\n")
@ -581,17 +501,21 @@ async def immune_embed(ctx: commands.Context) -> Embed:
for role in immune_roles:
evalulated_role = ctx.guild.get_role(role) or error(f"`{role}` (Not Found)")
if isinstance(evalulated_role, Role):
roles.append({
roles.append(
{
"id": evalulated_role.id,
"mention": evalulated_role.mention,
"position": evalulated_role.position
})
"position": evalulated_role.position,
}
)
else:
roles.append({
roles.append(
{
"id": role,
"mention": error(f"`{role}` (Not Found)"),
"position": 0
})
"position": 0,
}
)
if roles:
roles = sorted(roles, key=lambda x: x["position"], reverse=True)