feat(moderation): added ability to edit durations

This commit is contained in:
Seaswimmer 2023-12-16 16:59:48 -05:00
parent 5b8f6823ef
commit e9e2c20a58
Signed by untrusted user: cswimr
GPG key ID: 1EBC234EEDA901AE

View file

@ -1203,7 +1203,7 @@ class Moderation(commands.Cog):
await interaction.response.send_message(content=f"No case with case number `{case}` found.", ephemeral=True) await interaction.response.send_message(content=f"No case with case number `{case}` found.", ephemeral=True)
@app_commands.command(name="edit") @app_commands.command(name="edit")
async def edit(self, interaction: discord.Interaction, case: int, reason: str): async def edit(self, interaction: discord.Interaction, case: int, reason: str, duration: str = None):
"""Edit the reason of a specific case. """Edit the reason of a specific case.
Parameters Parameters
@ -1211,19 +1211,43 @@ class Moderation(commands.Cog):
case: int case: int
What case are you editing? What case are you editing?
reason: str reason: str
What is the new reason?""" What is the new reason?
duration: str
What is the new duration? Does not reapply the moderation if it has already expired."""
permissions = self.check_permissions(interaction.client.user, ['embed_links'], interaction) permissions = self.check_permissions(interaction.client.user, ['embed_links'], interaction)
if permissions: 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(f"I do not have the `{permissions}` permission, required for this action.", ephemeral=True)
return return
if case != 0: if case != 0:
parsed_time = None
case_dict = await self.fetch_case(case, interaction.guild.id) case_dict = await self.fetch_case(case, interaction.guild.id)
if case_dict: if case_dict:
conf = await self.check_conf(['mysql_database']) conf = await self.check_conf(['mysql_database'])
if conf: if conf:
raise(LookupError) raise(LookupError)
if duration:
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)
return
end_timestamp = case_dict['timestamp'] + parsed_time.total_seconds()
if case_dict['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.")
return
try:
member = await interaction.guild.fetch_member(case_dict['target_id'])
await member.timeout(parsed_time, reason=f"Case #{case} edited by {interaction.user.id}")
except discord.NotFound:
pass
changes: list = case_dict['changes'] changes: list = case_dict['changes']
if len(changes) > 25: 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="Due to limitations with Discord's embed system, you cannot edit a case more than 25 times.", ephemeral=True)
@ -1234,15 +1258,31 @@ class Moderation(commands.Cog):
'type': "ORIGINAL", 'type': "ORIGINAL",
'timestamp': case_dict['timestamp'], 'timestamp': case_dict['timestamp'],
'reason': case_dict['reason'], 'reason': case_dict['reason'],
'user_id': case_dict['moderator_id'] 'user_id': case_dict['moderator_id'],
'duration': case_dict['duration'],
'end_timestamp': case_dict['end_timestamp']
} }
) )
if parsed_time:
changes.append( changes.append(
{ {
'type': "EDIT", 'type': "EDIT",
'timestamp': int(time.time()), 'timestamp': int(time.time()),
'reason': reason, 'reason': reason,
'user_id': interaction.user.id 'user_id': interaction.user.id,
'duration': parsed_time,
'end_timestamp': end_timestamp
}
)
else:
changes.append(
{
'type': "EDIT",
'timestamp': int(time.time()),
'reason': reason,
'user_id': interaction.user.id,
'duration': case_dict['duration'],
'end_timestamp': case_dict['end_timestamp']
} }
) )
@ -1250,6 +1290,10 @@ class Moderation(commands.Cog):
cursor = database.cursor() cursor = database.cursor()
db = await self.config.mysql_database() db = await self.config.mysql_database()
if parsed_time:
update_query = f"UPDATE `{db}`.`moderation_{interaction.guild.id}` SET changes = %s, reason = %s, duration = %s, end_timestamp = %s WHERE moderation_id = %s"
cursor.execute(update_query, (json.dumps(changes), reason, parsed_time, end_timestamp, case))
else:
update_query = f"UPDATE `{db}`.`moderation_{interaction.guild.id}` SET changes = %s, reason = %s WHERE moderation_id = %s" update_query = f"UPDATE `{db}`.`moderation_{interaction.guild.id}` SET changes = %s, reason = %s WHERE moderation_id = %s"
cursor.execute(update_query, (json.dumps(changes), reason, case)) cursor.execute(update_query, (json.dumps(changes), reason, case))
database.commit() database.commit()