diff --git a/redbot/cogs/audio/apis/global_db.py b/redbot/cogs/audio/apis/global_db.py index dc5e9e41c..67e18d1c0 100644 --- a/redbot/cogs/audio/apis/global_db.py +++ b/redbot/cogs/audio/apis/global_db.py @@ -78,14 +78,16 @@ class GlobalCacheWrapper: search_response = await r.json(loads=json.loads) if IS_DEBUG and "x-process-time" in r.headers: log.debug( - f"GET || Ping {r.headers.get('x-process-time')} || " - f"Status code {r.status} || {query}" + "GET || Ping %s || Status code %d || %s", + r.headers.get("x-process-time"), + r.status, + query, ) if "tracks" not in search_response: return {} return search_response except Exception as err: - debug_exc_log(log, err, f"Failed to Get query: {api_url}/{query}") + debug_exc_log(log, err, "Failed to Get query: %s/%s", api_url, query) return {} async def get_spotify(self, title: str, author: Optional[str]) -> dict: @@ -108,14 +110,17 @@ class GlobalCacheWrapper: search_response = await r.json(loads=json.loads) if IS_DEBUG and "x-process-time" in r.headers: log.debug( - f"GET/spotify || Ping {r.headers.get('x-process-time')} || " - f"Status code {r.status} || {title} - {author}" + "GET/spotify || Ping %s || Status code %d || %s - %s", + r.headers.get("x-process-time"), + r.status, + title, + author, ) if "tracks" not in search_response: return {} return search_response except Exception as err: - debug_exc_log(log, err, f"Failed to Get query: {api_url}") + debug_exc_log(log, err, "Failed to Get query: %s", api_url) return {} async def post_call(self, llresponse: LoadResult, query: Optional[Query]) -> None: @@ -142,11 +147,13 @@ class GlobalCacheWrapper: await r.read() if IS_DEBUG and "x-process-time" in r.headers: log.debug( - f"POST || Ping {r.headers.get('x-process-time')} ||" - f" Status code {r.status} || {query}" + "GET || Ping %s || Status code %d || %s", + r.headers.get("x-process-time"), + r.status, + query, ) except Exception as err: - debug_exc_log(log, err, f"Failed to post query: {query}") + debug_exc_log(log, err, "Failed to post query: %s", query) await asyncio.sleep(0) async def update_global(self, llresponse: LoadResult, query: Optional[Query] = None): diff --git a/redbot/cogs/audio/apis/interface.py b/redbot/cogs/audio/apis/interface.py index f5b84c6df..5bd0dfc18 100644 --- a/redbot/cogs/audio/apis/interface.py +++ b/redbot/cogs/audio/apis/interface.py @@ -149,7 +149,7 @@ class AudioAPIInterface: async with self._lock: if lock_id in self._tasks: if IS_DEBUG: - log.debug(f"Running database writes for {lock_id} ({lock_author})") + log.debug("Running database writes for %d (%s)", lock_id, lock_author) try: tasks = self._tasks[lock_id] tasks = [self.route_tasks(a, tasks[a]) for a in tasks] @@ -157,11 +157,11 @@ class AudioAPIInterface: del self._tasks[lock_id] except Exception as exc: debug_exc_log( - log, exc, f"Failed database writes for {lock_id} ({lock_author})" + log, exc, "Failed database writes for %d (%s)", lock_id, lock_author ) else: if IS_DEBUG: - log.debug(f"Completed database writes for {lock_id} ({lock_author})") + log.debug("Completed database writes for %d (%s)", lock_id, lock_author) async def run_all_pending_tasks(self) -> None: """Run all pending tasks left in the cache, called on cog_unload.""" @@ -248,7 +248,9 @@ class AudioAPIInterface: {"track": track_info} ) except Exception as exc: - debug_exc_log(log, exc, f"Failed to fetch {track_info} from YouTube table") + debug_exc_log( + log, exc, "Failed to fetch %r from YouTube table", track_info + ) if val is None: try: @@ -386,7 +388,7 @@ class AudioAPIInterface: ) except Exception as exc: debug_exc_log( - log, exc, f"Failed to fetch 'spotify:track:{uri}' from Spotify table" + log, exc, "Failed to fetch 'spotify:track:%s' from Spotify table", uri ) val = None else: @@ -513,7 +515,9 @@ class AudioAPIInterface: {"track": track_info} ) except Exception as exc: - debug_exc_log(log, exc, f"Failed to fetch {track_info} from YouTube table") + debug_exc_log( + log, exc, "Failed to fetch %r from YouTube table", track_info + ) should_query_global = globaldb_toggle and query_global and val is None if should_query_global: llresponse = await self.global_cache_api.get_spotify(track_name, artist_name) @@ -621,7 +625,7 @@ class AudioAPIInterface: ): has_not_allowed = True if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug("Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id) continue track_list.append(single_track) if enqueue: @@ -640,7 +644,7 @@ class AudioAPIInterface: player.add(ctx.author, single_track) self.bot.dispatch( "red_audio_track_enqueue", - player.channel.guild, + player.guild, single_track, ctx.author, ) @@ -656,7 +660,7 @@ class AudioAPIInterface: player.add(ctx.author, single_track) self.bot.dispatch( "red_audio_track_enqueue", - player.channel.guild, + player.guild, single_track, ctx.author, ) @@ -748,7 +752,7 @@ class AudioAPIInterface: try: (val, update) = await self.local_cache_api.youtube.fetch_one({"track": track_info}) except Exception as exc: - debug_exc_log(log, exc, f"Failed to fetch {track_info} from YouTube table") + debug_exc_log(log, exc, "Failed to fetch %r from YouTube table", track_info) if val is None: try: youtube_url = await self.fetch_youtube_query( @@ -813,11 +817,11 @@ class AudioAPIInterface: {"query": query_string} ) except Exception as exc: - debug_exc_log(log, exc, f"Failed to fetch '{query_string}' from Lavalink table") + debug_exc_log(log, exc, "Failed to fetch %r from Lavalink table", query_string) if val and isinstance(val, dict): if IS_DEBUG: - log.debug(f"Updating Local Database with {query_string}") + log.debug("Updating Local Database with %r", query_string) task = ("update", ("lavalink", {"query": query_string})) self.append_task(ctx, *task) else: @@ -851,7 +855,7 @@ class AudioAPIInterface: valid_global_entry = True if valid_global_entry: if IS_DEBUG: - log.debug(f"Querying Global DB api for {query}") + log.debug("Querying Global DB api for %r", query) results, called_api = results, False if valid_global_entry: pass @@ -870,7 +874,7 @@ class AudioAPIInterface: valid_global_entry = False else: if IS_DEBUG: - log.debug(f"Querying Lavalink api for {query_string}") + log.debug("Querying Lavalink api for %r", query_string) called_api = True try: results = await player.load_tracks(query_string) @@ -923,13 +927,14 @@ class AudioAPIInterface: debug_exc_log( log, exc, - f"Failed to enqueue write task for '{query_string}' to Lavalink table", + "Failed to enqueue write task for %r to Lavalink table", + query_string, ) return results, called_api async def autoplay(self, player: lavalink.Player, playlist_api: PlaylistWrapper): """Enqueue a random track.""" - autoplaylist = await self.config.guild(player.channel.guild).autoplaylist() + autoplaylist = await self.config.guild(player.guild).autoplaylist() current_cache_level = CacheLevel(await self.config.cache_level()) cache_enabled = CacheLevel.set_lavalink().is_subset(current_cache_level) notify_channel_id = player.fetch("channel") @@ -942,8 +947,8 @@ class AudioAPIInterface: autoplaylist["scope"], self.bot, playlist_api, - player.channel.guild, - player.channel.guild.me, + player.guild, + player.guild.me, ) tracks = playlist.tracks_obj except Exception as exc: @@ -956,9 +961,7 @@ class AudioAPIInterface: if not tracks: ctx = namedtuple("Context", "message guild cog") (results, called_api) = await self.fetch_track( - cast( - commands.Context, ctx(player.channel.guild, player.channel.guild, self.cog) - ), + cast(commands.Context, ctx(player.guild, player.guild, self.cog)), player, Query.process_input(_TOP_100_US, self.cog.local_folder_current_path), ) @@ -990,8 +993,7 @@ class AudioAPIInterface: ): if IS_DEBUG: log.debug( - "Query is not allowed in " - f"{player.channel.guild} ({player.channel.guild.id})" + "Query is not allowed in %r (%d)", player.guild.name, player.guild.id ) continue valid = True @@ -1000,24 +1002,24 @@ class AudioAPIInterface: "autoplay": True, "enqueue_time": int(time.time()), "vc": player.channel.id, - "requester": player.channel.guild.me.id, + "requester": player.guild.me.id, } ) - player.add(player.channel.guild.me, track) + player.add(player.guild.me, track) self.bot.dispatch( "red_audio_track_auto_play", - player.channel.guild, + player.guild, track, - player.channel.guild.me, + player.guild.me, player, ) if notify_channel_id: await self.config.guild_from_id( - guild_id=player.channel.guild.id + guild_id=player.guild.id ).currently_auto_playing_in.set([notify_channel_id, player.channel.id]) else: await self.config.guild_from_id( - guild_id=player.channel.guild.id + guild_id=player.guild.id ).currently_auto_playing_in.set([]) if not player.current: await player.play() diff --git a/redbot/cogs/audio/apis/spotify.py b/redbot/cogs/audio/apis/spotify.py index faee09139..808effb5b 100644 --- a/redbot/cogs/audio/apis/spotify.py +++ b/redbot/cogs/audio/apis/spotify.py @@ -102,7 +102,7 @@ class SpotifyWrapper: async with self.session.request("GET", url, params=params, headers=headers) as r: data = await r.json(loads=json.loads) if r.status != 200: - log.debug(f"Issue making GET request to {url}: [{r.status}] {data}") + log.debug("Issue making GET request to %r: [%d] %r", url, r.status, data) return data async def update_token(self, new_token: Mapping[str, str]): @@ -146,7 +146,7 @@ class SpotifyWrapper: except KeyError: return None self.spotify_token = token - log.debug(f"Created a new access token for Spotify: {token}") + log.debug("Created a new access token for Spotify: %s", token) return self.spotify_token["access_token"] async def post( @@ -156,7 +156,7 @@ class SpotifyWrapper: async with self.session.post(url, data=payload, headers=headers) as r: data = await r.json(loads=json.loads) if r.status != 200: - log.debug(f"Issue making POST request to {url}: [{r.status}] {data}") + log.debug("Issue making POST request to %r: [%d] %r", url, r.status, data) return data async def make_get_call(self, url: str, params: MutableMapping) -> MutableMapping: diff --git a/redbot/cogs/audio/audio_logging.py b/redbot/cogs/audio/audio_logging.py index 8652b6580..7e108aaa0 100644 --- a/redbot/cogs/audio/audio_logging.py +++ b/redbot/cogs/audio/audio_logging.py @@ -1,7 +1,7 @@ import logging import sys -from typing import Final +from typing import Final, Any, Tuple IS_DEBUG: Final[bool] = "--debug" in sys.argv @@ -10,9 +10,9 @@ def is_debug() -> bool: return IS_DEBUG -def debug_exc_log(lg: logging.Logger, exc: Exception, msg: str = None) -> None: +def debug_exc_log(lg: logging.Logger, exc: Exception, msg: str = None, *args: Tuple[Any]) -> None: """Logs an exception if logging is set to DEBUG level""" if lg.getEffectiveLevel() <= logging.DEBUG: if msg is None: msg = f"{exc}" - lg.exception(msg, exc_info=exc) + lg.exception(msg, *args, exc_info=exc) diff --git a/redbot/cogs/audio/core/commands/controller.py b/redbot/cogs/audio/core/commands/controller.py index c143b8018..c4249df2d 100644 --- a/redbot/cogs/audio/core/commands/controller.py +++ b/redbot/cogs/audio/core/commands/controller.py @@ -289,7 +289,7 @@ class PlayerControllerCommands(MixinMeta, metaclass=CompositeMetaClass): } ) player.add(player.fetch("prev_requester"), track) - self.bot.dispatch("red_audio_track_enqueue", player.channel.guild, track, ctx.author) + self.bot.dispatch("red_audio_track_enqueue", player.guild, track, ctx.author) queue_len = len(player.queue) bump_song = player.queue[-1] player.queue.insert(0, bump_song) diff --git a/redbot/cogs/audio/core/commands/miscellaneous.py b/redbot/cogs/audio/core/commands/miscellaneous.py index be3c3e636..e31834d05 100644 --- a/redbot/cogs/audio/core/commands/miscellaneous.py +++ b/redbot/cogs/audio/core/commands/miscellaneous.py @@ -59,10 +59,10 @@ class MiscellaneousCommands(MixinMeta, metaclass=CompositeMetaClass): current_title = await self.get_track_description( p.current, self.local_folder_current_path ) - msg += "{} [`{}`]: {}\n".format(p.channel.guild.name, connect_dur, current_title) + msg += "{} [`{}`]: {}\n".format(p.guild.name, connect_dur, current_title) except AttributeError: msg += "{} [`{}`]: **{}**\n".format( - p.channel.guild.name, connect_dur, _("Nothing playing.") + p.guild.name, connect_dur, _("Nothing playing.") ) if total_num == 0: diff --git a/redbot/cogs/audio/core/commands/player.py b/redbot/cogs/audio/core/commands/player.py index 8b15bdb49..61a9fee8d 100644 --- a/redbot/cogs/audio/core/commands/player.py +++ b/redbot/cogs/audio/core/commands/player.py @@ -294,7 +294,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass): query_obj=query, ): if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug("Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id) self.update_player_lock(ctx, False) return await self.send_embed_msg( ctx, @@ -314,7 +314,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass): player.queue.insert(0, single_track) player.maybe_shuffle() self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, single_track, ctx.author + "red_audio_track_enqueue", player.guild, single_track, ctx.author ) else: self.update_player_lock(ctx, False) @@ -336,9 +336,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass): ) player.queue.insert(0, single_track) player.maybe_shuffle() - self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, single_track, ctx.author - ) + self.bot.dispatch("red_audio_track_enqueue", player.guild, single_track, ctx.author) description = await self.get_track_description( single_track, self.local_folder_current_path ) @@ -838,7 +836,9 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass): query_obj=query, ): if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug( + "Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id + ) continue elif guild_data["maxlength"] > 0: if self.is_track_length_allowed(track, guild_data["maxlength"]): @@ -852,7 +852,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass): ) player.add(ctx.author, track) self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, track, ctx.author + "red_audio_track_enqueue", player.guild, track, ctx.author ) else: track_len += 1 @@ -865,7 +865,7 @@ class PlayerCommands(MixinMeta, metaclass=CompositeMetaClass): ) player.add(ctx.author, track) self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, track, ctx.author + "red_audio_track_enqueue", player.guild, track, ctx.author ) if not player.current: await player.play() diff --git a/redbot/cogs/audio/core/commands/playlists.py b/redbot/cogs/audio/core/commands/playlists.py index 52bb0a799..08d8d3ca8 100644 --- a/redbot/cogs/audio/core/commands/playlists.py +++ b/redbot/cogs/audio/core/commands/playlists.py @@ -1525,7 +1525,9 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass): query_obj=query, ): if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug( + "Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id + ) continue query = Query.process_input(track.uri, self.local_folder_current_path) if query.is_local: @@ -1544,9 +1546,7 @@ class PlaylistCommands(MixinMeta, metaclass=CompositeMetaClass): } ) player.add(author_obj, track) - self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, track, ctx.author - ) + self.bot.dispatch("red_audio_track_enqueue", player.guild, track, ctx.author) track_len += 1 player.maybe_shuffle(0 if empty_queue else 1) if len(tracks) > track_len: diff --git a/redbot/cogs/audio/core/events/cog.py b/redbot/cogs/audio/core/events/cog.py index 879f1f318..e49988d65 100644 --- a/redbot/cogs/audio/core/events/cog.py +++ b/redbot/cogs/audio/core/events/cog.py @@ -124,7 +124,7 @@ class AudioEvents(MixinMeta, metaclass=CompositeMetaClass): bot=self.bot, ) except Exception as err: - debug_exc_log(log, err, f"Failed to delete daily playlist ID: {too_old_id}") + debug_exc_log(log, err, "Failed to delete daily playlist ID: %d", too_old_id) try: await delete_playlist( scope=PlaylistScope.GLOBAL.value, @@ -135,7 +135,9 @@ class AudioEvents(MixinMeta, metaclass=CompositeMetaClass): bot=self.bot, ) except Exception as err: - debug_exc_log(log, err, f"Failed to delete global daily playlist ID: {too_old_id}") + debug_exc_log( + log, err, "Failed to delete global daily playlist ID: %d", too_old_id + ) persist_cache = self._persist_queue_cache.setdefault( guild.id, await self.config.guild(guild).persist_queue() ) diff --git a/redbot/cogs/audio/core/events/dpy.py b/redbot/cogs/audio/core/events/dpy.py index 671676fe8..3f0fd4953 100644 --- a/redbot/cogs/audio/core/events/dpy.py +++ b/redbot/cogs/audio/core/events/dpy.py @@ -263,20 +263,6 @@ class DpyEvents(MixinMeta, metaclass=CompositeMetaClass): except (ValueError, KeyError, AttributeError): pass - # if ( - # member == member.guild.me - # and before.channel - # and after.channel - # and after.channel.id != before.channel.id - # ): - # try: - # player = lavalink.get_player(member.guild.id) - # if player.is_playing: - # await player.resume(player.current, start=player.position, replace=False) - # log.debug("Bot changed channel - Resume playback") - # except: - # log.debug("Bot changed channel - Unable to resume playback") - channel = self.rgetattr(member, "voice.channel", None) bot_voice_state = self.rgetattr(member, "guild.me.voice.self_deaf", None) if ( diff --git a/redbot/cogs/audio/core/events/lavalink.py b/redbot/cogs/audio/core/events/lavalink.py index 198f75327..6916a9157 100644 --- a/redbot/cogs/audio/core/events/lavalink.py +++ b/redbot/cogs/audio/core/events/lavalink.py @@ -17,7 +17,6 @@ from ..cog_utils import CompositeMetaClass log = logging.getLogger("red.cogs.Audio.cog.Events.lavalink") ws_audio_log = logging.getLogger("red.Audio.WS.Audio") -ws_audio_log.setLevel(logging.WARNING) _ = Translator("Audio", Path(__file__)) @@ -76,9 +75,7 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): guild=guild, player=player, extra=extra, deafen=deafen, disconnect=disconnect ) except Exception: - log.exception( - f"Error in WEBSOCKET_CLOSED handling for guild: {player.channel.guild.id}" - ) + log.exception("Error in WEBSOCKET_CLOSED handling for guild: %s", player.guild.id) return await set_contextual_locales_from_guild(self.bot, guild) @@ -95,7 +92,7 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): current_track, self.local_folder_current_path ) status = await self.config.status() - log.debug(f"Received a new lavalink event for {guild_id}: {event_type}: {extra}") + log.debug("Received a new lavalink event for %d: %s: %r", guild_id, event_type, extra) prev_song: lavalink.Track = player.fetch("prev_song") await self.maybe_reset_error_counter(player) @@ -320,14 +317,17 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): code = 4014 if event_channel_id != channel_id: ws_audio_log.info( - f"Received an op code for a channel that is no longer valid; {event_channel_id} " - f"in guild: {guild_id} - Active channel {channel_id} | " - f"Reason: Error code {code} & {reason}." + "Received an op code for a channel that is no longer valid; %d " + "Reason: Error code %d & %s, %r", + event_channel_id, + code, + reason, + player, ) self._ws_op_codes[guild_id]._init(self._ws_op_codes[guild_id]._maxsize) return if player.channel: - current_perms = player.channel.permissions_for(player.channel.guild.me) + current_perms = player.channel.permissions_for(player.guild.me) has_perm = current_perms.speak and current_perms.connect else: has_perm = False @@ -335,8 +335,7 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): player.store("resumes", player.fetch("resumes", 0) + 1) await player.resume(player.current, start=player.position, replace=True) ws_audio_log.info( - f"Player resumed in channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & {reason}." + "Player resumed | Reason: Error code %d & %s, %r", code, reason, player ) self._ws_op_codes[guild_id]._init(self._ws_op_codes[guild_id]._maxsize) return @@ -349,12 +348,21 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): delay = player._con_delay.delay() ws_audio_log.warning( "YOU CAN IGNORE THIS UNLESS IT'S CONSISTENTLY REPEATING FOR THE SAME GUILD - " - f"Voice websocket closed for guild {guild_id} -> " - f"Socket Closed {voice_ws.socket._closing or voice_ws.socket.closed}. " - f"Code: {code} -- Remote: {by_remote} -- {reason}" + "Voice websocket closed for guild %d -> " + "Socket Closed %s. " + "Code: %d -- Remote: %s -- %s, %r", + guild_id, + voice_ws.socket._closing or voice_ws.socket.closed, + code, + by_remote, + reason, + player, ) ws_audio_log.debug( - f"Reconnecting to channel {channel_id} in guild: {guild_id} | {delay:.2f}s" + "Reconnecting to channel %d in guild: %d | %.2fs", + channel_id, + guild_id, + delay, ) await asyncio.sleep(delay) while voice_ws.socket._closing or voice_ws.socket.closed or not voice_ws.open: @@ -367,8 +375,9 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): await player.resume(player.current, start=player.position, replace=True) ws_audio_log.info( "Voice websocket reconnected " - f"to channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Currently playing." + "Reason: Error code %d & Currently playing, %r", + code, + player, ) elif has_perm and player.paused and player.current: player.store("resumes", player.fetch("resumes", 0) + 1) @@ -378,24 +387,27 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): ) ws_audio_log.info( "Voice websocket reconnected " - f"to channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Currently Paused." + "Reason: Error code %d & Currently Paused, %r", + code, + player, ) elif has_perm and (not disconnect) and (not player.is_playing): player.store("resumes", player.fetch("resumes", 0) + 1) await player.connect(deafen=deafen) ws_audio_log.info( "Voice websocket reconnected " - f"to channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Not playing, but auto disconnect disabled." + "Reason: Error code %d & Not playing, but auto disconnect disabled, %r", + code, + player, ) self._ll_guild_updates.discard(guild_id) elif not has_perm: self.bot.dispatch("red_audio_audio_disconnect", guild) ws_audio_log.info( "Voice websocket disconnected " - f"from channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Missing permissions." + "Reason: Error code %d & Missing permissions, %r", + code, + player, ) self._ll_guild_updates.discard(guild_id) player.store("autoplay_notified", False) @@ -407,9 +419,9 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): else: self.bot.dispatch("red_audio_audio_disconnect", guild) ws_audio_log.info( - "Voice websocket disconnected " - f"from channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Unknown." + "Voice websocket disconnected Reason: Error code %d & Unknown, %r", + code, + player, ) self._ll_guild_updates.discard(guild_id) player.store("autoplay_notified", False) @@ -423,8 +435,7 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): await player.connect(deafen=deafen) await player.resume(player.current, start=player.position, replace=True) ws_audio_log.info( - f"Player resumed in channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & {reason}." + "Player resumed - Reason: Error code %d & %s, %r", code, reason, player ) elif code in (4015, 4009, 4006, 4000, 1006): if player._con_delay: @@ -433,7 +444,7 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): player._con_delay = ExponentialBackoff(base=1) delay = player._con_delay.delay() ws_audio_log.debug( - f"Reconnecting to channel {channel_id} in guild: {guild_id} | {delay:.2f}s" + "Reconnecting to channel %d in guild: %d | %.2fs", channel_id, guild_id, delay ) await asyncio.sleep(delay) if has_perm and player.current and player.is_playing: @@ -441,8 +452,9 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): await player.resume(player.current, start=player.position, replace=True) ws_audio_log.info( "Voice websocket reconnected " - f"to channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Player is active." + "Reason: Error code %d & Player is active, %r", + code, + player, ) elif has_perm and player.paused and player.current: player.store("resumes", player.fetch("resumes", 0) + 1) @@ -452,24 +464,30 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): ) ws_audio_log.info( "Voice websocket reconnected " - f"to channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Player is paused." + "Reason: Error code %d & Player is paused, %r", + code, + player, ) elif has_perm and (not disconnect) and (not player.is_playing): player.store("resumes", player.fetch("resumes", 0) + 1) await player.connect(deafen=deafen) ws_audio_log.info( "Voice websocket reconnected " - f"to channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Not playing." + "to channel %d in guild: %d | " + "Reason: Error code %d & Not playing, %r", + channel_id, + guild_id, + code, + player, ) self._ll_guild_updates.discard(guild_id) elif not has_perm: self.bot.dispatch("red_audio_audio_disconnect", guild) ws_audio_log.info( "Voice websocket disconnected " - f"from channel {channel_id} in guild: {guild_id} | " - f"Reason: Error code {code} & Missing permissions." + "Reason: Error code %d & Missing permissions, %r", + code, + player, ) self._ll_guild_updates.discard(guild_id) player.store("autoplay_notified", False) @@ -484,8 +502,12 @@ class LavalinkEvents(MixinMeta, metaclass=CompositeMetaClass): await player.resume(player.current, start=player.position, replace=False) ws_audio_log.info( "WS EVENT - IGNORED (Healthy Socket) | " - f"Voice websocket closed event for guild {guild_id} -> " - f"Code: {code} -- Remote: {by_remote} -- {reason}" + "Voice websocket closed event " + "Code: %d -- Remote: %s -- %s, %r", + code, + by_remote, + reason, + player, ) except Exception: log.exception("Error in task") diff --git a/redbot/cogs/audio/core/tasks/player.py b/redbot/cogs/audio/core/tasks/player.py index acbe19219..7f33b5980 100644 --- a/redbot/cogs/audio/core/tasks/player.py +++ b/redbot/cogs/audio/core/tasks/player.py @@ -24,7 +24,7 @@ class PlayerTasks(MixinMeta, metaclass=CompositeMetaClass): pause_times: Dict = {} while True: async for p in AsyncIter(lavalink.all_players()): - server = p.channel.guild + server = p.guild if await self.bot.cog_disabled_in_guild(self, server): continue @@ -37,11 +37,7 @@ class PlayerTasks(MixinMeta, metaclass=CompositeMetaClass): try: await p.pause(False) except Exception as err: - debug_exc_log( - log, - err, - f"Exception raised in Audio's unpausing player for {server.id}.", - ) + debug_exc_log(log, err, "Exception raised in Audio's unpausing %r.", p) pause_times.pop(server.id, None) servers = stop_times.copy() servers.update(pause_times) @@ -61,7 +57,7 @@ class PlayerTasks(MixinMeta, metaclass=CompositeMetaClass): ).currently_auto_playing_in.set([]) except Exception as err: debug_exc_log( - log, err, f"Exception raised in Audio's emptydc_timer for {sid}." + log, err, "Exception raised in Audio's emptydc_timer for %s.", sid ) elif sid in stop_times and await self.config.guild(server_obj).emptydc_enabled(): @@ -81,7 +77,7 @@ class PlayerTasks(MixinMeta, metaclass=CompositeMetaClass): if "No such player for that guild" in str(err): stop_times.pop(sid, None) debug_exc_log( - log, err, f"Exception raised in Audio's emptydc_timer for {sid}." + log, err, "Exception raised in Audio's emptydc_timer for %s.", sid ) elif ( sid in pause_times and await self.config.guild(server_obj).emptypause_enabled() @@ -94,6 +90,6 @@ class PlayerTasks(MixinMeta, metaclass=CompositeMetaClass): if "No such player for that guild" in str(err): pause_times.pop(sid, None) debug_exc_log( - log, err, f"Exception raised in Audio's pausing for {sid}." + log, err, "Exception raised in Audio's pausing for %s.", sid ) await asyncio.sleep(5) diff --git a/redbot/cogs/audio/core/tasks/startup.py b/redbot/cogs/audio/core/tasks/startup.py index df2b30fc7..24bd8826b 100644 --- a/redbot/cogs/audio/core/tasks/startup.py +++ b/redbot/cogs/audio/core/tasks/startup.py @@ -31,6 +31,7 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass): # There has to be a task since this requires the bot to be ready # If it waits for ready in startup, we cause a deadlock during initial load # as initial load happens before the bot can ever be ready. + lavalink.set_logging_level(self.bot._cli_flags.logging_level) self.cog_init_task = self.bot.loop.create_task(self.initialize()) self.cog_init_task.add_done_callback(task_callback) @@ -139,7 +140,9 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass): tries += 1 except Exception as exc: tries += 1 - debug_exc_log(log, exc, "Failed to restore music voice channel") + debug_exc_log( + log, exc, "Failed to restore music voice channel %s", vc_id + ) if vc is None: break else: @@ -160,8 +163,9 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass): player.maybe_shuffle() if not player.is_playing: await player.play() + log.info("Restored %r", player) except Exception as err: - debug_exc_log(log, err, f"Error restoring player in {guild_id}") + debug_exc_log(log, err, "Error restoring player in %d", guild_id) await self.api_interface.persistent_queue_api.drop(guild_id) for guild_id, (notify_channel_id, vc_id) in metadata.items(): @@ -208,7 +212,7 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass): tries += 1 except Exception as exc: tries += 1 - debug_exc_log(log, exc, "Failed to restore music voice channel") + debug_exc_log(log, exc, "Failed to restore music voice channel %s", vc_id) if vc is None: break else: @@ -222,6 +226,7 @@ class StartUpTasks(MixinMeta, metaclass=CompositeMetaClass): if player.volume != volume: await player.set_volume(volume) player.maybe_shuffle() + log.info("Restored %r", player) if not player.is_playing: notify_channel = player.fetch("channel") try: diff --git a/redbot/cogs/audio/core/utilities/formatting.py b/redbot/cogs/audio/core/utilities/formatting.py index b89519983..9b8086f78 100644 --- a/redbot/cogs/audio/core/utilities/formatting.py +++ b/redbot/cogs/audio/core/utilities/formatting.py @@ -167,7 +167,7 @@ class FormattingUtilities(MixinMeta, metaclass=CompositeMetaClass): query_obj=query, ): if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug("Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id) self.update_player_lock(ctx, False) return await self.send_embed_msg( ctx, title=_("This track is not allowed in this server.") @@ -185,7 +185,7 @@ class FormattingUtilities(MixinMeta, metaclass=CompositeMetaClass): player.add(ctx.author, search_choice) player.maybe_shuffle() self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, search_choice, ctx.author + "red_audio_track_enqueue", player.guild, search_choice, ctx.author ) else: return await self.send_embed_msg(ctx, title=_("Track exceeds maximum length.")) @@ -199,9 +199,7 @@ class FormattingUtilities(MixinMeta, metaclass=CompositeMetaClass): ) player.add(ctx.author, search_choice) player.maybe_shuffle() - self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, search_choice, ctx.author - ) + self.bot.dispatch("red_audio_track_enqueue", player.guild, search_choice, ctx.author) if not guild_data["shuffle"] and queue_dur > 0: songembed.set_footer( diff --git a/redbot/cogs/audio/core/utilities/player.py b/redbot/cogs/audio/core/utilities/player.py index f29e01702..ced9788e4 100644 --- a/redbot/cogs/audio/core/utilities/player.py +++ b/redbot/cogs/audio/core/utilities/player.py @@ -120,7 +120,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): async def is_requester(self, ctx: commands.Context, member: discord.Member) -> bool: try: player = lavalink.get_player(ctx.guild.id) - log.debug(f"Current requester is {player.current.requester}") + log.debug("Current requester is %s", player.current.requester) return player.current.requester.id == member.id except Exception as err: debug_exc_log(log, err, "Caught error in `is_requester`") @@ -128,7 +128,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): async def _skip_action(self, ctx: commands.Context, skip_to_track: int = None) -> None: player = lavalink.get_player(ctx.guild.id) - autoplay = await self.config.guild(player.channel.guild).auto_play() + autoplay = await self.config.guild(player.guild).auto_play() if not player.current or (not player.queue and not autoplay): try: pos, dur = player.position, player.current.length @@ -193,7 +193,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): ), ) await self.send_embed_msg(ctx, embed=embed) - self.bot.dispatch("red_audio_skip_track", player.channel.guild, player.current, ctx.author) + self.bot.dispatch("red_audio_skip_track", player.guild, player.current, ctx.author) await player.play() player.queue += queue_to_append @@ -218,7 +218,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): return if not await self.config.guild_from_id(guild_id).auto_deafen(): return - await player.channel.guild.change_voice_state(channel=player.channel, self_deaf=True) + await player.guild.change_voice_state(channel=player.channel, self_deaf=True) async def _get_spotify_tracks( self, ctx: commands.Context, query: Query, forced: bool = False @@ -452,7 +452,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): query_obj=query, ): if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug("Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id) continue elif guild_data["maxlength"] > 0: if self.is_track_length_allowed(track, guild_data["maxlength"]): @@ -466,7 +466,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): ) player.add(ctx.author, track) self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, track, ctx.author + "red_audio_track_enqueue", player.guild, track, ctx.author ) else: @@ -479,9 +479,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): } ) player.add(ctx.author, track) - self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, track, ctx.author - ) + self.bot.dispatch("red_audio_track_enqueue", player.guild, track, ctx.author) player.maybe_shuffle(0 if empty_queue else 1) if len(tracks) > track_len: @@ -544,7 +542,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): query_obj=query, ): if IS_DEBUG: - log.debug(f"Query is not allowed in {ctx.guild} ({ctx.guild.id})") + log.debug("Query is not allowed in %r (%d)", ctx.guild.name, ctx.guild.id) self.update_player_lock(ctx, False) return await self.send_embed_msg( ctx, title=_("This track is not allowed in this server.") @@ -562,7 +560,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): player.maybe_shuffle() self.bot.dispatch( "red_audio_track_enqueue", - player.channel.guild, + player.guild, single_track, ctx.author, ) @@ -583,7 +581,7 @@ class PlayerUtilities(MixinMeta, metaclass=CompositeMetaClass): player.add(ctx.author, single_track) player.maybe_shuffle() self.bot.dispatch( - "red_audio_track_enqueue", player.channel.guild, single_track, ctx.author + "red_audio_track_enqueue", player.guild, single_track, ctx.author ) except IndexError: self.update_player_lock(ctx, False) diff --git a/redbot/cogs/audio/core/utilities/playlists.py b/redbot/cogs/audio/core/utilities/playlists.py index 5e41bd4bc..00baff6c3 100644 --- a/redbot/cogs/audio/core/utilities/playlists.py +++ b/redbot/cogs/audio/core/utilities/playlists.py @@ -428,14 +428,14 @@ class PlaylistUtilities(MixinMeta, metaclass=CompositeMetaClass): track = result.tracks[0] except Exception as err: - debug_exc_log(log, err, f"Failed to get track for {song_url}") + debug_exc_log(log, err, "Failed to get track for %r", song_url) continue try: track_obj = self.get_track_json(player, other_track=track) track_list.append(track_obj) successful_count += 1 except Exception as err: - debug_exc_log(log, err, f"Failed to create track for {track}") + debug_exc_log(log, err, "Failed to create track for %r", track) continue if (track_count % 2 == 0) or (track_count == len(uploaded_track_list)): await notifier.notify_user( diff --git a/redbot/cogs/audio/manager.py b/redbot/cogs/audio/manager.py index 206a39d48..2218f153c 100644 --- a/redbot/cogs/audio/manager.py +++ b/redbot/cogs/audio/manager.py @@ -287,7 +287,7 @@ class ServerManager: # hasn't been published yet raise LavalinkDownloadFailed( f"Lavalink jar version {JAR_VERSION}_{JAR_BUILD} hasn't been published " - f"yet", + "yet", response=response, should_retry=False, ) diff --git a/redbot/cogs/audio/utils.py b/redbot/cogs/audio/utils.py index 5f8198c05..e6d4ca4c9 100644 --- a/redbot/cogs/audio/utils.py +++ b/redbot/cogs/audio/utils.py @@ -219,7 +219,7 @@ class PlaylistScope(Enum): def task_callback(task: asyncio.Task) -> None: with contextlib.suppress(asyncio.CancelledError, asyncio.InvalidStateError): if exc := task.exception(): - log.exception(f"{task.get_name()} raised an Exception", exc_info=exc) + log.exception("%s raised an Exception", task.get_name(), exc_info=exc) def has_internal_server(): diff --git a/setup.cfg b/setup.cfg index a1d185d97..18faaaa09 100644 --- a/setup.cfg +++ b/setup.cfg @@ -61,7 +61,7 @@ install_requires = python-Levenshtein-wheels==0.13.2 pytz==2021.1 PyYAML==5.4.1 - Red-Lavalink==0.8.0 + Red-Lavalink==0.8.1 rich==9.9.0 schema==0.7.4 six==1.15.0