diff --git a/VocalMaisBot.py b/VocalMaisBot.py index 82c802c..bda8cce 100755 --- a/VocalMaisBot.py +++ b/VocalMaisBot.py @@ -3,7 +3,6 @@ import argparse import logging import sys from pathlib import Path -from typing import List import discord import discord.utils @@ -34,7 +33,7 @@ class VocalMaisBot(commands.Cog): @commands.Cog.listener() async def on_ready(self): logger.info("Connected and ready!") - logger.info(f"Logged in as {self.bot.user}") + logger.info(f"Logged in as {discord_utils.to_string(self.bot.user)}") self.owner = (await self.bot.application_info()).owner @@ -80,7 +79,7 @@ class VocalMaisBot(commands.Cog): else: return await ctx.send(f":x: this command can not be run: {error}") else: - logger.error(f"Error when running command '{ctx.message.content}' by {ctx.author.name}#{ctx.author.discriminator} in {ctx.guild.name}", exc_info = error) + logger.error(f"Error when running command '{ctx.message.content}' by {discord_utils.to_string(ctx.author)} in {discord_utils.to_string(ctx.guild)}", exc_info = error) if isinstance(error, commands.CommandInvokeError): await ctx.send(f":x: There was an error during the command execution :dizzy_face:") else: @@ -89,7 +88,7 @@ class VocalMaisBot(commands.Cog): def cog_check(self, ctx: commands.Context): # We silently ignore messages from bots, since we do not want bots to command us if ctx.author.bot or ctx.message.is_system(): - logger.info(f"[{ctx.guild.name}({ctx.guild.id})] Ignored command message from bot or system {ctx.author.name}{ctx.author.discriminator}({ctx.author.id}): {ctx.message.content}") + logger.info(f"[{discord_utils.to_string(ctx.guild)}] Ignored command message from bot or system: {ctx.message.content}") raise discord_utils.CheckFailDoNotNotify return True @@ -233,7 +232,7 @@ class VocalMaisBot(commands.Cog): return # It's not one of our special watched join-to-create channels # The user is not a bot and connected to one of our special watched channels - logger.debug(f"[{channel.guild.name}({channel.guild.id})] User {user.name}#{user.discriminator}({user.id}) connected to watched channel {channel.name}({channel.id})") + logger.debug(f"[{discord_utils.to_string(channel.guild)}] User {discord_utils.to_string(user)}) connected to watched channel {discord_utils.to_string(channel)})") # We create a channel for them and move them into it category = channel.category @@ -258,10 +257,10 @@ class VocalMaisBot(commands.Cog): channel_name = discord_utils.voice_channel_safe_name(user_default_channel_name, user_name_replacement = user.display_name) # Creating the channel and moving the user into it - logger.debug(f"[{channel.guild.name}({channel.guild.id})] Creating channel {channel_name} for {user.name}#{user.discriminator}({user.id})") + logger.debug(f"[{discord_utils.to_string(channel.guild)}] Creating channel {channel_name} for {discord_utils.to_string(user)}") user_channel = await category.create_voice_channel(channel_name, overwrites = channel_permissions) await user.move_to(user_channel) - logger.info(f"[{channel.guild.name}({channel.guild.id})] Created channel {user_channel.name}({user_channel.id}) for {user.name}#{user.discriminator}({user.id})") + logger.info(f"[{discord_utils.to_string(channel.guild)}] Created channel {discord_utils.to_string(user_channel)} for {discord_utils.to_string(user)}") # Saving the channel in the configuration self.channels_config.add_channel_to_created(user_channel.guild, user_channel) @@ -272,15 +271,16 @@ class VocalMaisBot(commands.Cog): if not self.channels_config.is_created(channel.guild, channel): return # It is not a channel that we manage, nothing to do - logger.debug(f"[{channel.guild.name}({channel.guild.id})] User left temporary channel {channel.name} ({channel.id})") + logger.debug(f"[{discord_utils.to_string(channel.guild)}] User left temporary channel {discord_utils.to_string(channel)}") # It is a channel that we manage if len(channel.members) > 0: return # There are still people inside it, nothing to do + logger.debug(f"[{discord_utils.to_string(channel.guild)}] Temporary channel {discord_utils.to_string(channel)} is now empty") try: await channel.delete() except discord.NotFound: pass # The channel already does not exist, that's not a problem, that's what we want - logger.info(f"[{channel.guild.name}({channel.guild.id})] Deleted channel {channel.name}({channel.id}) because it was empty") + logger.info(f"[{discord_utils.to_string(channel.guild)}] Deleted channel {discord_utils.to_string(channel)} because it was empty") # updating the configuration self.channels_config.remove_channel_from_created(channel.guild, channel) diff --git a/utils/discord_utils.py b/utils/discord_utils.py index afd8945..7146231 100644 --- a/utils/discord_utils.py +++ b/utils/discord_utils.py @@ -1,5 +1,6 @@ import discord import discord.ext.commands as commands +from functools import singledispatch class CheckFailDoNotNotify(commands.CheckFailure): @@ -30,3 +31,34 @@ def voice_channel_safe_name(template: str, max_chars: int = 100, escape_mentions message = message[:max_chars - 3] + "..." return message + + +@singledispatch +def to_string(obj) -> str: + """ + Convert the given discord object to a string, for logging purposes. + + See functools.singledispatch + """ + return str(obj) + + +@to_string.register(discord.Object) +@to_string.register(discord.abc.Snowflake) +def _(obj) -> str: + return f"<{obj.id}>" + + +@to_string.register(discord.abc.User) +def _(user) -> str: + return f"{user.name}#{user.discriminator}({user.id})" + + +@to_string.register(discord.Guild) +def _(guild) -> str: + return f"{guild.name}({guild.id})" + + +@to_string.register(discord.abc.GuildChannel) +def _(channel) -> str: + return f"{channel.name}({channel.id})"