diff --git a/aurora/aurora.py b/aurora/aurora.py index 3b2c8ed..5accf86 100644 --- a/aurora/aurora.py +++ b/aurora/aurora.py @@ -18,7 +18,7 @@ from discord.ext import tasks from pytimeparse2 import disable_dateutil, parse from redbot.core import app_commands, checks, commands, data_manager from redbot.core.app_commands import Choice -from redbot.core.utils.chat_formatting import box +from redbot.core.utils.chat_formatting import box, error, warning from .importers.galacticbot import ImportGalacticBotView from .importers.aurora import ImportAuroraView @@ -233,7 +233,7 @@ class Aurora(commands.Cog): blacklist_roles = await config.guild(interaction.guild).blacklist_roles() if not blacklist_roles: - await interaction.response.send_message(content="There are no blacklist types set for this server!", ephemeral=True) + await interaction.response.send_message(content=error("There are no blacklist types set for this server!"), ephemeral=True) return matching_role = None @@ -244,14 +244,14 @@ class Aurora(commands.Cog): break if not matching_role: - await interaction.response.send_message(content="Please provide a valid blacklist type!", ephemeral=True) + await interaction.response.send_message(content=error("Please provide a valid blacklist type!"), ephemeral=True) return if not await check_moddable(target, interaction, ['moderate_members', 'manage_roles']): return if role in [role.id for role in target.roles]: - await interaction.response.send_message(content=f"{target.mention} already has the blacklist role!", ephemeral=True) + await interaction.response.send_message(content=error(f"{target.mention} already has the blacklist role!"), ephemeral=True) return if silent is None: @@ -292,17 +292,17 @@ class Aurora(commands.Cog): return if target.is_timed_out() is True: - await interaction.response.send_message(f"{target.mention} is already muted!", allowed_mentions=discord.AllowedMentions(users=False), ephemeral=True) + await interaction.response.send_message(error(f"{target.mention} is already muted!"), allowed_mentions=discord.AllowedMentions(users=False), ephemeral=True) return try: parsed_time = parse(sval=duration, as_timedelta=True, raise_exception=True) except ValueError: - await interaction.response.send_message("Please provide a valid duration!", ephemeral=True) + await interaction.response.send_message(error("Please provide a valid duration!"), ephemeral=True) return if parsed_time.total_seconds() / 1000 > 2419200000: - await interaction.response.send_message("Please provide a duration that is less than 28 days.") + await interaction.response.send_message(error("Please provide a duration that is less than 28 days.")) return await target.timeout(parsed_time, reason=f"Muted by {interaction.user.id} for: {reason}") @@ -341,7 +341,7 @@ class Aurora(commands.Cog): return if target.is_timed_out() is False: - await interaction.response.send_message(f"{target.mention} is not muted!", allowed_mentions=discord.AllowedMentions(users=False), ephemeral=True) + await interaction.response.send_message(error(f"{target.mention} is not muted!"), allowed_mentions=discord.AllowedMentions(users=False), ephemeral=True) return if reason: @@ -437,7 +437,7 @@ class Aurora(commands.Cog): try: await interaction.guild.fetch_ban(target) - await interaction.response.send_message(content=f"{target.mention} is already banned!", ephemeral=True) + await interaction.response.send_message(content=error(f"{target.mention} is already banned!"), ephemeral=True) return except discord.errors.NotFound: pass @@ -446,7 +446,7 @@ class Aurora(commands.Cog): try: parsed_time = parse(sval=duration, as_timedelta=True, raise_exception=True) except ValueError: - await interaction.response.send_message("Please provide a valid duration!", ephemeral=True) + await interaction.response.send_message(error("Please provide a valid duration!"), ephemeral=True) return await interaction.response.send_message(content=f"{target.mention} has been banned for {humanize.precisedelta(parsed_time)}!\n**Reason** - `{reason}`") @@ -504,7 +504,7 @@ class Aurora(commands.Cog): try: await interaction.guild.fetch_ban(target) except discord.errors.NotFound: - await interaction.response.send_message(content=f"{target.mention} is not banned!", ephemeral=True) + await interaction.response.send_message(content=error(f"{target.mention} is not banned!"), ephemeral=True) return if reason: @@ -576,7 +576,7 @@ class Aurora(commands.Cog): permissions = check_permissions(interaction.client.user, ['embed_links'], interaction) if permissions: - await interaction.followup.send(f"I do not have the `{permissions}` permission, required for this action.", ephemeral=True) + await interaction.followup.send(error(f"I do not have the `{permissions}` permission, required for this action."), ephemeral=True) return database = connect() @@ -602,7 +602,7 @@ class Aurora(commands.Cog): os.remove(filename) except json.JSONDecodeError as e: - await interaction.followup.send(content=f"An error occured while exporting the moderation history.\nError:\n" + box(e, 'py'), ephemeral=ephemeral) + await interaction.followup.send(content=error(f"An error occured while exporting the moderation history.\nError:\n") + box(e, 'py'), ephemeral=ephemeral) cursor.close() database.close() return @@ -699,7 +699,7 @@ class Aurora(commands.Cog): Reason for resolving case""" permissions = check_permissions(interaction.client.user, ['embed_links', 'moderate_members', 'ban_members'], interaction) if permissions: - await interaction.response.send_message(f"I do not have the `{permissions}` permission, required for this action.", ephemeral=True) + await interaction.response.send_message(error(f"I do not have the `{permissions}` permission, required for this action."), ephemeral=True) return database = connect() @@ -709,14 +709,14 @@ class Aurora(commands.Cog): cursor.execute(query_1, (case,)) result_1 = cursor.fetchone() if result_1 is None or case == 0: - await interaction.response.send_message(content=f"There is no moderation with a case number of {case}.", ephemeral=True) + await interaction.response.send_message(content=error(f"There is no moderation with a case number of {case}."), ephemeral=True) return query_2 = f"SELECT * FROM moderation_{interaction.guild.id} WHERE moderation_id = ? AND resolved = 0;" cursor.execute(query_2, (case,)) result_2 = cursor.fetchone() if result_2 is None: - await interaction.response.send_message(content=f"This moderation has already been resolved!\nUse `/case {case}` for more information.", ephemeral=True) + await interaction.response.send_message(content=error(f"This moderation has already been resolved!\nUse `/case {case}` for more information."), ephemeral=True) return case_dict = generate_dict(result_2) @@ -725,7 +725,7 @@ class Aurora(commands.Cog): changes: list = case_dict['changes'] if len(changes) > 25: - await interaction.response.send_message(content="Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.", ephemeral=True) + await interaction.response.send_message(content=error("Due to limitations with Discord's embed system, you cannot edit a case more than 25 times."), ephemeral=True) return if not changes: changes.append( @@ -746,7 +746,7 @@ class Aurora(commands.Cog): ) if case_dict['moderation_type'] in ['UNMUTE', 'UNBAN']: - await interaction.response.send_message(content="You cannot resolve this type of moderation!", ephemeral=True) + await interaction.response.send_message(content=error("You cannot resolve this type of moderation!"), ephemeral=True) if case_dict['moderation_type'] in ['MUTE', 'TEMPBAN', 'BAN']: if case_dict['moderation_type'] == 'MUTE': @@ -799,7 +799,7 @@ class Aurora(commands.Cog): Export the case to a JSON file or codeblock""" permissions = check_permissions(interaction.client.user, ['embed_links'], interaction) if permissions: - await interaction.response.send_message(f"I do not have the `{permissions}` permission, required for this action.", ephemeral=True) + await interaction.response.send_message(error(f"I do not have the `{permissions}` permission, required for this action."), ephemeral=True) return if ephemeral is None: @@ -818,7 +818,7 @@ class Aurora(commands.Cog): json.dump(case_dict, f, indent=2) if export.value == 'codeblock': - content = f"Case #{case:,} exported.\n*Case was too large to export as codeblock, so it has been uploaded as a `.json` file.*" + content = f"Case #{case:,} exported.\n" + warning("Case was too large to export as codeblock, so it has been uploaded as a `.json` file.") else: content = f"Case #{case:,} exported." @@ -854,7 +854,7 @@ class Aurora(commands.Cog): What is the new duration? Does not reapply the moderation if it has already expired.""" permissions = check_permissions(interaction.client.user, ['embed_links'], interaction) if permissions: - await interaction.response.send_message(f"I do not have the `{permissions}` permission, required for this action.", ephemeral=True) + await interaction.response.send_message(error(f"I do not have the `{permissions}` permission, required for this action."), ephemeral=True) return if case != 0: @@ -865,14 +865,14 @@ class Aurora(commands.Cog): try: parsed_time = parse(sval=duration, as_timedelta=True, raise_exception=True) except ValueError: - await interaction.response.send_message("Please provide a valid duration!", ephemeral=True) + await interaction.response.send_message(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: - await interaction.response.send_message("Please provide a duration that is less than 28 days from the initial moderation.") + await interaction.response.send_message(error("Please provide a duration that is less than 28 days from the initial moderation.")) return try: @@ -884,7 +884,7 @@ class Aurora(commands.Cog): changes: list = case_dict['changes'] if len(changes) > 25: - await interaction.response.send_message(content="Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.", ephemeral=True) + await interaction.response.send_message(content=error("Due to limitations with Discord's embed system, you cannot edit a case more than 25 times."), ephemeral=True) return if not changes: changes.append( @@ -940,7 +940,7 @@ class Aurora(commands.Cog): cursor.close() database.close() return - await interaction.response.send_message(content=f"No case with case number `{case}` found.", ephemeral=True) + await interaction.response.send_message(content=error(f"No case with case number `{case}` found."), ephemeral=True) @tasks.loop(minutes=1) async def handle_expiry(self): @@ -1101,10 +1101,10 @@ class Aurora(commands.Cog): async def auroraset_user_history_inline_pagesize(self, ctx: commands.Context, pagesize: int): """Set the amount of cases to display per page.""" if pagesize > 20: - await ctx.send("Pagesize cannot be greater than 20!") + await ctx.send(error("Pagesize cannot be greater than 20!")) return if pagesize < 1: - await ctx.send("Pagesize cannot be less than 1!") + await ctx.send(error("Pagesize cannot be less than 1!")) return await config.user(ctx.author).history_inline_pagesize.set(pagesize) await ctx.send(f"Inline pagesize set to {await config.user(ctx.author).history_inline_pagesize()}") @@ -1181,7 +1181,7 @@ class Aurora(commands.Cog): """Add a role to the immune roles list.""" immune_roles: list = await config.guild(ctx.guild).immune_roles() if role.id in immune_roles: - await ctx.send("Role is already immune!") + await ctx.send(error("Role is already immune!")) return immune_roles.append(role.id) await config.guild(ctx.guild).immune_roles.set(immune_roles) @@ -1193,7 +1193,7 @@ class Aurora(commands.Cog): """Remove a role from the immune roles list.""" immune_roles: list = await config.guild(ctx.guild).immune_roles() if role.id not in immune_roles: - await ctx.send("Role is not immune!") + await ctx.send(error("Role is not immune!")) return immune_roles.remove(role.id) await config.guild(ctx.guild).immune_roles.set(immune_roles) @@ -1228,13 +1228,13 @@ class Aurora(commands.Cog): blacklist_roles: list = await config.guild(ctx.guild).blacklist_roles() for blacklist_role in blacklist_roles: if role.id == blacklist_role['role']: - await ctx.send("Role already has an associated blacklist type!") + await ctx.send(error("Role already has an associated blacklist type!")) return try: parsed_time = parse(sval=duration, as_timedelta=True, raise_exception=True) except ValueError: - await ctx.send("Please provide a valid duration!") + await ctx.send(error("Please provide a valid duration!")) return blacklist_roles.append( @@ -1257,7 +1257,7 @@ class Aurora(commands.Cog): await config.guild(ctx.guild).blacklist_roles.set(blacklist_roles) await ctx.send(f"Role {role.mention} removed from blacklist types.", allowed_mentions=discord.AllowedMentions.none()) return - await ctx.send("Role does not have an associated blacklist type!") + await ctx.send(error("Role does not have an associated blacklist type!")) @auroraset_blacklist.command(name='list') @checks.admin() @@ -1308,7 +1308,7 @@ class Aurora(commands.Cog): await ctx.send(f"Logging channel set to {channel.mention}.") else: await config.guild(ctx.guild).log_channel.set(" ") - await ctx.send("Logging channel disabled.") + await ctx.send(warning("Logging channel disabled.")) @auroraset.command(name="showmoderator") @checks.admin() @@ -1327,20 +1327,20 @@ class Aurora(commands.Cog): async def auroraset_import_aurora(self, ctx: commands.Context): """Import moderations from another bot using Aurora.""" if ctx.message.attachments and ctx.message.attachments[0].content_type == 'application/json; charset=utf-8': - message = await ctx.send("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.*") + 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.*")) await message.edit(view=ImportAuroraView(60, ctx, message)) else: - await ctx.send("Please provide a valid Aurora export file.") + await ctx.send(error("Please provide a valid Aurora export file.")) @auroraset_import.command(name="galacticbot") @checks.admin() async def auroraset_import_galacticbot(self, ctx: commands.Context): """Import moderations from GalacticBot.""" if ctx.message.attachments and ctx.message.attachments[0].content_type == 'application/json; charset=utf-8': - message = await ctx.send("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.*") + 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.*")) await message.edit(view=ImportGalacticBotView(60, ctx, message)) else: - await ctx.send("Please provide a valid GalacticBot moderation export file.") + await ctx.send(error("Please provide a valid GalacticBot moderation export file.")) @commands.command(aliases=["tdc"]) async def timedeltaconvert(self, ctx: commands.Context, *, duration: str): @@ -1354,4 +1354,4 @@ class Aurora(commands.Cog): parsed_time = parse(duration, as_timedelta=True, raise_exception=True) await ctx.send(f"`{str(parsed_time)}`") except ValueError: - await ctx.send("Please provide a convertible value!") + await ctx.send(error("Please provide a convertible value!")) diff --git a/aurora/importers/aurora.py b/aurora/importers/aurora.py index 49ae584..1e9be5e 100644 --- a/aurora/importers/aurora.py +++ b/aurora/importers/aurora.py @@ -4,7 +4,7 @@ from typing import Dict from discord import ButtonStyle, Interaction, Message, ui from redbot.core import commands -from redbot.core.utils.chat_formatting import box +from redbot.core.utils.chat_formatting import box, warning from ..utilities.database import connect, create_guild_table, mysql_log @@ -101,7 +101,7 @@ class ImportAuroraView(ui.View): await interaction.edit_original_response(content="Import complete.") if failed_cases: await interaction.edit_original_response( - content=f"Import complete.\n*Failed to import the following cases:*\n" + box(failed_cases) + content=f"Import complete.\n" + warning("Failed to import the following cases:\n") + box(failed_cases) ) @ui.button(label="No", style=ButtonStyle.danger) diff --git a/aurora/importers/galacticbot.py b/aurora/importers/galacticbot.py index 38aa746..ea6c424 100644 --- a/aurora/importers/galacticbot.py +++ b/aurora/importers/galacticbot.py @@ -3,7 +3,7 @@ from datetime import timedelta from discord import ButtonStyle, Interaction, Message, ui from redbot.core import commands -from redbot.core.utils.chat_formatting import box +from redbot.core.utils.chat_formatting import box, warning from ..utilities.database import connect, create_guild_table, mysql_log @@ -137,7 +137,7 @@ class ImportGalacticBotView(ui.View): await interaction.edit_original_response(content="Import complete.") if failed_cases: - await interaction.edit_original_response(content=f"Import complete.\n*Failed to import the following cases:*\n" + box(failed_cases)) + await interaction.edit_original_response(content=f"Import complete.\n" + warning("Failed to import the following cases:\n") + box(failed_cases)) @ui.button(label="No", style=ButtonStyle.danger) async def import_button_n(self, interaction: Interaction, button: ui.Button): # pylint: disable=unused-argument diff --git a/aurora/utilities/utils.py b/aurora/utilities/utils.py index 7b29cad..ed2de3c 100644 --- a/aurora/utilities/utils.py +++ b/aurora/utilities/utils.py @@ -7,6 +7,7 @@ from typing import Union from discord import Guild, Interaction, Member, User from discord.errors import Forbidden, NotFound from redbot.core import commands +from redbot.core.utils.chat_formatting import error from .config import config @@ -45,7 +46,7 @@ async def check_moddable( """Checks if a moderator can moderate a target.""" if check_permissions(interaction.client.user, permissions, guild=interaction.guild): await interaction.response.send_message( - f"I do not have the `{permissions}` permission, required for this action.", + error(f"I do not have the `{permissions}` permission, required for this action."), ephemeral=True, ) return False @@ -53,7 +54,7 @@ async def check_moddable( if await config.guild(interaction.guild).use_discord_permissions() is True: if check_permissions(interaction.user, permissions, guild=interaction.guild): await interaction.response.send_message( - f"You do not have the `{permissions}` permission, required for this action.", + error(f"You do not have the `{permissions}` permission, required for this action."), ephemeral=True, ) return False @@ -73,7 +74,7 @@ async def check_moddable( if isinstance(target, Member): if interaction.user.top_role <= target.top_role: await interaction.response.send_message( - content="You cannot moderate members with a higher role than you!", + content=error("You cannot moderate members with a higher role than you!"), ephemeral=True, ) return False @@ -83,7 +84,7 @@ async def check_moddable( <= target.top_role ): await interaction.response.send_message( - content="You cannot moderate members with a role higher than the bot!", + content=error("You cannot moderate members with a role higher than the bot!"), ephemeral=True, ) return False @@ -93,7 +94,7 @@ async def check_moddable( for role in target.roles: if role.id in immune_roles: await interaction.response.send_message( - content="You cannot moderate members with an immune role!", + content=error("You cannot moderate members with an immune role!"), ephemeral=True, ) return False