diff --git a/bot.py b/bot.py index 3af0a2c..32cca39 100644 --- a/bot.py +++ b/bot.py @@ -87,6 +87,12 @@ class TuneBot(commands.Bot): print(f"Version: {discord.__version__}") print(f"Invite: {self.invite_link}") + ll = self.config["lavalink"] + self.lavalink = lavalink.Client(self.user.id) + self.lavalink.add_node( + ll["host"], ll["port"], ll["password"], ll["region"], ll["name"] + ) + def process_colours(self, colors: Dict[str, str]) -> Dict[str, Color]: colour_dict: Dict[str, Color] = {} for name, color in colors.items(): diff --git a/cogs/music.py b/cogs/music.py index 282cb67..436cce8 100644 --- a/cogs/music.py +++ b/cogs/music.py @@ -76,25 +76,11 @@ class LavalinkVoiceClient(discord.VoiceClient): class Music(BaseCog): @commands.Cog.listener() async def on_ready(self): - if not hasattr( - self.bot, "lavalink" - ): # This ensures the client isn't overwritten during cog reloads. - self.bot.lavalink = lavalink.Client(self.bot.user.id) - - ll = self.bot.config["lavalink"] - self.bot.lavalink.add_node( - ll["host"], ll["port"], ll["password"], ll["region"], ll["name"] - ) - - self.bot.lavalink.add_event_hook(self.track_hook) - await self.async_init() - - async def async_init(self): - redis_result = await AutoJoin.get_channels(self.bot._redis_client) - - while len(self.bot.lavalink.node_manager.available_nodes) == 0: + while not self.is_lavalink_ready(): await asyncio.sleep(1) + self.bot.lavalink.add_event_hook(self.track_hook) + redis_result = await AutoJoin.get_channels(self.bot._redis_client) for guild_id, (voicechannel_id, textchannel_id) in redis_result.items(): player = self.bot.lavalink.player_manager.create(guild_id) player.store("channel", textchannel_id) @@ -153,7 +139,7 @@ class Music(BaseCog): # This is essentially the same as `@commands.guild_only()` # except it saves us repeating ourselves (and also a few lines). - if not hasattr(self.bot, "lavalink"): + if not self.is_lavalink_ready(): await ctx.send("Still starting please wait a moment.") if guild_check: diff --git a/context.py b/context.py index 433fc9e..bee1485 100644 --- a/context.py +++ b/context.py @@ -8,16 +8,20 @@ from lavalink.models import DefaultPlayer if TYPE_CHECKING: from bot import TuneBot + from utils.classes import BaseCog class CustomContext(commands.Context): + bot: "TuneBot" + cog: "BaseCog" + @property def redis(self) -> Redis: return self.bot._redis_client @property def player(self) -> DefaultPlayer: - if hasattr(self.bot, "lavalink"): + if self.cog.is_lavalink_ready(): return self.bot.lavalink.player_manager.get(self.guild.id) raise CommandInvokeError("Lavalink is still starting up.") diff --git a/utils/classes.py b/utils/classes.py index 9cc95b2..7da2ad3 100644 --- a/utils/classes.py +++ b/utils/classes.py @@ -1,3 +1,4 @@ +import asyncio from typing import Dict from discord.ext.commands import Cog @@ -13,3 +14,9 @@ class BaseCog(Cog): for command in self.walk_commands(): if brief := slash_descriptions.get(command.qualified_name): command.brief = brief + + def is_lavalink_ready(self) -> bool: + return ( + hasattr(self.bot, "lavalink") + and len(self.bot.lavalink.node_manager.available_nodes) > 0 + ) diff --git a/utils/database.py b/utils/database.py index b8bcc06..05ac925 100644 --- a/utils/database.py +++ b/utils/database.py @@ -12,7 +12,7 @@ class AutoJoin: async def get_channels(redis: Redis) -> Dict[str, str]: # return all channels channels = await redis.hgetall(f"{redis_prefix}:autojoin") - return {key: value.split("-") for key, value in channels.items()} + return {key: value.split(":") for key, value in channels.items()} @staticmethod async def update_channel( @@ -21,7 +21,7 @@ class AutoJoin: await redis.hset( f"{redis_prefix}:autojoin", guild_id, - f"{voice_channel_id}-{text_channel_id}", + f"{voice_channel_id}:{text_channel_id}", ) @staticmethod