Finish the addrole/removerole commands and surrounding functionality #24
1 changed files with 119 additions and 4 deletions
123
aurora/aurora.py
123
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,
|
||||
|
|
Loading…
Reference in a new issue