diff --git a/aurora/aurora.py b/aurora/aurora.py index 131d2bd..d2dca4a 100644 --- a/aurora/aurora.py +++ b/aurora/aurora.py @@ -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,9 +136,8 @@ 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: - return + 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)} | " - if bool(case["expired"]) is False - else f"{humanize_timedelta(timedelta=td)} | Expired" + }, ) + duration_embed = f"{humanize_timedelta(timedelta=td)} | " 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:** | " - ) + field_value += f"\n**Timestamp:** | " 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"]) diff --git a/aurora/utilities/factory.py b/aurora/utilities/factory.py index 0d8a8cd..2d060b0 100644 --- a/aurora/utilities/factory.py +++ b/aurora/utilities/factory.py @@ -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)} | " - 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)} | " 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)} | " + }, ) + embed.description = embed.description + f"\n**Duration:** {humanize_timedelta(timedelta=td)} | " 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)} | " - if bool(case_dict["expired"]) is False - else str(humanize_timedelta(timedelta=td)) + }, ) + duration_embed = f"{humanize_timedelta(timedelta=td)} | " 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" | " @@ -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({ - "id": evalulated_role.id, - "mention": evalulated_role.mention, - "position": evalulated_role.position - }) + roles.append( + { + "id": evalulated_role.id, + "mention": evalulated_role.mention, + "position": evalulated_role.position, + } + ) else: - roles.append({ - "id": role, - "mention": error(f"`{role}` (Not Found)"), - "position": 0 - }) + roles.append( + { + "id": role, + "mention": error(f"`{role}` (Not Found)"), + "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({ - "id": evalulated_role.id, - "mention": evalulated_role.mention, - "position": evalulated_role.position - }) + roles.append( + { + "id": evalulated_role.id, + "mention": evalulated_role.mention, + "position": evalulated_role.position, + } + ) else: - roles.append({ - "id": role, - "mention": error(f"`{role}` (Not Found)"), - "position": 0 - }) + roles.append( + { + "id": role, + "mention": error(f"`{role}` (Not Found)"), + "position": 0, + } + ) if roles: roles = sorted(roles, key=lambda x: x["position"], reverse=True)