1
Fork 0
mirror of https://github.com/allthingslinux/tux.git synced 2024-10-02 16:43:12 +00:00

feat: Add new files guild.py, message.py, thread.py in tmp directory for event handling

refactor: Move event handling code from tux/cogs/events to tmp directory for better organization
fix: Comment out listeners in new files for testing purposes
chore: Delete old files guild.py, member.py, message.py in tux/cogs/events as they are no longer needed

chore: remove thread.py due to redundancy and lack of use
feat(logging/commands.py): add new CommandEventsCog to log command usage for better tracking and debugging

feat(logging): add guild logging functionality to track changes in guild

This commit introduces a new file, guild.py, which contains a GuildLogging class. This class provides various listeners to track changes in the guild such as channel creation/deletion/update, guild update, emojis update, integration create/update/delete, role create/delete/update, scheduled event create/delete/update, stage instance create/delete/update, and thread create/delete/update. The changes are sent to an audit log channel.

feat(logging): add new logging cogs for member, mod, and voice events

This commit introduces three new cogs for logging different types of events. The MemberLogging cog logs events related to members such as joining, leaving, and updates. The ModLogging cog logs events related to moderation such as creation, update, and deletion of automod rules, as well as member bans and unbans. The VoiceLogging cog logs events related to voice channels such as voice state updates. These new cogs will help in tracking and auditing activities in the server.
This commit is contained in:
kzndotsh 2024-04-09 07:26:47 +00:00
parent 0495b70a88
commit bbce1c5338
12 changed files with 665 additions and 169 deletions

49
tmp/guild.py Normal file
View file

@ -0,0 +1,49 @@
from discord.ext import commands
class GuildEventsCog(commands.Cog, name="Guild Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
# @commands.Cog.listener()
# async def on_guild_channel_create(self, channel: discord.abc.GuildChannel) -> None:
# logger.trace(f"{channel} has been created in {channel.guild}.")
# @commands.Cog.listener()
# async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel) -> None:
# logger.trace(f"{channel} has been deleted in {channel.guild}.")
# @commands.Cog.listener()
# async def on_guild_channel_pins_update(
# self,
# channel: discord.abc.GuildChannel | discord.Thread,
# last_pin: datetime | None,
# ) -> None:
# logger.trace(f"Pins in #{channel.name} have been updated. Last pin: {last_pin}")
# @commands.Cog.listener()
# async def on_guild_channel_update(
# self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel
# ) -> None:
# logger.trace(f"Channel updated: {before} -> {after}")
# @commands.Cog.listener()
# async def on_guild_role_create(self, role: discord.Role) -> None:
# logger.trace(f"Role created: {role}")
# @commands.Cog.listener()
# async def on_guild_role_delete(self, role: discord.Role) -> None:
# logger.trace(f"Role deleted: {role}")
# @commands.Cog.listener()
# async def on_guild_role_update(self, before: discord.Role, after: discord.Role) -> None:
# logger.trace(f"Role updated: {before} -> {after}")
# @commands.Cog.listener()
# async def on_guild_update(self, before: discord.Guild, after: discord.Guild) -> None:
# logger.trace(f"Guild updated: {before} -> {after}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(GuildEventsCog(bot))

30
tmp/message.py Normal file
View file

@ -0,0 +1,30 @@
from discord.ext import commands
class MessageEventsCog(commands.Cog, name="Message Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
# @commands.Cog.listener()
# async def on_bulk_message_delete(self, messages: list[discord.Message]) -> None:
# logger.trace(f"Messages deleted: {messages}")
# @commands.Cog.listener()
# async def on_message_delete(self, message: discord.Message) -> None:
# logger.trace(f"Message deleted: {message}")
# # if sender is a bot, ignore, some bots delete their own messages
# if message.author.bot:
# return
# @commands.Cog.listener()
# async def on_message_edit(self, before: discord.Message, after: discord.Message) -> None:
# logger.trace(f"Message edited: {before} -> {after}")
# @commands.Cog.listener()
# async def on_message(self, message: discord.Message) -> None:
# logger.trace(f"Message received: {message}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(MessageEventsCog(bot))

44
tmp/thread.py Normal file
View file

@ -0,0 +1,44 @@
from discord.ext import commands
class ThreadEventsCog(commands.Cog, name="Thread Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
# @commands.Cog.listener()
# async def on_thread_create(self, thread: discord.Thread) -> None:
# logger.trace(f"{thread} has been created.")
# @commands.Cog.listener()
# async def on_thread_delete(self, thread: discord.Thread) -> None:
# logger.trace(f"{thread} has been deleted.")
# @commands.Cog.listener()
# async def on_thread_remove(self, thread: discord.Thread) -> None:
# logger.trace(f"{thread} has been removed.")
# @commands.Cog.listener()
# async def on_thread_update(self, before: discord.Thread, after: discord.Thread) -> None:
# logger.trace(f"Thread updated: {before} -> {after}")
# @commands.Cog.listener()
# async def on_thread_join(self, thread: discord.Thread) -> None:
# logger.trace(f"{thread} has been joined.")
# @commands.Cog.listener()
# async def on_thread_member_join(self, member: discord.ThreadMember) -> None:
# logger.trace(f"Member {member} joined the thread.")
# @commands.Cog.listener()
# async def on_thread_member_remove(self, member: discord.ThreadMember) -> None:
# logger.trace(f"Member {member} left the thread.")
# @commands.Cog.listener()
# async def on_thread_member_update(
# self, before: discord.ThreadMember, after: discord.ThreadMember
# ) -> None:
# logger.trace(f"Thread member updated: {before} -> {after}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(ThreadEventsCog(bot))

View file

@ -1,52 +0,0 @@
from datetime import datetime
import discord
from discord.ext import commands
from loguru import logger
class GuildEventsCog(commands.Cog, name="Guild Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
@commands.Cog.listener()
async def on_guild_channel_create(self, channel: discord.abc.GuildChannel) -> None:
logger.trace(f"{channel} has been created in {channel.guild}.")
@commands.Cog.listener()
async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel) -> None:
logger.trace(f"{channel} has been deleted in {channel.guild}.")
@commands.Cog.listener()
async def on_guild_channel_pins_update(
self,
channel: discord.abc.GuildChannel | discord.Thread,
last_pin: datetime | None,
) -> None:
logger.trace(f"Pins in #{channel.name} have been updated. Last pin: {last_pin}")
@commands.Cog.listener()
async def on_guild_channel_update(
self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel
) -> None:
logger.trace(f"Channel updated: {before} -> {after}")
@commands.Cog.listener()
async def on_guild_role_create(self, role: discord.Role) -> None:
logger.trace(f"Role created: {role}")
@commands.Cog.listener()
async def on_guild_role_delete(self, role: discord.Role) -> None:
logger.trace(f"Role deleted: {role}")
@commands.Cog.listener()
async def on_guild_role_update(self, before: discord.Role, after: discord.Role) -> None:
logger.trace(f"Role updated: {before} -> {after}")
@commands.Cog.listener()
async def on_guild_update(self, before: discord.Guild, after: discord.Guild) -> None:
logger.trace(f"Guild updated: {before} -> {after}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(GuildEventsCog(bot))

View file

@ -1,36 +0,0 @@
import discord
from discord.ext import commands
from loguru import logger
class MemberEventsCog(commands.Cog, name="Member Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
@commands.Cog.listener()
async def on_member_ban(self, guild: discord.Guild, user: discord.User) -> None:
logger.trace(f"User {user} was banned from {guild}.")
@commands.Cog.listener()
async def on_member_join(self, member: discord.Member) -> None:
logger.trace(f"Member joined: {member}")
@commands.Cog.listener()
async def on_member_remove(self, member: discord.Member) -> None:
logger.trace(f"Member left: {member}")
@commands.Cog.listener()
async def on_member_unban(self, guild: discord.Guild, user: discord.User) -> None:
logger.trace(f"User {user} was unbanned from {guild}.")
@commands.Cog.listener()
async def on_member_update(self, before: discord.Member, after: discord.Member) -> None:
logger.trace(f"Member updated: {before} -> {after}")
@commands.Cog.listener()
async def on_user_update(self, before: discord.User, after: discord.User) -> None:
logger.trace(f"User updated: {before} -> {after}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(MemberEventsCog(bot))

View file

@ -1,32 +0,0 @@
import discord
from discord.ext import commands
from loguru import logger
class MessageEventsCog(commands.Cog, name="Message Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
@commands.Cog.listener()
async def on_bulk_message_delete(self, messages: list[discord.Message]) -> None:
logger.trace(f"Messages deleted: {messages}")
@commands.Cog.listener()
async def on_message_delete(self, message: discord.Message) -> None:
logger.trace(f"Message deleted: {message}")
# if sender is a bot, ignore, some bots delete their own messages
if message.author.bot:
return
@commands.Cog.listener()
async def on_message_edit(self, before: discord.Message, after: discord.Message) -> None:
logger.trace(f"Message edited: {before} -> {after}")
@commands.Cog.listener()
async def on_message(self, message: discord.Message) -> None:
logger.trace(f"Message received: {message}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(MessageEventsCog(bot))

View file

@ -1,46 +0,0 @@
import discord
from discord.ext import commands
from loguru import logger
class ThreadEventsCog(commands.Cog, name="Thread Events Handler"):
def __init__(self, bot: commands.Bot) -> None:
self.bot = bot
@commands.Cog.listener()
async def on_thread_create(self, thread: discord.Thread) -> None:
logger.trace(f"{thread} has been created.")
@commands.Cog.listener()
async def on_thread_delete(self, thread: discord.Thread) -> None:
logger.trace(f"{thread} has been deleted.")
@commands.Cog.listener()
async def on_thread_remove(self, thread: discord.Thread) -> None:
logger.trace(f"{thread} has been removed.")
@commands.Cog.listener()
async def on_thread_update(self, before: discord.Thread, after: discord.Thread) -> None:
logger.trace(f"Thread updated: {before} -> {after}")
@commands.Cog.listener()
async def on_thread_join(self, thread: discord.Thread) -> None:
logger.trace(f"{thread} has been joined.")
@commands.Cog.listener()
async def on_thread_member_join(self, member: discord.ThreadMember) -> None:
logger.trace(f"Member {member} joined the thread.")
@commands.Cog.listener()
async def on_thread_member_remove(self, member: discord.ThreadMember) -> None:
logger.trace(f"Member {member} left the thread.")
@commands.Cog.listener()
async def on_thread_member_update(
self, before: discord.ThreadMember, after: discord.ThreadMember
) -> None:
logger.trace(f"Thread member updated: {before} -> {after}")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(ThreadEventsCog(bot))

View file

@ -9,14 +9,17 @@ class CommandEventsCog(commands.Cog, name="Command Events Handler"):
@commands.Cog.listener()
async def on_app_command_completion(
self,
interaction: discord.Interaction,
command: discord.app_commands.Command | discord.app_commands.ContextMenu,
self, interaction: discord.Interaction, command: discord.app_commands.AppCommand
) -> None:
logger.info(
f"'{command.name}' command was used by {interaction.user} in {interaction.channel}."
)
@commands.Cog.listener()
async def on_command_completion(self, ctx: commands.Context[commands.Bot]) -> None:
if ctx.command is not None:
logger.info(f"'{ctx.command.name}' command was used by {ctx.author} in {ctx.channel}.")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(CommandEventsCog(bot))

299
tux/cogs/logging/guild.py Normal file
View file

@ -0,0 +1,299 @@
from typing import Any
import discord
from discord.ext import commands
from tux.utils.constants import Constants as CONST
from tux.utils.embeds import EmbedCreator
from tux.utils.functions import compare_changes, extract_guild_attrs
class GuildLogging(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.audit_log_channel_id: int = CONST.LOG_CHANNELS["AUDIT"]
async def send_to_audit_log(self, embed: discord.Embed):
channel = self.bot.get_channel(self.audit_log_channel_id)
if isinstance(channel, discord.TextChannel):
await channel.send(embed=embed)
"""Audit logging - Channel"""
@commands.Cog.listener()
async def on_guild_channel_create(self, channel: discord.abc.GuildChannel):
embed = EmbedCreator.create_log_embed(
title="Channel Created",
description=f"Channel: {channel.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_channel_delete(self, channel: discord.abc.GuildChannel):
embed = EmbedCreator.create_log_embed(
title="Channel Deleted",
description=f"Channel: {channel.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_channel_update(
self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel
):
embed = EmbedCreator.create_log_embed(
title="Channel Updated",
description=f"Channel: {before.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_channel_pins_update(
self,
channel: discord.abc.GuildChannel | discord.Thread | discord.abc.PrivateChannel,
last_pin: discord.Message | None,
):
if isinstance(channel, discord.abc.GuildChannel | discord.Thread):
channel_name = channel.name
else:
channel_name = "Private Channel"
embed = EmbedCreator.create_log_embed(
title="Channel Pins Updated", description=f"Channel: {channel_name}"
)
if isinstance(channel, discord.TextChannel | discord.Thread):
pins = await channel.pins()
if pins:
embed.add_field(name="Latest pin", value=f"[Jump to message]({pins[0].jump_url})")
await self.send_to_audit_log(embed)
"""Audit logging - Guild"""
@commands.Cog.listener()
async def on_guild_update(self, before: discord.Guild, after: discord.Guild):
before_attrs: dict[str, Any] = extract_guild_attrs(before)
after_attrs: dict[str, Any] = extract_guild_attrs(after)
embed = EmbedCreator.create_log_embed(title="Guild Updated", description="Before and after")
if changes := compare_changes(before_attrs, after_attrs):
embed.add_field(name="Changes", value="\n".join(changes).upper(), inline=False)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_emojis_update(
self, guild: discord.Guild, before: list[discord.Emoji], after: list[discord.Emoji]
):
embed = EmbedCreator.create_log_embed(
title="Guild Emojis Updated",
description=f"Emojis: {len(before)} -> {len(after)}",
)
new_emoji = [emoji for emoji in after if emoji not in before]
deleted_emoji = [emoji for emoji in before if emoji not in after]
if new_emoji:
emojis_str = " ".join([str(emoji) for emoji in new_emoji])
embed.add_field(name="Added emoji", value=emojis_str[:1024])
if deleted_emoji:
emojis_str = ", ".join([emoji.name for emoji in deleted_emoji])
embed.add_field(
name="Deleted Emoji",
value=emojis_str[:1024],
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_stickers_update(
self, guild: discord.Guild, before: list[discord.Sticker], after: list[discord.Sticker]
):
embed = discord.Embed(
title="Guild Stickers Updated",
description=f"Stickers: {len(before)} -> {len(after)}",
)
new_stickers = [sticker for sticker in after if sticker not in before]
deleted_stickers = [sticker for sticker in before if sticker not in after]
if new_stickers:
stickers_str = "\n".join(
[f"[{sticker.name}]({sticker.url})" for sticker in new_stickers]
)
embed.add_field(name="Added Stickers", value=stickers_str[:1024])
embed.set_image(url=new_stickers[0].url)
if deleted_stickers:
stickers_str = ", ".join([sticker.name for sticker in deleted_stickers])
embed.add_field(name="Deleted Stickers", value=stickers_str[:1024])
await self.send_to_audit_log(embed)
"""Audit logging - Integration"""
@commands.Cog.listener()
async def on_integration_create(self, integration: discord.Integration):
embed = EmbedCreator.create_log_embed(
title="Integration Created",
description=f"Integration: {integration.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_integration_update(self, integration: discord.Integration):
embed = EmbedCreator.create_log_embed(
title="Integration Updated",
description=f"Integration: {integration.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_integration_delete(self, integration: discord.Integration):
embed = EmbedCreator.create_log_embed(
title="Integration Deleted",
description=f"Integration: {integration.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_webhooks_update(self, channel: discord.TextChannel):
embed = EmbedCreator.create_log_embed(
title="Webhooks Updated",
description=f"Channel: {channel.name}",
)
await self.send_to_audit_log(embed)
"""Audit logging - Role"""
@commands.Cog.listener()
async def on_guild_role_create(self, role: discord.Role):
embed = EmbedCreator.create_log_embed(
title="Role Created",
description=f"Role: {role.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_role_delete(self, role: discord.Role):
embed = EmbedCreator.create_log_embed(
title="Role Deleted",
description=f"Role: {role.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_guild_role_update(self, before: discord.Role, after: discord.Role):
embed = EmbedCreator.create_log_embed(
title="Role Updated",
description=f"Role: {before.name}",
)
await self.send_to_audit_log(embed)
""" Guild Logging - Scheduled Events"""
@commands.Cog.listener()
async def on_scheduled_event_create(self, event: discord.ScheduledEvent):
embed = EmbedCreator.create_log_embed(
title="Scheduled Event Created",
description=f"Event: {event.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_scheduled_event_delete(self, event: discord.ScheduledEvent):
embed = EmbedCreator.create_log_embed(
title="Scheduled Event Deleted",
description=f"Event: {event.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_scheduled_event_update(
self, before: discord.ScheduledEvent, after: discord.ScheduledEvent
):
embed = EmbedCreator.create_log_embed(
title="Scheduled Event Updated",
description=f"Event: {before.name}",
)
await self.send_to_audit_log(embed)
"""Guild Logging - Stage Instance"""
@commands.Cog.listener()
async def on_stage_instance_create(self, stage_instance: discord.StageInstance):
embed = EmbedCreator.create_log_embed(
title="Stage Instance Created",
description=f"Stage: {stage_instance.topic}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_stage_instance_delete(self, stage_instance: discord.StageInstance):
embed = EmbedCreator.create_log_embed(
title="Stage Instance Deleted",
description=f"Stage: {stage_instance.topic}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_stage_instance_update(
self, before: discord.StageInstance, after: discord.StageInstance
):
embed = EmbedCreator.create_log_embed(
title="Stage Instance Updated",
description=f"Stage: {before.topic}",
)
await self.send_to_audit_log(embed)
"""Guild Logging - Thread"""
@commands.Cog.listener()
async def on_thread_create(self, thread: discord.Thread):
embed = EmbedCreator.create_log_embed(
title="Thread Created",
description=f"Thread: {thread.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_thread_delete(self, thread: discord.Thread):
embed = EmbedCreator.create_log_embed(
title="Thread Deleted",
description=f"Thread: {thread.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_thread_update(self, before: discord.Thread, after: discord.Thread):
embed = EmbedCreator.create_log_embed(
title="Thread Updated",
description=f"Thread: {before.name}",
)
await self.send_to_audit_log(embed)
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(GuildLogging(bot))

View file

@ -0,0 +1,88 @@
from typing import Any
import discord
from discord.ext import commands
from tux.utils.constants import Constants as CONST
from tux.utils.embeds import EmbedCreator
from tux.utils.functions import compare_changes, extract_member_attrs
class MemberLogging(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.audit_log_channel_id: int = CONST.LOG_CHANNELS["AUDIT"]
self.mod_log_channel_id: int = CONST.LOG_CHANNELS["MOD"]
async def send_to_audit_log(self, embed: discord.Embed):
channel = self.bot.get_channel(self.audit_log_channel_id)
if isinstance(channel, discord.TextChannel):
await channel.send(embed=embed)
@commands.Cog.listener()
async def on_invite_create(self, invite: discord.Invite):
embed = EmbedCreator.create_log_embed(
title="Invite Created",
description=f"Invite: {invite.url}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_invite_delete(self, invite: discord.Invite):
embed = EmbedCreator.create_log_embed(
title="Invite Deleted",
description=f"Invite: {invite.url}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_member_join(self, member: discord.Member):
embed = EmbedCreator.create_log_embed(
title="Member Joined",
description=f"User: {member.name}",
)
await self.send_to_audit_log(embed)
@commands.Cog.listener()
async def on_member_remove(self, member: discord.Member):
"""
Called when a Member leaves a Guild.
If the guild or member could not be found in the internal cache, this event will not be called, you may use on_raw_member_remove() instead.
Args:
member: The discord.Member instance representing the member being removed.
Returns:
None
"""
embed = EmbedCreator.create_log_embed(
title="Member Removed",
description=f"User: {member.name}",
)
await self.send_to_audit_log(embed)
"""Mod logging - Member"""
@commands.Cog.listener()
async def on_member_update(self, before: discord.Member, after: discord.Member):
before_attrs: dict[str, Any] = extract_member_attrs(before)
after_attrs: dict[str, Any] = extract_member_attrs(after)
embed = EmbedCreator.create_log_embed(
title="Member Updated", description="Before and after"
)
if changes := compare_changes(before_attrs, after_attrs):
embed.add_field(name="Changes", value="\n".join(changes).upper(), inline=False)
await self.send_to_audit_log(embed)
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(MemberLogging(bot))

74
tux/cogs/logging/mod.py Normal file
View file

@ -0,0 +1,74 @@
import discord
from discord.ext import commands
from tux.utils.constants import Constants as CONST
from tux.utils.embeds import EmbedCreator
class ModLogging(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.mod_log_channel_id: int = CONST.LOG_CHANNELS["MOD"]
async def send_to_mod_log(self, embed: discord.Embed):
channel = self.bot.get_channel(self.mod_log_channel_id)
if isinstance(channel, discord.TextChannel):
await channel.send(embed=embed)
@commands.Cog.listener()
async def on_automod_rule_create(self, rule: discord.AutoModRule):
embed = EmbedCreator.create_log_embed(
title="Automod Rule Created",
description=f"Rule: {rule.name}",
)
await self.send_to_mod_log(embed)
@commands.Cog.listener()
async def on_automod_rule_update(self, rule: discord.AutoModRule):
embed = EmbedCreator.create_log_embed(
title="Automod Rule Updated",
description=f"Rule: {rule.name}",
)
await self.send_to_mod_log(embed)
@commands.Cog.listener()
async def on_automod_rule_delete(self, rule: discord.AutoModRule):
embed = EmbedCreator.create_log_embed(
title="Automod Rule Deleted",
description=f"Rule: {rule.name}",
)
await self.send_to_mod_log(embed)
@commands.Cog.listener()
async def on_member_ban(self, guild: discord.Guild, user: discord.User):
embed = EmbedCreator.create_log_embed(
title="Member Banned",
description=f"User: {user.name}",
)
await self.send_to_mod_log(embed)
@commands.Cog.listener()
async def on_member_unban(self, guild: discord.Guild, user: discord.User):
embed = EmbedCreator.create_log_embed(
title="Member Unbanned",
description=f"User: {user.name}",
)
await self.send_to_mod_log(embed)
@commands.Cog.listener()
async def on_reaction_clear(self, message: discord.Message, reactions: list[discord.Reaction]):
embed = EmbedCreator.create_log_embed(
title="Reactions cleared for",
description=f"Message: {message.jump_url}",
)
await self.send_to_mod_log(embed)
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(ModLogging(bot))

75
tux/cogs/logging/voice.py Normal file
View file

@ -0,0 +1,75 @@
from typing import Any
import discord
from discord.ext import commands
from tux.utils.constants import Constants as CONST
from tux.utils.embeds import EmbedCreator
class VoiceLogging(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
self.audit_log_channel_id: int = CONST.LOG_CHANNELS["AUDIT"]
self.mod_log_channel_id: int = CONST.LOG_CHANNELS["MOD"]
async def send_to_audit_log(self, embed: discord.Embed):
channel = self.bot.get_channel(self.audit_log_channel_id)
if isinstance(channel, discord.TextChannel):
await channel.send(embed=embed)
def get_channel_change(self, before: discord.VoiceState, after: discord.VoiceState) -> str:
if before.channel != after.channel:
if after.channel:
return f"has joined {after.channel.name}."
if before.channel:
return f"has left {before.channel.name}."
return ""
def get_state_change(self, state_name: str, before_state: Any, after_state: Any) -> str:
if before_state != after_state:
action = state_name + ("d" if after_state else "ed")
return f"has been {action}."
return ""
@commands.Cog.listener()
async def on_voice_state_update(
self,
member: discord.Member,
before: discord.VoiceState,
after: discord.VoiceState,
) -> None:
embed = EmbedCreator.create_log_embed(
title="Voice State Update",
description=f"User: {member.name}",
)
changes: list[str] = []
if channel_change := self.get_channel_change(before, after):
changes.append(channel_change)
if mute_change := self.get_state_change("mute", before.self_mute, after.self_mute):
changes.append(mute_change)
if deaf_change := self.get_state_change("deaf", before.self_deaf, after.self_deaf):
changes.append(deaf_change)
if stream_change := self.get_state_change(
"start streaming", before.self_stream, after.self_stream
):
changes.append(stream_change)
if video_change := self.get_state_change(
"start video", before.self_video, after.self_video
):
changes.append(video_change)
if changes:
embed.add_field(name="Changes", value=" ".join(changes), inline=False)
await self.send_to_audit_log(embed)
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(VoiceLogging(bot))