Compare commits
2 commits
0d180d16c4
...
2f26da72ab
Author | SHA1 | Date | |
---|---|---|---|
2f26da72ab | |||
477673b384 |
1 changed files with 58 additions and 20 deletions
|
@ -124,23 +124,6 @@ class Moderation(commands.Cog):
|
||||||
self.logger.fatal("Unable to access the MySQL database!\nError:\n%s", e.msg)
|
self.logger.fatal("Unable to access the MySQL database!\nError:\n%s", e.msg)
|
||||||
raise ConnectionRefusedError(f"Unable to access the MySQL Database!\n{e.msg}") from e
|
raise ConnectionRefusedError(f"Unable to access the MySQL Database!\n{e.msg}") from e
|
||||||
|
|
||||||
def generate_dict(self, result):
|
|
||||||
case: dict = {
|
|
||||||
"moderation_id": result[0],
|
|
||||||
"timestamp": result[1],
|
|
||||||
"moderation_type": result[2],
|
|
||||||
"target_id": result[3],
|
|
||||||
"moderator_id": result[4],
|
|
||||||
"duration": result[5],
|
|
||||||
"end_timestamp": result[6],
|
|
||||||
"reason": result[7],
|
|
||||||
"resolved": result[8],
|
|
||||||
"resolved_by": result[9],
|
|
||||||
"resolve_reason": result[10],
|
|
||||||
"expired": result[11]
|
|
||||||
}
|
|
||||||
return case
|
|
||||||
|
|
||||||
async def create_guild_table(self, guild: discord.Guild):
|
async def create_guild_table(self, guild: discord.Guild):
|
||||||
database = await self.connect()
|
database = await self.connect()
|
||||||
cursor = database.cursor()
|
cursor = database.cursor()
|
||||||
|
@ -212,6 +195,23 @@ class Moderation(commands.Cog):
|
||||||
cursor.execute(f"SELECT moderation_id FROM `moderation_{guild_id}` ORDER BY moderation_id DESC LIMIT 1")
|
cursor.execute(f"SELECT moderation_id FROM `moderation_{guild_id}` ORDER BY moderation_id DESC LIMIT 1")
|
||||||
return cursor.fetchone()[0] + 1
|
return cursor.fetchone()[0] + 1
|
||||||
|
|
||||||
|
def generate_dict(self, result):
|
||||||
|
case: dict = {
|
||||||
|
"moderation_id": result[0],
|
||||||
|
"timestamp": result[1],
|
||||||
|
"moderation_type": result[2],
|
||||||
|
"target_id": result[3],
|
||||||
|
"moderator_id": result[4],
|
||||||
|
"duration": result[5],
|
||||||
|
"end_timestamp": result[6],
|
||||||
|
"reason": result[7],
|
||||||
|
"resolved": result[8],
|
||||||
|
"resolved_by": result[9],
|
||||||
|
"resolve_reason": result[10],
|
||||||
|
"expired": result[11]
|
||||||
|
}
|
||||||
|
return case
|
||||||
|
|
||||||
async def fetch_user_dict(self, interaction: discord.Interaction, user_id: str):
|
async def fetch_user_dict(self, interaction: discord.Interaction, user_id: str):
|
||||||
"""This method returns a dictionary containing either user information or a standard deleted user template."""
|
"""This method returns a dictionary containing either user information or a standard deleted user template."""
|
||||||
try:
|
try:
|
||||||
|
@ -234,7 +234,7 @@ class Moderation(commands.Cog):
|
||||||
|
|
||||||
Valid arguments for 'embed_type':
|
Valid arguments for 'embed_type':
|
||||||
- 'message'
|
- 'message'
|
||||||
- 'log' - WIP
|
- 'list' - WIP
|
||||||
- 'case'
|
- 'case'
|
||||||
|
|
||||||
Required arguments for 'message':
|
Required arguments for 'message':
|
||||||
|
@ -445,6 +445,42 @@ class Moderation(commands.Cog):
|
||||||
pass
|
pass
|
||||||
await self.mysql_log(interaction.guild.id, interaction.user.id, 'UNBAN', target.id, 'NULL', reason)
|
await self.mysql_log(interaction.guild.id, interaction.user.id, 'UNBAN', target.id, 'NULL', reason)
|
||||||
|
|
||||||
|
@app_commands.command(name="history")
|
||||||
|
async def history(self, interaction: discord.Interaction, target: discord.Member = None, moderator: discord.Member = None, channel: discord.abc.GuildChannel = None, pagesize: app_commands.Range[int, 1, 25] = 5, page: int = 1):
|
||||||
|
"""List previous infractions."""
|
||||||
|
database = await self.connect()
|
||||||
|
cursor = database.cursor()
|
||||||
|
if target:
|
||||||
|
query = "SELECT * FROM moderation_%s WHERE target_id = %s"
|
||||||
|
cursor.execute(query, (interaction.guild.id, target.id))
|
||||||
|
results = cursor.fetchall()
|
||||||
|
result_dict_list = []
|
||||||
|
for result in results:
|
||||||
|
case_dict = self.generate_dict(result)
|
||||||
|
result_dict_list.append(case_dict)
|
||||||
|
case_quantity = len(result_dict_list)
|
||||||
|
page_quantity = round(case_quantity / pagesize)
|
||||||
|
start_index = (page - 1) * pagesize
|
||||||
|
end_index = page * pagesize
|
||||||
|
embed = discord.Embed(color= await self.bot.get_embed_color(None))
|
||||||
|
embed.set_author(url=interaction.guild.icon.url, name='Infraction History')
|
||||||
|
embed.set_footer(text=f"Page {page}/{page_quantity} | {case_quantity} Results")
|
||||||
|
for case in result_dict_list[start_index:end_index]:
|
||||||
|
target_user = await self.fetch_user_dict(case['target_id'])
|
||||||
|
moderator_user = await self.fetch_user_dict(case['moderator_id'])
|
||||||
|
target_name = f"`{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_value = f"**Target:** `{target_name}` ({target_user['id']})\n**Moderator:** `{moderator_name}` ({moderator_user['id']})\n**Reason:** `{str(case['reason'])[:150]}`"
|
||||||
|
if case['duration'] != 'NULL':
|
||||||
|
td = timedelta(**{unit: int(val) for unit, val in zip(["hours", "minutes", "seconds"], case_dict["duration"].split(":"))})
|
||||||
|
duration_embed = f"{humanize.precisedelta(td)} | <t:{case_dict['end_timestamp']}:R>" if case_dict["expired"] == '0' else f"{humanize.precisedelta(td)} | Expired"
|
||||||
|
field_value = field_value + f"\n**Duration:** {duration_embed}"
|
||||||
|
if case['resolved'] == '1':
|
||||||
|
field_value = field_value + "\n**Resolved:** True"
|
||||||
|
embed.add_field(name=field_name, value=field_value, inline=False)
|
||||||
|
await interaction.response.send_message(embed=embed)
|
||||||
|
|
||||||
@app_commands.command(name="resolve")
|
@app_commands.command(name="resolve")
|
||||||
async def resolve(self, interaction: discord.Interaction, case_number: int, reason: str = None):
|
async def resolve(self, interaction: discord.Interaction, case_number: int, reason: str = None):
|
||||||
"""Resolve a specific case."""
|
"""Resolve a specific case."""
|
||||||
|
@ -469,14 +505,16 @@ class Moderation(commands.Cog):
|
||||||
case = self.generate_dict(result_2)
|
case = self.generate_dict(result_2)
|
||||||
if reason is None:
|
if reason is None:
|
||||||
reason = "No reason given."
|
reason = "No reason given."
|
||||||
if case['moderation_type'] in ['MUTE', 'TEMPBAN']:
|
if case['moderation_type'] in ['UNMUTE', 'UNBAN']:
|
||||||
|
await interaction.response.send_message(content="You cannot resolve this type of moderation!", ephemeral=True)
|
||||||
|
if case['moderation_type'] in ['MUTE', 'TEMPBAN', 'BAN']:
|
||||||
if case['moderation_type'] == 'MUTE':
|
if case['moderation_type'] == 'MUTE':
|
||||||
try:
|
try:
|
||||||
member = await interaction.guild.fetch_member(case['target_id'])
|
member = await interaction.guild.fetch_member(case['target_id'])
|
||||||
await member.timeout(None, reason=f"Case #{case_number} resolved by {interaction.user.id}")
|
await member.timeout(None, reason=f"Case #{case_number} resolved by {interaction.user.id}")
|
||||||
except discord.NotFound:
|
except discord.NotFound:
|
||||||
pass
|
pass
|
||||||
if case['moderation_type'] == 'TEMPBAN':
|
if case['moderation_type'] in ['TEMPBAN', 'BAN']:
|
||||||
try:
|
try:
|
||||||
user = await interaction.client.fetch_user(case['target_id'])
|
user = await interaction.client.fetch_user(case['target_id'])
|
||||||
await interaction.guild.unban(user, reason=f"Case #{case_number} resolved by {interaction.user.id}")
|
await interaction.guild.unban(user, reason=f"Case #{case_number} resolved by {interaction.user.id}")
|
||||||
|
|
Loading…
Reference in a new issue