diff --git a/aurora/aurora.py b/aurora/aurora.py index 5d8ead0..758d549 100644 --- a/aurora/aurora.py +++ b/aurora/aurora.py @@ -18,7 +18,8 @@ from redbot.core import app_commands, commands, data_manager from redbot.core.app_commands import Choice from redbot.core.bot import Red from redbot.core.commands.converter import parse_relativedelta, parse_timedelta -from redbot.core.utils.chat_formatting import box, error, humanize_list, humanize_timedelta, warning +from redbot.core.utils.chat_formatting import (box, error, humanize_list, + humanize_timedelta, warning) from aurora.importers.aurora import ImportAuroraView from aurora.importers.galacticbot import ImportGalacticBotView @@ -27,10 +28,18 @@ from aurora.menus.guild import Guild from aurora.menus.immune import Immune from aurora.menus.overrides import Overrides from aurora.utilities.config import config, register_config -from aurora.utilities.database import connect, create_guild_table, fetch_case, mysql_log -from aurora.utilities.factory import addrole_embed, case_factory, changes_factory, evidenceformat_factory, guild_embed, immune_embed, message_factory, overrides_embed +from aurora.utilities.database import (connect, create_guild_table, fetch_case, + mysql_log) +from aurora.utilities.factory import (addrole_embed, case_factory, + changes_factory, evidenceformat_factory, + guild_embed, immune_embed, + message_factory, overrides_embed) from aurora.utilities.logger import logger -from aurora.utilities.utils import check_moddable, check_permissions, convert_timedelta_to_str, fetch_channel_dict, fetch_user_dict, generate_dict, log, send_evidenceformat, timedelta_from_relativedelta +from aurora.utilities.utils import (check_moddable, check_permissions, + convert_timedelta_to_str, + fetch_channel_dict, fetch_user_dict, + generate_dict, log, send_evidenceformat, + timedelta_from_relativedelta) class Aurora(commands.Cog): @@ -396,6 +405,112 @@ class Aurora(commands.Cog): case = await fetch_case(moderation_id, interaction.guild.id) await send_evidenceformat(interaction, case) + @app_commands.command(name="removerole") + async def removerole( + self, + interaction: discord.Interaction, + target: discord.Member, + role: discord.Role, + reason: str, + duration: str = None, + silent: bool = None, + ): + """Add a role to a user. + + Parameters + ----------- + target: discord.Member + Who are you removing a role from? + role: discord.Role + What role are you removing from the target? + reason: str + Why are you removing a role from this user? + duration: str + How long are you removing this role for? + silent: bool + Should the user be messaged?""" + addrole_whitelist = await config.guild(interaction.guild).addrole_whitelist() + + if not addrole_whitelist: + await interaction.response.send_message( + content=error("There are no whitelisted roles set for this server!"), + ephemeral=True, + ) + return + + if duration is not None: + parsed_time = parse_timedelta(duration) + if parsed_time is None: + await interaction.response.send_message( + content=error("Please provide a valid duration!"), ephemeral=True + ) + return + else: + parsed_time = "NULL" + + if role.id not in addrole_whitelist: + await interaction.response.send_message( + content=error("That role isn't whitelisted!"), ephemeral=True + ) + return + + if not await check_moddable( + target, interaction, ["moderate_members", "manage_roles"] + ): + return + + if role.id not in [user_role.id for user_role in target.roles]: + await interaction.response.send_message( + content=error(f"{target.mention} does not have this role!"), + ephemeral=True, + ) + return + + await interaction.response.defer() + if silent is None: + silent = not await config.guild(interaction.guild).dm_users() + if silent is False: + try: + embed = await message_factory( + await self.bot.get_embed_color(interaction.channel), + guild=interaction.guild, + moderator=interaction.user, + reason=reason, + moderation_type="addrole", + response=await interaction.original_response(), + duration=parsed_time, + role=role, + ) + await target.send(embed=embed) + except discord.errors.HTTPException: + pass + + await target.add_roles( + role, + 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}`" + ) + + moderation_id = await mysql_log( + interaction.guild.id, + interaction.user.id, + "REMOVEROLE", + "USER", + target.id, + role.id, + parsed_time, + reason, + ) + await response.edit( + content=f"{target.mention} has had the {role.mention} role removed{(' for ' + {humanize_timedelta(timedelta=parsed_time)} if parsed_time != 'NULL' else '')}! (Case `#{moderation_id:,}`)\n**Reason** - `{reason}`", + ) + await log(interaction, moderation_id) + + case = await fetch_case(moderation_id, interaction.guild.id) + await send_evidenceformat(interaction, case) + @app_commands.command(name="mute") async def mute( self,