Improve logging display
This commit is contained in:
parent
61c671c19f
commit
dfcab5eb6d
@ -54,6 +54,12 @@ class LoggingCog(commands.Cog):
|
|||||||
else:
|
else:
|
||||||
asyncio.create_task(self.start_audit_log_poller_when_ready()) # Keep this for initial start
|
asyncio.create_task(self.start_audit_log_poller_when_ready()) # Keep this for initial start
|
||||||
|
|
||||||
|
def _user_display(self, user: Union[discord.Member, discord.User]) -> str:
|
||||||
|
"""Return display name, username and ID string for a user."""
|
||||||
|
display = user.display_name if isinstance(user, discord.Member) else user.name
|
||||||
|
username = f"{user.name}#{user.discriminator}"
|
||||||
|
return f"{display} ({username}) [ID: {user.id}]"
|
||||||
|
|
||||||
async def initialize_cog(self):
|
async def initialize_cog(self):
|
||||||
"""Asynchronous initialization tasks."""
|
"""Asynchronous initialization tasks."""
|
||||||
log.info("Initializing LoggingCog...")
|
log.info("Initializing LoggingCog...")
|
||||||
@ -418,7 +424,7 @@ class LoggingCog(commands.Cog):
|
|||||||
user = await self.bot.fetch_user(member.id) # Get user object
|
user = await self.bot.fetch_user(member.id) # Get user object
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="➕ Member Joined Thread",
|
title="➕ Member Joined Thread",
|
||||||
description=f"{user.mention} joined thread {thread.mention}.",
|
description=f"{self._user_display(user)} joined thread {thread.mention}.",
|
||||||
color=discord.Color.dark_green(),
|
color=discord.Color.dark_green(),
|
||||||
author=user,
|
author=user,
|
||||||
footer=f"Thread ID: {thread.id} | User ID: {user.id}"
|
footer=f"Thread ID: {thread.id} | User ID: {user.id}"
|
||||||
@ -435,7 +441,7 @@ class LoggingCog(commands.Cog):
|
|||||||
user = await self.bot.fetch_user(member.id) # Get user object
|
user = await self.bot.fetch_user(member.id) # Get user object
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="➖ Member Left Thread",
|
title="➖ Member Left Thread",
|
||||||
description=f"{user.mention} left thread {thread.mention}.",
|
description=f"{self._user_display(user)} left thread {thread.mention}.",
|
||||||
color=discord.Color.dark_orange(),
|
color=discord.Color.dark_orange(),
|
||||||
author=user,
|
author=user,
|
||||||
footer=f"Thread ID: {thread.id} | User ID: {user.id}"
|
footer=f"Thread ID: {thread.id} | User ID: {user.id}"
|
||||||
@ -509,7 +515,7 @@ class LoggingCog(commands.Cog):
|
|||||||
|
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="📥 Member Joined",
|
title="📥 Member Joined",
|
||||||
description=f"{member.mention} ({member.id}) joined the server.",
|
description=f"{self._user_display(member)} joined the server.",
|
||||||
color=discord.Color.green(),
|
color=discord.Color.green(),
|
||||||
author=member
|
author=member
|
||||||
# Footer already includes User ID via _create_log_embed
|
# Footer already includes User ID via _create_log_embed
|
||||||
@ -527,7 +533,7 @@ class LoggingCog(commands.Cog):
|
|||||||
# We log it as a generic "left" event here.
|
# We log it as a generic "left" event here.
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="📤 Member Left",
|
title="📤 Member Left",
|
||||||
description=f"{member.mention} left the server.",
|
description=f"{self._user_display(member)} left the server.",
|
||||||
color=discord.Color.orange(),
|
color=discord.Color.orange(),
|
||||||
author=member
|
author=member
|
||||||
)
|
)
|
||||||
@ -542,7 +548,7 @@ class LoggingCog(commands.Cog):
|
|||||||
# Note: Ban reason isn't available directly in this event. Audit log might have it.
|
# Note: Ban reason isn't available directly in this event. Audit log might have it.
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="🔨 Member Banned (Event)", # Clarify this is the event, audit log has more details
|
title="🔨 Member Banned (Event)", # Clarify this is the event, audit log has more details
|
||||||
description=f"{user.mention} was banned.\n*Audit log may contain moderator and reason.*",
|
description=f"{self._user_display(user)} was banned.\n*Audit log may contain moderator and reason.*",
|
||||||
color=discord.Color.red(),
|
color=discord.Color.red(),
|
||||||
author=user # User who was banned
|
author=user # User who was banned
|
||||||
)
|
)
|
||||||
@ -556,7 +562,7 @@ class LoggingCog(commands.Cog):
|
|||||||
|
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="🔓 Member Unbanned",
|
title="🔓 Member Unbanned",
|
||||||
description=f"{user.mention} was unbanned.",
|
description=f"{self._user_display(user)} was unbanned.",
|
||||||
color=discord.Color.blurple(),
|
color=discord.Color.blurple(),
|
||||||
author=user # User who was unbanned
|
author=user # User who was unbanned
|
||||||
)
|
)
|
||||||
@ -841,7 +847,7 @@ class LoggingCog(commands.Cog):
|
|||||||
|
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="👍 Reaction Added",
|
title="👍 Reaction Added",
|
||||||
description=f"{user.mention} added {reaction.emoji} to a message by {reaction.message.author.mention} in {reaction.message.channel.mention} [Jump to Message]({reaction.message.jump_url})",
|
description=f"{self._user_display(user)} added {reaction.emoji} to a message by {self._user_display(reaction.message.author)} in {reaction.message.channel.mention} [Jump to Message]({reaction.message.jump_url})",
|
||||||
color=discord.Color.gold(),
|
color=discord.Color.gold(),
|
||||||
author=user
|
author=user
|
||||||
)
|
)
|
||||||
@ -860,7 +866,7 @@ class LoggingCog(commands.Cog):
|
|||||||
|
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title="👎 Reaction Removed",
|
title="👎 Reaction Removed",
|
||||||
description=f"{user.mention} removed {reaction.emoji} from a message by {reaction.message.author.mention} in {reaction.message.channel.mention} [Jump to Message]({reaction.message.jump_url})",
|
description=f"{self._user_display(user)} removed {reaction.emoji} from a message by {self._user_display(reaction.message.author)} in {reaction.message.channel.mention} [Jump to Message]({reaction.message.jump_url})",
|
||||||
color=discord.Color.dark_gold(),
|
color=discord.Color.dark_gold(),
|
||||||
author=user
|
author=user
|
||||||
)
|
)
|
||||||
@ -959,7 +965,7 @@ class LoggingCog(commands.Cog):
|
|||||||
|
|
||||||
embed = self._create_log_embed(
|
embed = self._create_log_embed(
|
||||||
title=action,
|
title=action,
|
||||||
description=f"{member.mention}\n{details}",
|
description=f"{self._user_display(member)}\n{details}",
|
||||||
color=color,
|
color=color,
|
||||||
author=member
|
author=member
|
||||||
)
|
)
|
||||||
@ -1264,21 +1270,21 @@ class LoggingCog(commands.Cog):
|
|||||||
audit_event_key = "audit_ban"
|
audit_event_key = "audit_ban"
|
||||||
if not await self._check_log_enabled(guild.id, audit_event_key): return
|
if not await self._check_log_enabled(guild.id, audit_event_key): return
|
||||||
title = "🛡️ Audit Log: Member Banned"
|
title = "🛡️ Audit Log: Member Banned"
|
||||||
action_desc = f"{user.mention} banned {target.mention}"
|
action_desc = f"{self._user_display(user)} banned {self._user_display(target)}"
|
||||||
color = discord.Color.red()
|
color = discord.Color.red()
|
||||||
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
||||||
elif entry.action == discord.AuditLogAction.unban:
|
elif entry.action == discord.AuditLogAction.unban:
|
||||||
audit_event_key = "audit_unban"
|
audit_event_key = "audit_unban"
|
||||||
if not await self._check_log_enabled(guild.id, audit_event_key): return
|
if not await self._check_log_enabled(guild.id, audit_event_key): return
|
||||||
title = "🛡️ Audit Log: Member Unbanned"
|
title = "🛡️ Audit Log: Member Unbanned"
|
||||||
action_desc = f"{user.mention} unbanned {target.mention}"
|
action_desc = f"{self._user_display(user)} unbanned {self._user_display(target)}"
|
||||||
color = discord.Color.blurple()
|
color = discord.Color.blurple()
|
||||||
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
||||||
elif entry.action == discord.AuditLogAction.kick:
|
elif entry.action == discord.AuditLogAction.kick:
|
||||||
audit_event_key = "audit_kick"
|
audit_event_key = "audit_kick"
|
||||||
if not await self._check_log_enabled(guild.id, audit_event_key): return
|
if not await self._check_log_enabled(guild.id, audit_event_key): return
|
||||||
title = "🛡️ Audit Log: Member Kicked"
|
title = "🛡️ Audit Log: Member Kicked"
|
||||||
action_desc = f"{user.mention} kicked {target.mention}"
|
action_desc = f"{self._user_display(user)} kicked {self._user_display(target)}"
|
||||||
color = discord.Color.brand_red()
|
color = discord.Color.brand_red()
|
||||||
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
||||||
elif entry.action == discord.AuditLogAction.member_prune:
|
elif entry.action == discord.AuditLogAction.member_prune:
|
||||||
@ -1287,7 +1293,7 @@ class LoggingCog(commands.Cog):
|
|||||||
title = "🛡️ Audit Log: Member Prune"
|
title = "🛡️ Audit Log: Member Prune"
|
||||||
days = entry.extra.get('delete_member_days')
|
days = entry.extra.get('delete_member_days')
|
||||||
count = entry.extra.get('members_removed')
|
count = entry.extra.get('members_removed')
|
||||||
action_desc = f"{user.mention} pruned {count} members inactive for {days} days."
|
action_desc = f"{self._user_display(user)} pruned {count} members inactive for {days} days."
|
||||||
color = discord.Color.dark_red()
|
color = discord.Color.dark_red()
|
||||||
# No specific target ID here
|
# No specific target ID here
|
||||||
|
|
||||||
@ -1301,7 +1307,7 @@ class LoggingCog(commands.Cog):
|
|||||||
added = [r.mention for r in after_roles if r not in before_roles]
|
added = [r.mention for r in after_roles if r not in before_roles]
|
||||||
removed = [r.mention for r in before_roles if r not in after_roles]
|
removed = [r.mention for r in before_roles if r not in after_roles]
|
||||||
if added or removed: # Only log if roles actually changed
|
if added or removed: # Only log if roles actually changed
|
||||||
action_desc = f"{user.mention} updated roles for {target.mention} ({target.id}):"
|
action_desc = f"{self._user_display(user)} updated roles for {self._user_display(target)} ({target.id}):"
|
||||||
if added: action_desc += f"\n**Added:** {', '.join(added)}"
|
if added: action_desc += f"\n**Added:** {', '.join(added)}"
|
||||||
if removed: action_desc += f"\n**Removed:** {', '.join(removed)}"
|
if removed: action_desc += f"\n**Removed:** {', '.join(removed)}"
|
||||||
color = discord.Color.blue()
|
color = discord.Color.blue()
|
||||||
@ -1317,10 +1323,10 @@ class LoggingCog(commands.Cog):
|
|||||||
title = "🛡️ Audit Log: Member Timeout Update"
|
title = "🛡️ Audit Log: Member Timeout Update"
|
||||||
if after_timed_out:
|
if after_timed_out:
|
||||||
timeout_duration = discord.utils.format_dt(after_timed_out, style='R')
|
timeout_duration = discord.utils.format_dt(after_timed_out, style='R')
|
||||||
action_desc = f"{user.mention} timed out {target.mention} ({target.id}) until {timeout_duration}"
|
action_desc = f"{self._user_display(user)} timed out {self._user_display(target)} ({target.id}) until {timeout_duration}"
|
||||||
color = discord.Color.orange()
|
color = discord.Color.orange()
|
||||||
else:
|
else:
|
||||||
action_desc = f"{user.mention} removed timeout from {target.mention} ({target.id})"
|
action_desc = f"{self._user_display(user)} removed timeout from {self._user_display(target)} ({target.id})"
|
||||||
color = discord.Color.green()
|
color = discord.Color.green()
|
||||||
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
# self._add_id_footer(embed, target, id_name="Target ID") # Footer set later
|
||||||
else:
|
else:
|
||||||
|
@ -32,6 +32,34 @@ class ModLogCog(commands.Cog):
|
|||||||
# Add command group to the bot's tree
|
# Add command group to the bot's tree
|
||||||
self.bot.tree.add_command(self.modlog_group)
|
self.bot.tree.add_command(self.modlog_group)
|
||||||
|
|
||||||
|
def _format_user(self, user: Union[Member, User, Object], guild: Optional[discord.Guild] = None) -> str:
|
||||||
|
"""Return a string with display name, username and ID for a user-like object."""
|
||||||
|
if isinstance(user, Object):
|
||||||
|
return f"Unknown User (ID: {user.id})"
|
||||||
|
if isinstance(user, Member):
|
||||||
|
display = user.display_name
|
||||||
|
elif guild and isinstance(user, User):
|
||||||
|
member = guild.get_member(user.id)
|
||||||
|
display = member.display_name if member else user.name
|
||||||
|
else:
|
||||||
|
display = user.name
|
||||||
|
username = f"{user.name}#{user.discriminator}" if isinstance(user, (Member, User)) else "Unknown"
|
||||||
|
return f"{display} ({username}) [ID: {user.id}]"
|
||||||
|
|
||||||
|
async def _fetch_user_display(self, user_id: int, guild: discord.Guild) -> str:
|
||||||
|
"""Fetch and format a user by ID for display."""
|
||||||
|
member = guild.get_member(user_id)
|
||||||
|
if member:
|
||||||
|
return self._format_user(member, guild)
|
||||||
|
user = self.bot.get_user(user_id)
|
||||||
|
if user:
|
||||||
|
return self._format_user(user, guild)
|
||||||
|
try:
|
||||||
|
user = await self.bot.fetch_user(user_id)
|
||||||
|
return self._format_user(user, guild)
|
||||||
|
except discord.HTTPException:
|
||||||
|
return f"Unknown User (ID: {user_id})"
|
||||||
|
|
||||||
def register_commands(self):
|
def register_commands(self):
|
||||||
"""Register all commands for this cog"""
|
"""Register all commands for this cog"""
|
||||||
|
|
||||||
@ -251,23 +279,12 @@ class ModLogCog(commands.Cog):
|
|||||||
timestamp=discord.utils.utcnow()
|
timestamp=discord.utils.utcnow()
|
||||||
)
|
)
|
||||||
|
|
||||||
# Handle target display - check if it's a Discord Object or User/Member
|
target_display = self._format_user(target, guild)
|
||||||
if isinstance(target, discord.Object):
|
|
||||||
# For Object, we only have the ID
|
|
||||||
target_display = f"<@{target.id}> ({target.id})"
|
|
||||||
else:
|
|
||||||
# For User/Member, we can use mention
|
|
||||||
target_display = f"{target.mention} ({target.id})"
|
|
||||||
|
|
||||||
# Determine moderator display based on source
|
|
||||||
if source == "AI_API":
|
if source == "AI_API":
|
||||||
moderator_display = f"AI System (ID: {moderator_id_override or 'Unknown'})"
|
moderator_display = f"AI System (ID: {moderator_id_override or 'Unknown'})"
|
||||||
elif isinstance(moderator, discord.Object):
|
|
||||||
# For Object, we only have the ID
|
|
||||||
moderator_display = f"<@{moderator.id}> ({moderator.id})"
|
|
||||||
else:
|
else:
|
||||||
# For User/Member, we can use mention
|
moderator_display = self._format_user(moderator, guild)
|
||||||
moderator_display = f"{moderator.mention} ({moderator.id})"
|
|
||||||
|
|
||||||
|
|
||||||
embed.add_field(name="User", value=target_display, inline=True)
|
embed.add_field(name="User", value=target_display, inline=True)
|
||||||
@ -359,9 +376,14 @@ class ModLogCog(commands.Cog):
|
|||||||
timestamp_str = record['timestamp'].strftime('%Y-%m-%d %H:%M:%S')
|
timestamp_str = record['timestamp'].strftime('%Y-%m-%d %H:%M:%S')
|
||||||
reason_str = record['reason'] or "N/A"
|
reason_str = record['reason'] or "N/A"
|
||||||
duration_str = f" ({record['duration_seconds']}s)" if record['duration_seconds'] else ""
|
duration_str = f" ({record['duration_seconds']}s)" if record['duration_seconds'] else ""
|
||||||
|
target_disp = await self._fetch_user_display(record['target_user_id'], interaction.guild)
|
||||||
|
if record['moderator_id'] == 0:
|
||||||
|
mod_disp = "AI System"
|
||||||
|
else:
|
||||||
|
mod_disp = await self._fetch_user_display(record['moderator_id'], interaction.guild)
|
||||||
response_lines.append(
|
response_lines.append(
|
||||||
f"`Case #{record['case_id']}` [{timestamp_str}] **{record['action_type']}** "
|
f"`Case #{record['case_id']}` [{timestamp_str}] **{record['action_type']}** "
|
||||||
f"Target: <@{record['target_user_id']}> Mod: <@{record['moderator_id']}> "
|
f"Target: {target_disp} Mod: {mod_disp} "
|
||||||
f"Reason: {reason_str}{duration_str}"
|
f"Reason: {reason_str}{duration_str}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -30,6 +30,12 @@ class ModerationCog(commands.Cog):
|
|||||||
# Add command group to the bot's tree
|
# Add command group to the bot's tree
|
||||||
self.bot.tree.add_command(self.moderate_group)
|
self.bot.tree.add_command(self.moderate_group)
|
||||||
|
|
||||||
|
def _user_display(self, user: Union[discord.Member, discord.User]) -> str:
|
||||||
|
"""Return display name, username and ID string for a user."""
|
||||||
|
display = user.display_name if isinstance(user, discord.Member) else user.name
|
||||||
|
username = f"{user.name}#{user.discriminator}"
|
||||||
|
return f"{display} ({username}) [ID: {user.id}]"
|
||||||
|
|
||||||
def register_commands(self):
|
def register_commands(self):
|
||||||
"""Register all commands for this cog"""
|
"""Register all commands for this cog"""
|
||||||
|
|
||||||
@ -285,11 +291,12 @@ class ModerationCog(commands.Cog):
|
|||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
# Send confirmation message with DM status
|
# Send confirmation message with DM status
|
||||||
|
target_text = self._user_display(member)
|
||||||
if send_dm:
|
if send_dm:
|
||||||
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
||||||
await interaction.response.send_message(f"🔨 **Banned {member.mention}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
await interaction.response.send_message(f"🔨 **Banned {target_text}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
||||||
else:
|
else:
|
||||||
await interaction.response.send_message(f"🔨 **Banned {member.mention}**! Reason: {reason or 'No reason provided'}\n⚠️ DM notification was disabled")
|
await interaction.response.send_message(f"🔨 **Banned {target_text}**! Reason: {reason or 'No reason provided'}\n⚠️ DM notification was disabled")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await interaction.response.send_message("❌ I don't have permission to ban this member.", ephemeral=True)
|
await interaction.response.send_message("❌ I don't have permission to ban this member.", ephemeral=True)
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
@ -349,7 +356,7 @@ class ModerationCog(commands.Cog):
|
|||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
# Send confirmation message
|
# Send confirmation message
|
||||||
await interaction.response.send_message(f"🔓 **Unbanned {banned_user}**! Reason: {reason or 'No reason provided'}")
|
await interaction.response.send_message(f"🔓 **Unbanned {self._user_display(banned_user)}**! Reason: {reason or 'No reason provided'}")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await interaction.response.send_message("❌ I don't have permission to unban this user.", ephemeral=True)
|
await interaction.response.send_message("❌ I don't have permission to unban this user.", ephemeral=True)
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
@ -429,7 +436,7 @@ class ModerationCog(commands.Cog):
|
|||||||
|
|
||||||
# Send confirmation message with DM status
|
# Send confirmation message with DM status
|
||||||
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
||||||
await interaction.response.send_message(f"👢 **Kicked {member.mention}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
await interaction.response.send_message(f"👢 **Kicked {self._user_display(member)}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await interaction.response.send_message("❌ I don't have permission to kick this member.", ephemeral=True)
|
await interaction.response.send_message("❌ I don't have permission to kick this member.", ephemeral=True)
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
@ -541,7 +548,7 @@ class ModerationCog(commands.Cog):
|
|||||||
|
|
||||||
# Send confirmation message with DM status
|
# Send confirmation message with DM status
|
||||||
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
||||||
await safe_followup(f"⏰ **Timed out {member.mention}** for {duration}! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
await safe_followup(f"⏰ **Timed out {self._user_display(member)}** for {duration}! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await safe_followup("❌ I don't have permission to timeout this member.", ephemeral=True)
|
await safe_followup("❌ I don't have permission to timeout this member.", ephemeral=True)
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
@ -606,7 +613,7 @@ class ModerationCog(commands.Cog):
|
|||||||
|
|
||||||
# Send confirmation message with DM status
|
# Send confirmation message with DM status
|
||||||
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
||||||
await interaction.response.send_message(f"⏰ **Removed timeout from {member.mention}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
await interaction.response.send_message(f"⏰ **Removed timeout from {self._user_display(member)}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await interaction.response.send_message("❌ I don't have permission to remove the timeout from this member.", ephemeral=True)
|
await interaction.response.send_message("❌ I don't have permission to remove the timeout from this member.", ephemeral=True)
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
@ -645,7 +652,7 @@ class ModerationCog(commands.Cog):
|
|||||||
logger.info(f"{len(deleted)} messages from user {user} (ID: {user.id}) were purged from channel {interaction.channel.name} (ID: {interaction.channel.id}) in {interaction.guild.name} (ID: {interaction.guild.id}) by {interaction.user} (ID: {interaction.user.id}).")
|
logger.info(f"{len(deleted)} messages from user {user} (ID: {user.id}) were purged from channel {interaction.channel.name} (ID: {interaction.channel.id}) in {interaction.guild.name} (ID: {interaction.guild.id}) by {interaction.user} (ID: {interaction.user.id}).")
|
||||||
|
|
||||||
# Send confirmation message
|
# Send confirmation message
|
||||||
await interaction.followup.send(f"🧹 **Purged {len(deleted)} messages** from {user.mention}!", ephemeral=True)
|
await interaction.followup.send(f"🧹 **Purged {len(deleted)} messages** from {self._user_display(user)}!", ephemeral=True)
|
||||||
else:
|
else:
|
||||||
# Delete messages from anyone
|
# Delete messages from anyone
|
||||||
deleted = await interaction.channel.purge(limit=amount)
|
deleted = await interaction.channel.purge(limit=amount)
|
||||||
@ -699,7 +706,7 @@ class ModerationCog(commands.Cog):
|
|||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
# Send warning message in the channel
|
# Send warning message in the channel
|
||||||
await interaction.response.send_message(f"⚠️ **{member.mention} has been warned**! Reason: {reason}")
|
await interaction.response.send_message(f"⚠️ **{self._user_display(member)} has been warned**! Reason: {reason}")
|
||||||
|
|
||||||
# Try to DM the user about the warning
|
# Try to DM the user about the warning
|
||||||
try:
|
try:
|
||||||
@ -788,7 +795,7 @@ class ModerationCog(commands.Cog):
|
|||||||
infractions = await mod_log_db.get_user_mod_logs(self.bot.pg_pool, interaction.guild.id, member.id)
|
infractions = await mod_log_db.get_user_mod_logs(self.bot.pg_pool, interaction.guild.id, member.id)
|
||||||
|
|
||||||
if not infractions:
|
if not infractions:
|
||||||
await interaction.response.send_message(f"No infractions found for {member.mention}.", ephemeral=True)
|
await interaction.response.send_message(f"No infractions found for {self._user_display(member)}.", ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
embed = discord.Embed(
|
embed = discord.Embed(
|
||||||
@ -901,11 +908,11 @@ class ModerationCog(commands.Cog):
|
|||||||
reason=f"Cleared {deleted_count} infractions. Reason: {reason or 'Not specified'}",
|
reason=f"Cleared {deleted_count} infractions. Reason: {reason or 'Not specified'}",
|
||||||
duration=None
|
duration=None
|
||||||
)
|
)
|
||||||
await interaction_confirm.response.edit_message(content=f"✅ Successfully cleared {deleted_count} infractions for {member.mention}. Reason: {reason or 'Not specified'}", view=None)
|
await interaction_confirm.response.edit_message(content=f"✅ Successfully cleared {deleted_count} infractions for {self._user_display(member)}. Reason: {reason or 'Not specified'}", view=None)
|
||||||
elif deleted_count == 0:
|
elif deleted_count == 0:
|
||||||
await interaction_confirm.response.edit_message(content=f"ℹ️ No infractions found for {member.mention} to clear.", view=None)
|
await interaction_confirm.response.edit_message(content=f"ℹ️ No infractions found for {self._user_display(member)} to clear.", view=None)
|
||||||
else: # Should not happen if 0 is returned for no logs
|
else: # Should not happen if 0 is returned for no logs
|
||||||
await interaction_confirm.response.edit_message(content=f"❌ Failed to clear infractions for {member.mention}. An error occurred.", view=None)
|
await interaction_confirm.response.edit_message(content=f"❌ Failed to clear infractions for {self._user_display(member)}. An error occurred.", view=None)
|
||||||
|
|
||||||
async def cancel_callback(interaction_cancel: discord.Interaction):
|
async def cancel_callback(interaction_cancel: discord.Interaction):
|
||||||
if interaction_cancel.user.id != interaction.user.id:
|
if interaction_cancel.user.id != interaction.user.id:
|
||||||
@ -919,7 +926,7 @@ class ModerationCog(commands.Cog):
|
|||||||
view.add_item(cancel_button)
|
view.add_item(cancel_button)
|
||||||
|
|
||||||
await interaction.response.send_message(
|
await interaction.response.send_message(
|
||||||
f"⚠️ Are you sure you want to clear **ALL** infractions for {member.mention}?\n"
|
f"⚠️ Are you sure you want to clear **ALL** infractions for {self._user_display(member)}?\n"
|
||||||
f"This action is irreversible. Reason: {reason or 'Not specified'}",
|
f"This action is irreversible. Reason: {reason or 'Not specified'}",
|
||||||
view=view,
|
view=view,
|
||||||
ephemeral=True
|
ephemeral=True
|
||||||
@ -1044,7 +1051,7 @@ class ModerationCog(commands.Cog):
|
|||||||
|
|
||||||
# Send confirmation message with DM status
|
# Send confirmation message with DM status
|
||||||
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
||||||
await ctx.reply(f"⏰ **Timed out {member.mention}** for {duration}! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
await ctx.reply(f"⏰ **Timed out {self._user_display(member)}** for {duration}! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await ctx.reply("❌ I don't have permission to timeout this member.")
|
await ctx.reply("❌ I don't have permission to timeout this member.")
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
@ -1124,7 +1131,7 @@ class ModerationCog(commands.Cog):
|
|||||||
|
|
||||||
# Send confirmation message with DM status
|
# Send confirmation message with DM status
|
||||||
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
dm_status = "✅ DM notification sent" if dm_sent else "❌ Could not send DM notification (user may have DMs disabled)"
|
||||||
await ctx.reply(f"⏰ **Removed timeout from {member.mention}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
await ctx.reply(f"⏰ **Removed timeout from {self._user_display(member)}**! Reason: {reason or 'No reason provided'}\n{dm_status}")
|
||||||
except discord.Forbidden:
|
except discord.Forbidden:
|
||||||
await ctx.reply("❌ I don't have permission to remove the timeout from this member.")
|
await ctx.reply("❌ I don't have permission to remove the timeout from this member.")
|
||||||
except discord.HTTPException as e:
|
except discord.HTTPException as e:
|
||||||
|
@ -439,9 +439,10 @@ class RoleManagementCog(commands.Cog):
|
|||||||
|
|
||||||
# Attempt to DM the user
|
# Attempt to DM the user
|
||||||
try:
|
try:
|
||||||
|
role_info = f"{role.name} (ID: {role.id})"
|
||||||
dm_embed = discord.Embed(
|
dm_embed = discord.Embed(
|
||||||
title="Role Added",
|
title="Role Added",
|
||||||
description=f"The role {role.mention} was added to you in **{interaction.guild.name}**.",
|
description=f"The role {role_info} was added to you in **{interaction.guild.name}**.",
|
||||||
color=role.color
|
color=role.color
|
||||||
)
|
)
|
||||||
dm_embed.add_field(name="Added by", value=interaction.user.mention, inline=True)
|
dm_embed.add_field(name="Added by", value=interaction.user.mention, inline=True)
|
||||||
@ -506,9 +507,10 @@ class RoleManagementCog(commands.Cog):
|
|||||||
|
|
||||||
# Attempt to DM the user
|
# Attempt to DM the user
|
||||||
try:
|
try:
|
||||||
|
role_info = f"{role.name} (ID: {role.id})"
|
||||||
dm_embed = discord.Embed(
|
dm_embed = discord.Embed(
|
||||||
title="Role Removed",
|
title="Role Removed",
|
||||||
description=f"The role {role.mention} was removed from you in **{interaction.guild.name}**.",
|
description=f"The role {role_info} was removed from you in **{interaction.guild.name}**.",
|
||||||
color=role.color
|
color=role.color
|
||||||
)
|
)
|
||||||
dm_embed.add_field(name="Removed by", value=interaction.user.mention, inline=True)
|
dm_embed.add_field(name="Removed by", value=interaction.user.mention, inline=True)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user