From 4d408ff616be05529f4c151f848068718370e81e Mon Sep 17 00:00:00 2001 From: Seaswimmer Date: Mon, 12 Aug 2024 18:13:04 -0400 Subject: [PATCH] feat(aurora): implemented the per-type configuration options so they actually do something --- aurora/aurora.py | 27 ++++++++++++++++++++++++--- aurora/utilities/factory.py | 14 ++++++++++---- aurora/utilities/moderate.py | 13 ++++++++----- aurora/utilities/utils.py | 10 ++++++++-- 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/aurora/aurora.py b/aurora/aurora.py index 682bd11..7a0f940 100644 --- a/aurora/aurora.py +++ b/aurora/aurora.py @@ -526,6 +526,7 @@ class Aurora(commands.Cog): on: str | None = None, before: str | None = None, after: str | None = None, + types: str | None = None, ephemeral: bool | None = None, inline: bool | None = None, export: bool = False, @@ -548,6 +549,8 @@ class Aurora(commands.Cog): List infractions before a certain date after: str List infractions after a certain date + types: bool + List infractions of specific types, comma separated ephemeral: bool Hide the command response inline: bool @@ -644,15 +647,33 @@ class Aurora(commands.Cog): ) return + type_list = [] + registry_values = type_registry.values() + if types: + for t in types.split(","): + stripped = t.strip().lower() + if stripped == "all": + type_list.clear() + type_list = registry_values + break + try: + type_list.append(type_registry[stripped]) + except RegistryKeyError: + continue + else: + for t in registry_values: + if await config.custom("types", interaction.guild.id, t.key).show_in_history(): + type_list.append(t) + if target: filename = f"moderation_target_{str(target.id)}_{str(interaction.guild.id)}.json" - moderations = await Moderation.find_by_target(bot=interaction.client, guild_id=interaction.guild.id, target=target.id, before=before, after=after) + moderations = await Moderation.find_by_target(bot=interaction.client, guild_id=interaction.guild.id, target=target.id, before=before, after=after, types=type_list) elif moderator: filename = f"moderation_moderator_{str(moderator.id)}_{str(interaction.guild.id)}.json" - moderations = await Moderation.find_by_moderator(bot=interaction.client, guild_id=interaction.guild.id, moderator=moderator.id, before=before, after=after) + moderations = await Moderation.find_by_moderator(bot=interaction.client, guild_id=interaction.guild.id, moderator=moderator.id, before=before, after=after, types=type_list) else: filename = f"moderation_{str(interaction.guild.id)}.json" - moderations = await Moderation.get_latest(bot=interaction.client, guild_id=interaction.guild.id, before=before, after=after) + moderations = await Moderation.get_latest(bot=interaction.client, guild_id=interaction.guild.id, before=before, after=after, types=type_list) if export: try: diff --git a/aurora/utilities/factory.py b/aurora/utilities/factory.py index 6bc5cd3..55c8f47 100644 --- a/aurora/utilities/factory.py +++ b/aurora/utilities/factory.py @@ -64,7 +64,11 @@ async def message_factory( timestamp=datetime.now(), ) - if await config.guild(guild).show_moderator() and moderator is not None: + show_moderator = await config.custom("types", guild.id, moderation_type.key).show_moderator() + if show_moderator is None: + show_moderator = await config.guild(guild).show_moderator() + + if show_moderator and moderator is not None: embed.add_field( name="Moderator", value=f"`{moderator.name} ({moderator.id})`", inline=False ) @@ -572,10 +576,12 @@ async def type_embed(ctx: commands.Context, moderation_type = Type) -> Embed: guild_str = "\n".join(guild_str) e = await _config(ctx) - e.title += ": Server Configuration" + e.title += f": {moderation_type.string} Configuration" e.description = ( - """ - Use the buttons below to manage Aurora's server configuration.\n + f""" + Use the buttons below to manage Aurora's configuration for the {moderation_type.string} moderation type. + If an option has a question mark (\N{BLACK QUESTION MARK ORNAMENT}\N{VARIATION SELECTOR-16}) next to it, Aurora will default to the guild level setting instead. + See `{ctx.prefix}aurora set guild` for more information.\n """ + guild_str ) diff --git a/aurora/utilities/moderate.py b/aurora/utilities/moderate.py index 1a8e085..7a0a7a2 100644 --- a/aurora/utilities/moderate.py +++ b/aurora/utilities/moderate.py @@ -28,13 +28,16 @@ async def moderate(ctx: Union[commands.Context, discord.Interaction], target: di ctx = await commands.Context.from_interaction(interaction) if isinstance(interaction.command, app_commands.ContextMenu): ctx.author = interaction.user - if not await check_moddable(target, ctx, permissions): + if not await check_moddable(target=target, ctx=ctx, permissions=permissions, moderation_type=moderation_type): return if silent is None: - silent = not await config.guild(ctx.guild).dm_users() + dm_users = await config.custom("types", ctx.guild.id, moderation_type.key).dm_users() + if dm_users is None: + dm_users = await config.guild(ctx.guild).dm_users() + silent = not dm_users return await moderation_type.handler( - ctx, - target, - silent, + ctx=ctx, + target=target, + silent=silent, **kwargs ) diff --git a/aurora/utilities/utils.py b/aurora/utilities/utils.py index 467d66f..9d7d508 100644 --- a/aurora/utilities/utils.py +++ b/aurora/utilities/utils.py @@ -9,6 +9,7 @@ from discord.errors import Forbidden from redbot.core import commands, data_manager from redbot.core.utils.chat_formatting import error +from ..models.type import Type from ..utilities.config import config from ..utilities.json import dumps from ..utilities.logger import logger @@ -43,10 +44,15 @@ def check_permissions( async def check_moddable( - target: Union[User, Member, TextChannel], ctx: commands.Context, permissions: Tuple[str] + target: Union[User, Member, TextChannel], ctx: commands.Context, permissions: Tuple[str], moderation_type: Type, ) -> bool: """Checks if a moderator can moderate a target.""" is_channel = isinstance(target, TextChannel) + + use_discord_permissions = await config.custom("types", ctx.guild.id, moderation_type.key).use_discord_permissions() + if use_discord_permissions is None: + use_discord_permissions = await config.guild(ctx.guild).use_discord_permissions() + if check_permissions(ctx.bot.user, permissions, guild=ctx.guild): await ctx.send( error( @@ -56,7 +62,7 @@ async def check_moddable( ) return False - if await config.guild(ctx.guild).use_discord_permissions() is True: + if use_discord_permissions is True: if check_permissions(ctx.author, permissions, guild=ctx.guild): await ctx.send( error(