feat(moderation): allow importing lockdown and slowmode moderation types

This commit is contained in:
Seaswimmer 2023-12-17 12:54:41 -05:00
parent 53290e7062
commit 141c0459d4
Signed by untrusted user: cswimr
GPG key ID: 1EBC234EEDA901AE
4 changed files with 94 additions and 40 deletions

View file

@ -50,6 +50,7 @@ async def create_guild_table(guild: Guild):
moderation_id INT UNIQUE PRIMARY KEY NOT NULL, moderation_id INT UNIQUE PRIMARY KEY NOT NULL,
timestamp INT NOT NULL, timestamp INT NOT NULL,
moderation_type LONGTEXT NOT NULL, moderation_type LONGTEXT NOT NULL,
target_type LONGTEXT NOT NULL,
target_id LONGTEXT NOT NULL, target_id LONGTEXT NOT NULL,
moderator_id LONGTEXT NOT NULL, moderator_id LONGTEXT NOT NULL,
role_id LONGTEXT, role_id LONGTEXT,
@ -79,13 +80,14 @@ async def create_guild_table(guild: Guild):
insert_query = f""" insert_query = f"""
INSERT INTO `moderation_{guild.id}` INSERT INTO `moderation_{guild.id}`
(moderation_id, timestamp, moderation_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata) (moderation_id, timestamp, moderation_type, target_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""" """
insert_values = ( insert_values = (
0, 0,
0, 0,
"NULL", "NULL",
"NULL",
0, 0,
0, 0,
0, 0,
@ -117,6 +119,7 @@ async def mysql_log(
guild_id: str, guild_id: str,
author_id: str, author_id: str,
moderation_type: str, moderation_type: str,
target_type: str,
target_id: int, target_id: int,
role_id: int, role_id: int,
duration, duration,
@ -160,11 +163,12 @@ async def mysql_log(
moderation_id = await get_next_case_number(guild_id=guild_id, cursor=cursor) moderation_id = await get_next_case_number(guild_id=guild_id, cursor=cursor)
sql = f"INSERT INTO `moderation_{guild_id}` (moderation_id, timestamp, moderation_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" sql = f"INSERT INTO `moderation_{guild_id}` (moderation_id, timestamp, moderation_type, target_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
val = ( val = (
moderation_id, moderation_id,
timestamp, timestamp,
moderation_type, moderation_type,
target_type,
target_id, target_id,
author_id, author_id,
role_id, role_id,
@ -186,11 +190,12 @@ async def mysql_log(
database.close() database.close()
logger.debug( logger.debug(
"MySQL row inserted into moderation_%s!\n%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s", "MySQL row inserted into moderation_%s!\n%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s",
guild_id, guild_id,
moderation_id, moderation_id,
timestamp, timestamp,
moderation_type, moderation_type,
target_type,
target_id, target_id,
author_id, author_id,
role_id, role_id,

View file

@ -3,7 +3,7 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
import humanize import humanize
from discord import Color, Embed, Guild, Interaction, InteractionMessage from discord import Color, Embed, Guild, Interaction, InteractionMessage
from .utils import get_next_case_number, fetch_user_dict from .utils import get_next_case_number, fetch_user_dict, fetch_channel_dict
async def embed_factory(embed_type: str, color: Color, /, interaction: Interaction = None, case_dict: dict = None, guild: Guild = None, reason: str = None, moderation_type: str = None, response: InteractionMessage = None, duration: timedelta = None, resolved: bool = False): async def embed_factory(embed_type: str, color: Color, /, interaction: Interaction = None, case_dict: dict = None, guild: Guild = None, reason: str = None, moderation_type: str = None, response: InteractionMessage = None, duration: timedelta = None, resolved: bool = False):
"""This method creates an embed from set parameters, meant for either moderation logging or contacting the moderated user. """This method creates an embed from set parameters, meant for either moderation logging or contacting the moderated user.
@ -54,10 +54,17 @@ async def embed_factory(embed_type: str, color: Color, /, interaction: Interact
return embed return embed
if embed_type == 'case': if embed_type == 'case':
if case_dict['target_type'] == 'USER':
target_user = await fetch_user_dict(interaction, case_dict['target_id']) target_user = await fetch_user_dict(interaction, case_dict['target_id'])
moderator_user = await fetch_user_dict(interaction, case_dict['moderator_id'])
target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case_dict['target_type'] == 'CHANNEL':
target_user = await fetch_channel_dict(interaction, case_dict['target_id'])
if target_user['mention']:
target_name = f"{target_user['mention']} ({target_user['id']})"
else:
target_name = f"`{target_user['name']}` ({target_user['id']})"
moderator_user = await fetch_user_dict(interaction, case_dict['moderator_id'])
moderator_name = f"`{moderator_user['name']}`" if moderator_user['discriminator'] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`" moderator_name = f"`{moderator_user['name']}`" if moderator_user['discriminator'] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
embed = Embed(title=f"📕 Case #{case_dict['moderation_id']:,}", color=color) embed = Embed(title=f"📕 Case #{case_dict['moderation_id']:,}", color=color)
@ -114,10 +121,17 @@ async def embed_factory(embed_type: str, color: Color, /, interaction: Interact
if embed_type == 'log': if embed_type == 'log':
if resolved: if resolved:
if case_dict['target_type'] == 'USER':
target_user = await fetch_user_dict(interaction, case_dict['target_id']) target_user = await fetch_user_dict(interaction, case_dict['target_id'])
moderator_user = await fetch_user_dict(interaction, case_dict['moderator_id'])
target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case_dict['target_type'] == 'CHANNEL':
target_user = await fetch_channel_dict(interaction, case_dict['target_id'])
if target_user['mention']:
target_name = f"{target_user['mention']} ({target_user['id']})"
else:
target_name = f"`{target_user['name']}` ({target_user['id']})"
moderator_user = await fetch_user_dict(interaction, case_dict['moderator_id'])
moderator_name = moderator_user['name'] if moderator_user['discriminator'] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}" moderator_name = moderator_user['name'] if moderator_user['discriminator'] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}"
embed = Embed(title=f"📕 Case #{case_dict['moderation_id']:,} Resolved", color=color) embed = Embed(title=f"📕 Case #{case_dict['moderation_id']:,} Resolved", color=color)
@ -135,10 +149,17 @@ async def embed_factory(embed_type: str, color: Color, /, interaction: Interact
resolved_name = resolved_user['name'] if resolved_user['discriminator'] == "0" else f"{resolved_user['name']}#{resolved_user['discriminator']}" resolved_name = resolved_user['name'] if resolved_user['discriminator'] == "0" else f"{resolved_user['name']}#{resolved_user['discriminator']}"
embed.add_field(name='Resolve Reason', value=f"Resolved by {resolved_name} ({resolved_user['id']}) for:\n```{case_dict['resolve_reason']}```", inline=False) embed.add_field(name='Resolve Reason', value=f"Resolved by {resolved_name} ({resolved_user['id']}) for:\n```{case_dict['resolve_reason']}```", inline=False)
else: else:
if case_dict['target_type'] == 'USER':
target_user = await fetch_user_dict(interaction, case_dict['target_id']) target_user = await fetch_user_dict(interaction, case_dict['target_id'])
moderator_user = await fetch_user_dict(interaction, case_dict['moderator_id'])
target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`" target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case_dict['target_type'] == 'CHANNEL':
target_user = await fetch_channel_dict(interaction, case_dict['target_id'])
if target_user['mention']:
target_name = target_user['mention']
else:
target_name = target_user['name']
moderator_user = await fetch_user_dict(interaction, case_dict['moderator_id'])
moderator_name = moderator_user['name'] if moderator_user['discriminator'] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}" moderator_name = moderator_user['name'] if moderator_user['discriminator'] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}"
embed = Embed(title=f"📕 Case #{case_dict['moderation_id']:,}", color=color) embed = Embed(title=f"📕 Case #{case_dict['moderation_id']:,}", color=color)

View file

@ -18,7 +18,7 @@ from redbot.core import app_commands, checks, Config, commands, data_manager
from redbot.core.app_commands import Choice from redbot.core.app_commands import Choice
from .database import connect, create_guild_table, fetch_case, mysql_log from .database import connect, create_guild_table, fetch_case, mysql_log
from .embed_factory import embed_factory from .embed_factory import embed_factory
from .utils import check_conf, check_permissions, check_moddable, fetch_user_dict, generate_dict, log from .utils import check_conf, check_permissions, check_moddable, fetch_channel_dict, fetch_user_dict, generate_dict, log
from .logger import logger from .logger import logger
class Moderation(commands.Cog): class Moderation(commands.Cog):
@ -640,18 +640,24 @@ class Moderation(commands.Cog):
for case in result_dict_list[start_index:end_index]: for case in result_dict_list[start_index:end_index]:
if case['target_id'] not in memory_dict: if case['target_id'] not in memory_dict:
if case['target_type'] == 'USER':
memory_dict[str(case['target_id'])] = await fetch_user_dict(interaction, case['target_id']) memory_dict[str(case['target_id'])] = await fetch_user_dict(interaction, case['target_id'])
elif case['target_type'] == 'CHANNEL':
memory_dict[str(case['target_id'])] = await fetch_channel_dict(interaction, case['target_id'])
target_user = memory_dict[str(case['target_id'])] target_user = memory_dict[str(case['target_id'])]
if case['target_type'] == 'USER':
target_name = f"`{target_user['name']}`" if target_user['discriminator'] == "0" else f"`{target_user['name']}#{target_user['discriminator']}`"
elif case['target_type'] == 'CHANNEL':
target_name = f"`{target_user['mention']}`"
if case['moderator_id'] not in memory_dict: if case['moderator_id'] not in memory_dict:
memory_dict[str(case['moderator_id'])] = await fetch_user_dict(interaction, case['moderator_id']) memory_dict[str(case['moderator_id'])] = await fetch_user_dict(interaction, case['moderator_id'])
moderator_user = memory_dict[str(case['moderator_id'])] moderator_user = memory_dict[str(case['moderator_id'])]
moderator_name = f"`{moderator_user['name']}`" if moderator_user['discriminator'] == "0" else f"`{moderator_user['name']}#{moderator_user['discriminator']}`"
target_name = target_user['name'] if target_user['discriminator'] == "0" else f"{target_user['name']}#{target_user['discriminator']}"
moderator_name = moderator_user['name'] if moderator_user['discriminator'] == "0" else f"{moderator_user['name']}#{moderator_user['discriminator']}"
field_name = f"Case #{case['moderation_id']:,} ({str.title(case['moderation_type'])})" field_name = f"Case #{case['moderation_id']:,} ({str.title(case['moderation_type'])})"
field_value = f"**Target:** `{target_name}` ({target_user['id']})\n**Moderator:** `{moderator_name}` ({moderator_user['id']})" field_value = f"**Target:** {target_name} ({target_user['id']})\n**Moderator:** {moderator_name} ({moderator_user['id']})"
if len(case['reason']) > 125: if len(case['reason']) > 125:
field_value += f"\n**Reason:** `{str(case['reason'])[:125]}...`" field_value += f"\n**Reason:** `{str(case['reason'])[:125]}...`"
@ -1399,7 +1405,9 @@ class Moderation(commands.Cog):
'KICK', 'KICK',
'SOFTBAN', 'SOFTBAN',
'BAN', 'BAN',
'UNBAN' 'UNBAN',
'SLOWMODE',
'LOCKDOWN'
] ]
file = await self.ctx.message.attachments[0].read() file = await self.ctx.message.attachments[0].read()
@ -1422,6 +1430,13 @@ class Moderation(commands.Cog):
failed_cases.append(case['case']) failed_cases.append(case['case'])
continue continue
metadata = {
'imported_from': 'GalacticBot'
}
if case['type'] == 'SLOWMODE':
metadata['seconds'] = case['data']['seconds']
if case['resolved']: if case['resolved']:
resolved = 1 resolved = 1
resolved_by = None resolved_by = None
@ -1464,6 +1479,7 @@ class Moderation(commands.Cog):
self.ctx.guild.id, self.ctx.guild.id,
case['executor'], case['executor'],
case['type'], case['type'],
case['targetType'],
case['target'], case['target'],
0, 0,
duration, duration,
@ -1473,9 +1489,7 @@ class Moderation(commands.Cog):
resolved_by=resolved_by, resolved_by=resolved_by,
resolved_reason=resolved_reason, resolved_reason=resolved_reason,
changes=changes, changes=changes,
metadata={ metadata=metadata,
'imported_from': 'GalacticBot'
},
database=database database=database
) )

View file

@ -127,18 +127,19 @@ def generate_dict(result):
"moderation_id": result[0], "moderation_id": result[0],
"timestamp": result[1], "timestamp": result[1],
"moderation_type": result[2], "moderation_type": result[2],
"target_id": result[3], "target_type": result[3],
"moderator_id": result[4], "target_id": result[4],
"role_id": result[5], "moderator_id": result[5],
"duration": result[6], "role_id": result[6],
"end_timestamp": result[7], "duration": result[7],
"reason": result[8], "end_timestamp": result[8],
"resolved": result[9], "reason": result[9],
"resolved_by": result[10], "resolved": result[10],
"resolve_reason": result[11], "resolved_by": result[11],
"expired": result[12], "resolve_reason": result[12],
"changes": json.loads(result[13]), "expired": result[13],
"metadata": json.loads(result[14]), "changes": json.loads(result[14]),
"metadata": json.loads(result[15])
} }
return case return case
@ -170,16 +171,29 @@ async def fetch_user_dict(interaction: Interaction, user_id: str):
return user_dict return user_dict
async def fetch_role_dict(interaction: Interaction, role_id: str): async def fetch_channel_dict(interaction: Interaction, channel_id: str):
"""This method returns a dictionary containing either role information or a standard deleted role template.""" """This method returns a dictionary containing either channel information or a standard deleted channel template."""
try: try:
role = interaction.guild.get_role(role_id) channel = interaction.guild.get_channel(channel_id)
if not channel:
channel = await interaction.guild.fetch_channel(channel_id)
role_dict = {"id": role.id, "name": role.name} channel_dict = {"id": channel.id, "name": channel.name, "mention": channel.mention}
except NotFound: except NotFound:
channel_dict = {"id": channel_id, "name": "Deleted Channel", "mention": None}
return channel_dict
async def fetch_role_dict(interaction: Interaction, role_id: str):
"""This method returns a dictionary containing either role information or a standard deleted role template."""
role = interaction.guild.get_role(role_id)
if not role:
role_dict = {"id": role_id, "name": "Deleted Role"} role_dict = {"id": role_id, "name": "Deleted Role"}
role_dict = {"id": role.id, "name": role.name}
return role_dict return role_dict