from bot.cogs.cog_manager import BaseCog import discord import difflib import io class TrackingCog(BaseCog): def __init__(self, bot): super().__init__(bot) self.whitelist = set() async def on_message_delete(self, message): """Handle when messages are deleted""" if await self.process_log_whitelist(message): return if message.channel.id in self.bot.tracked_channels: member = message.author if member != self.bot.user: await message.channel.send( f"<@{member.id}> deleted {message.content}", silent=True ) async def on_message_edit(self, before, after): """Handle when messages are edited""" if await self.process_log_whitelist(before): return if before.channel.id in self.bot.tracked_channels: member = after.author if member == self.bot.user: return if before.content == after.content: return diff = difflib.unified_diff(before.content.splitlines(), after.content.splitlines()) diff_result = '\n'.join(diff) with io.BytesIO(diff_result.encode('utf-8')) as diff_file: diff_file.seek(0) await after.channel.send( f"<@{member.id}> edited a message", file=discord.File(diff_file, "diff.txt"), silent=True ) async def process_log_whitelist(self, message): """Check if channel or author is in whitelist""" return (message.channel.id in self.whitelist or (hasattr(message, 'author') and message.author.id in self.whitelist)) async def cmd_addlogwhitelist(self, message): """ Add a channel or user to logging whitelist Usage: .addlogwhitelist [user/channel mention] """ if not message.mentions and not message.channel_mentions: # If no mentions, use current channel self.whitelist.add(message.channel.id) await message.edit(content=f"✅ Added <#{message.channel.id}> to log whitelist") return for user in message.mentions: self.whitelist.add(user.id) for channel in message.channel_mentions: self.whitelist.add(channel.id) await message.edit(content="✅ Added mentioned entities to log whitelist") async def cmd_removelogwhitelist(self, message): """ Remove a channel or user from logging whitelist Usage: .removelogwhitelist [user/channel mention] """ if not message.mentions and not message.channel_mentions: # If no mentions, use current channel self.whitelist.discard(message.channel.id) await message.edit(content=f"✅ Removed <#{message.channel.id}> from log whitelist") return for user in message.mentions: self.whitelist.discard(user.id) for channel in message.channel_mentions: self.whitelist.discard(channel.id) await message.edit(content="✅ Removed mentioned entities from log whitelist") async def cmd_clearlogwhitelist(self, message): """ Clear the logging whitelist Usage: .clearlogwhitelist """ self.whitelist.clear() await message.edit(content="✅ Cleared log whitelist")