def render_guild_channel_update_event(self, *args, **kwargs): """Renders the named event.""" before = kwargs.get("before") after = kwargs.get("after") server_text = self.get_server_text(before) attrs = [ "category", "changed_roles", "name", "overwrites", "permissions_synced", "position", ] diff = self.get_object_diff(before, after, attrs) message = ( f"Channel with ID {before.id} modified in guild with ID {before.guild.id}" ) embed = embed_lib.generate_log_embed(message, "event") embed = self.add_diff_fields(embed, diff) embed.add_field(name="Channel Name", value=before.name) embed.add_field(name="Server", value=server_text) return message, embed
def render_member_update_event(self, *args, **kwargs): """Renders the named event.""" before = kwargs.get("before") after = kwargs.get("after") server_text = self.get_server_text(before) attrs = ["avatar_url", "avatar", "nick", "roles", "status"] diff = self.get_object_diff(before, after, attrs) message = ( f"Member with ID {before.id} was updated in guild with ID {before.guild.id}" ) if diff: embed = embed_lib.generate_log_embed(message, "event") embed = self.add_diff_fields(embed, diff) embed.add_field(name="Member", value=before) embed.add_field(name="Server", value=server_text) else: # avoid spamming of member activity changes message, embed = None, None return message, embed
def render_message_edit_event(self, *args, **kwargs): """Renders the named event.""" before = kwargs.get("before") after = kwargs.get("after") attrs = ["content", "embeds"] diff = self.get_object_diff(before, after, attrs) server_text = self.get_server_text(before.channel) message = f"Message edit detected on message with ID {before.id}" embed = embed_lib.generate_log_embed(message, "event") embed = self.add_diff_fields(embed, diff) embed.add_field(name="Author", value=before.author) embed.add_field(name="Channel", value=getattr(before.channel, "name", "DM")) embed.add_field( name="Server", value=server_text, ) return message, embed
def render_default_event(self, *args, **kwargs): """Renders the message and embed for the default case.""" event_type = kwargs.get("event_type") message = f"New event: {event_type}" embed = embed_lib.generate_log_embed(message, "event") return message, embed
def render_guild_remove_event(self, *args, **kwargs): """Renders the named event.""" guild = kwargs.get("guild") server_text = self.get_server_text(None, guild=guild) message = f"Left guild with ID {guild.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Server", value=server_text) return message, embed
def render_member_remove_event(self, *args, **kwargs): """Renders the named event.""" member = kwargs.get("member") server_text = self.get_server_text(member) message = f"Member with ID {member.id} has left guild with ID {member.guild.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Member", value=member) embed.add_field(name="Server", value=server_text) return message, embed
def render_webhooks_update_event(self, *args, **kwargs): """Renders the named event.""" channel = kwargs.get("channel_") server_text = self.get_server_text(channel) message = f"Webooks updated for channel with ID {channel.id} in guild with ID {channel.guild.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Channel", value=channel.name) embed.add_field(name="Server", value=server_text) return message, embed
def render_guild_role_delete_event(self, *args, **kwargs): """Renders the named event.""" role = kwargs.get("role") server_text = self.get_server_text(role) message = ( f"Role with name {role.name} deleted from guild with ID {role.guild.id}" ) embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Server", value=server_text) return message, embed
def render_guild_emojis_update_event(self, *args, **kwargs): """Renders the named event.""" guild = kwargs.get("guild") # before = kwargs.get("before") # after = kwargs.get("after") server_text = self.get_server_text(None, guild=guild) message = f"Emojis updated in guild with ID {guild.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Server", value=server_text) return message, embed
def render_member_unban_event(self, *args, **kwargs): """Renders the named event.""" guild = kwargs.get("guild") user = kwargs.get("user") server_text = self.get_server_text(None, guild=guild) message = f"User with ID {user.id} unbanned from guild with ID {guild.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="User", value=user) embed.add_field(name="Server", value=server_text) return message, embed
async def handle_error_log(self, message, *args, **kwargs): """Handles error logging. parameters: message (str): the message to log with the error exception (Exception): the exception object send (bool): The reverse of the above (overrides console_only) channel (int): the ID of the channel to send the log to critical (bool): True if the critical error handler should be invoked """ exception = kwargs.get("exception", None) critical = kwargs.get("critical") channel_id = kwargs.get("channel", None) console_only = self._is_console_only(kwargs, is_error=True) self.console.error(message) if console_only: return exception_string = "".join( traceback.format_exception(type(exception), exception, exception.__traceback__)) exception_string = exception_string[:1992] embed = embed_lib.generate_log_embed(message, "error") embed.timestamp = kwargs.get("time", datetime.datetime.utcnow()) if channel_id: channel = self.bot.get_channel(int(channel_id)) else: channel = None # tag user if critical if channel: content = channel.guild.owner.mention if critical else None target = channel else: target = await self.bot.get_owner() content = target.mention if critical else None if not target: self.console.warning( "Could not determine Discord target to send ERROR log") return try: await target.send(content=content, embed=embed) await target.send(f"```py\n{exception_string}```") except discord.Forbidden: pass
def render_guild_channel_pins_update_event(self, *args, **kwargs): """Renders the named event.""" channel = kwargs.get("channel_") # last_pin = kwargs.get("last_pin") server_text = self.get_server_text(channel) message = f"Channel pins updated in channel with ID {channel.id} in guild with ID {channel.guild.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Channel Name", value=channel.name) embed.add_field(name="Server", value=server_text) return message, embed
def render_command_event(self, *args, **kwargs): """Renders the named event.""" ctx = kwargs.get("context", kwargs.get("ctx")) server_text = self.get_server_text(ctx) sliced_content = f"Command detected: `{ctx.message.content[:100]}`" message = f"Command detected: {sliced_content}" embed = embed_lib.generate_log_embed(sliced_content, "event") embed.add_field(name="User", value=ctx.author) embed.add_field(name="Channel", value=getattr(ctx.channel, "name", "DM")) embed.add_field(name="Server", value=server_text) return message, embed
def render_message_delete_event(self, *args, **kwargs): """Renders the named event.""" message_object = kwargs.get("message") server_text = self.get_server_text(message_object) message = f"Message with ID {message_object.id} deleted" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Content", value=message_object.content or "None") embed.add_field(name="Author", value=message_object.author) embed.add_field( name="Channel", value=getattr(message_object.channel, "name", "DM"), ) embed.add_field(name="Server", value=server_text) return message, embed
def render_bulk_message_delete_event(self, *args, **kwargs): """Renders the named event.""" messages = kwargs.get("messages") unique_channels = set() unique_servers = set() for message in messages: unique_channels.add(message.channel.name) unique_servers.add( f"{message.channel.guild.name} ({message.channel.guild.id})") message = f"{len(messages)} messages bulk deleted!" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Channels", value=",".join(unique_channels)) embed.add_field(name="Servers", value=",".join(unique_servers)) return message, embed
def render_reaction_remove_event(self, *args, **kwargs): """Renders the named event.""" reaction = kwargs.get("reaction") user = kwargs.get("user") server_text = self.get_server_text(reaction.message.channel) message = f"Reaction removed from message with ID {reaction.message.id} by user with ID {user.id}" embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Emoji", value=reaction.emoji) embed.add_field(name="User", value=user) embed.add_field(name="Message", value=reaction.message.content or "None") embed.add_field(name="Message Author", value=reaction.message.author) embed.add_field(name="Channel", value=getattr(reaction.message.channel, "name", "DM")) embed.add_field(name="Server", value=server_text) return message, embed
def render_reaction_clear_event(self, *args, **kwargs): """Renders the named event.""" message = kwargs.get("message") reactions = kwargs.get("reactions") server_text = self.get_server_text(message.channel) message = f"{len(reactions)} cleared from message with ID {message.id}" unique_emojis = set() for reaction in reactions: unique_emojis.add(reaction.emoji) embed = embed_lib.generate_log_embed(message, "event") embed.add_field(name="Emojis", value=",".join(unique_emojis)) embed.add_field(name="Message", value=message.content or "None") embed.add_field(name="Message Author", value=message.author) embed.add_field(name="Channel", value=getattr(message.channel, "name", "DM")) embed.add_field(name="Server", value=server_text) return message, embed
async def handle_generic_log(self, message, level_, console, *args, **kwargs): """Handles most logging contexts. parameters: message (str): the message to log level (str): the logging level console (func): logging level method send (bool): The reverse of the above (overrides console_only) channel (int): the ID of the channel to send the log to """ console_only = self._is_console_only(kwargs, is_error=False) channel_id = kwargs.get("channel", None) console(message) if console_only: return channel = self.bot.get_channel(int(channel_id)) if channel_id else None if channel: target = channel else: target = await self.bot.get_owner() if not target: self.console.warning( f"Could not determine Discord target to send {level_} log") return embed = embed_lib.generate_log_embed(message, level_) embed.timestamp = kwargs.get("time", datetime.datetime.utcnow()) try: await target.send(embed=embed) except discord.Forbidden: pass
def render_guild_role_update_event(self, *args, **kwargs): """Renders the named event.""" before = kwargs.get("before") after = kwargs.get("after") server_text = self.get_server_text(before) attrs = [ "color", "mentionable", "name", "permissions", "position", "tags" ] diff = self.get_object_diff(before, after, attrs) message = ( f"Role with name {before.name} updated in guild with ID {before.guild.id}" ) embed = embed_lib.generate_log_embed(message, "event") embed = self.add_diff_fields(embed, diff) embed.add_field(name="Server", value=server_text) return message, embed
def render_guild_update_event(self, *args, **kwargs): """Renders the named event.""" before = kwargs.get("before") after = kwargs.get("after") server_text = self.get_server_text(None, guild=before) attrs = [ "banner", "banner_url", "bitrate_limit", "categories", "default_role", "description", "discovery_splash", "discovery_splash_url", "emoji_limit", "emojis", "explicit_content_filter", "features", "icon", "icon_url", "name", "owner", "region", "roles", "rules_channel", "verification_level", ] diff = self.get_object_diff(before, after, attrs) message = f"Guild with ID {before.id} updated" embed = embed_lib.generate_log_embed(message, "event") embed = self.add_diff_fields(embed, diff) embed.add_field(name="Server", value=server_text) return message, embed