improve moderations service

Kaveen Kumarasinghe 2 years ago
parent 7b42bc4afe
commit 893cf11e84

@ -88,26 +88,32 @@ class Moderation:
@staticmethod
def build_admin_moderated_message(moderated_message, response_message):
def build_admin_moderated_message(moderated_message, response_message, user_kicked=None, timed_out=None):
direct_message_object = isinstance(moderated_message, discord.Message)
moderated_message = moderated_message if direct_message_object else moderated_message.message
# Create a discord embed to send to the user when their message gets moderated
embed = discord.Embed(
title="A message was moderated in the "
+ moderated_message.message.guild.name
+ moderated_message.guild.name
+ " server",
description=f"Message from {moderated_message.message.author.mention} was moderated: {moderated_message.message.content}",
colour=discord.Colour.yellow(),
description=f"Message from {moderated_message.author.mention} was moderated: {moderated_message.content}",
colour=discord.Colour.red(),
)
# Get the link to the moderated message
link = f"https://discord.com/channels/{response_message.guild.id}/{response_message.channel.id}/{response_message.id}"
# set the link of the embed
embed.add_field(name="Moderated message link", value=link, inline=False)
if user_kicked:
embed.add_field(name="User kicked by", value=user_kicked, inline=False)
if timed_out:
embed.add_field(name="User timed out by: ", value=timed_out, inline=False)
return embed
@staticmethod
def determine_moderation_result(text, response):
warn_set = ThresholdSet(0.005,0.05,0.05,0.91,0.1,0.08,0.1)
delete_set = ThresholdSet(0.1,0.1,0.1,0.95,0.2,0.6,0.4)
warn_set = ThresholdSet(0.005,0.05,0.05,0.91,0.1,0.04,0.1)
delete_set = ThresholdSet(0.1,0.1,0.1,0.95,0.03,0.6,0.4)
warn_result, flagged_warn = warn_set.moderate(text, response)
delete_result, flagged_delete = delete_set.moderate(text, response)
@ -155,11 +161,13 @@ class Moderation:
# Send to the moderation alert channel
if moderations_alert_channel:
await moderations_alert_channel.send(
response_message = await moderations_alert_channel.send(
embed=Moderation.build_admin_moderated_message(
to_moderate, response_message
)
)
await response_message.edit(view=ModerationAdminView(to_moderate.message, response_message, True, True, True))
elif moderation_result == ModerationResult.WARN:
response_message = await moderations_alert_channel.send(
embed=Moderation.build_admin_warning_message(to_moderate.message),
@ -177,23 +185,32 @@ class Moderation:
class ModerationAdminView(discord.ui.View):
def __init__(self, message, moderation_message, nodelete=False):
def __init__(self, message, moderation_message, nodelete=False, deleted_message=False, source_deleted=False):
super().__init__(timeout=None) # 1 hour interval to redo.
component_number = 0
self.message = message
self.moderation_message = moderation_message,
self.add_item(TimeoutUserButton(self.message, self.moderation_message, component_number, 1, nodelete, source_deleted))
component_number += 1
self.add_item(TimeoutUserButton(self.message, self.moderation_message, component_number, 6, nodelete, source_deleted))
component_number += 1
self.add_item(TimeoutUserButton(self.message, self.moderation_message, component_number, 12, nodelete, source_deleted))
component_number += 1
self.add_item(TimeoutUserButton(self.message, self.moderation_message, component_number, 24, nodelete, source_deleted))
component_number += 1
if not nodelete:
self.add_item(DeleteMessageButton(self.message, self.moderation_message))
self.add_item(TimeoutUserButton(self.message, self.moderation_message, 1, nodelete))
self.add_item(TimeoutUserButton(self.message, self.moderation_message, 6, nodelete))
self.add_item(TimeoutUserButton(self.message, self.moderation_message, 12, nodelete))
self.add_item(TimeoutUserButton(self.message, self.moderation_message, 24, nodelete))
self.add_item(DeleteMessageButton(self.message, self.moderation_message, component_number))
component_number += 1
if deleted_message:
self.add_item(KickUserButton(self.message, self.moderation_message, component_number))
class DeleteMessageButton(discord.ui.Button["ModerationAdminView"]):
def __init__(self, message, moderation_message):
def __init__(self, message, moderation_message, current_num):
super().__init__(style=discord.ButtonStyle.danger, label="Delete Message")
self.message = message
self.moderation_message = moderation_message
self.current_num = current_num
async def callback(self, interaction: discord.Interaction):
@ -202,17 +219,45 @@ class DeleteMessageButton(discord.ui.Button["ModerationAdminView"]):
await interaction.response.send_message(
"This message was deleted", ephemeral=True, delete_after=10
)
await self.moderation_message[0].edit(embed=Moderation.build_admin_warning_message(self.message, deleted_message=interaction.user.mention),
while isinstance(self.moderation_message, tuple):
self.moderation_message = self.moderation_message[0]
await self.moderation_message.edit(embed=Moderation.build_admin_warning_message(self.message, deleted_message=interaction.user.mention),
view=ModerationAdminView(self.message, self.moderation_message, nodelete=True))
class KickUserButton(discord.ui.Button["ModerationAdminView"]):
def __init__(self, message, moderation_message, current_num ):
super().__init__(style=discord.ButtonStyle.danger, label="Kick User")
self.message = message
self.moderation_message = moderation_message
self.current_num = current_num
async def callback(self, interaction: discord.Interaction):
# Get the user and kick the user
try:
await self.message.author.kick(reason="You broke the server rules. Please rejoin and review the rules.")
except:
pass
await interaction.response.send_message(
"This user was attempted to be kicked", ephemeral=True, delete_after=10
)
while isinstance(self.moderation_message, tuple):
self.moderation_message = self.moderation_message[0]
await self.moderation_message.edit(embed=Moderation.build_admin_moderated_message(self.message, self.moderation_message, user_kicked=interaction.user.mention)
, view=ModerationAdminView(self.message, self.moderation_message, nodelete=True, deleted_message=False))
class TimeoutUserButton(discord.ui.Button["ModerationAdminView"]):
def __init__(self, message, moderation_message, hours, nodelete):
def __init__(self, message, moderation_message,current_num, hours, nodelete, source_deleted):
super().__init__(style=discord.ButtonStyle.danger, label=f"Timeout {hours}h")
self.message = message
self.moderation_message = moderation_message
self.hours = hours
self.nodelete = nodelete
self.current_num = current_num
self.source_deleted = source_deleted
async def callback(self, interaction: discord.Interaction):
# Get the user id
@ -230,7 +275,13 @@ class TimeoutUserButton(discord.ui.Button["ModerationAdminView"]):
await interaction.response.send_message(
f"This user was timed out for {self.hours} hour(s)", ephemeral=True, delete_after=10
)
moderation_message = self.moderation_message[0][0] if self.nodelete else self.moderation_message[0]
await moderation_message.edit(embed=Moderation.build_admin_warning_message(self.message, deleted_message=interaction.user.mention, timed_out=interaction.user.mention),
while isinstance(self.moderation_message, tuple):
self.moderation_message = self.moderation_message[0]
if not self.source_deleted:
await self.moderation_message.edit(embed=Moderation.build_admin_warning_message(self.message, deleted_message=interaction.user.mention, timed_out=interaction.user.mention),
view=ModerationAdminView(self.message, self.moderation_message, nodelete=True))
else:
await self.moderation_message.edit(embed=Moderation.build_admin_moderated_message(self.message, self.moderation_message, timed_out=interaction.user.mention),
view=ModerationAdminView(self.message, self.moderation_message, nodelete=True, deleted_message=True, source_deleted=True))

Loading…
Cancel
Save