diff --git a/redbot/cogs/audio/__init__.py b/redbot/cogs/audio/__init__.py index 87d2ec974..6ced4c3e4 100644 --- a/redbot/cogs/audio/__init__.py +++ b/redbot/cogs/audio/__init__.py @@ -52,6 +52,6 @@ async def setup(bot: commands.Bot): await maybe_download_lavalink(bot.loop, cog) await start_lavalink_server(bot.loop) + await cog.initialize() + bot.add_cog(cog) - bot.loop.create_task(cog.disconnect_timer()) - bot.loop.create_task(cog.init_config()) diff --git a/redbot/cogs/audio/audio.py b/redbot/cogs/audio/audio.py index 9449f9407..f52dce280 100644 --- a/redbot/cogs/audio/audio.py +++ b/redbot/cogs/audio/audio.py @@ -1,3 +1,5 @@ +import contextlib + import aiohttp import asyncio import datetime @@ -61,8 +63,10 @@ class Audio: self.config.register_global(**default_global) self.skip_votes = {} self.session = aiohttp.ClientSession() + self._disconnect_task = None + self._cleaned_up = False - async def init_config(self): + async def initialize(self): host = await self.config.host() password = await self.config.password() rest_port = await self.config.rest_port() @@ -78,6 +82,8 @@ class Audio: ) lavalink.register_event_listener(self.event_handler) + self._disconnect_task = self.bot.loop.create_task(self.disconnect_timer()) + async def event_handler(self, player, event_type, extra): notify = await self.config.guild(player.channel.guild).notify() status = await self.config.status() @@ -2267,7 +2273,7 @@ class Audio: async def disconnect_timer(self): stop_times = {} - while self == self.bot.get_cog("Audio"): + while True: for p in lavalink.players: server = p.channel.guild @@ -2449,7 +2455,13 @@ class Audio: pass def __unload(self): - self.session.detach() - lavalink.unregister_event_listener(self.event_handler) - self.bot.loop.create_task(lavalink.close()) - shutdown_lavalink_server() + if not self._cleaned_up: + self.session.detach() + if self._disconnect_task: + self._disconnect_task.cancel() + lavalink.unregister_event_listener(self.event_handler) + self.bot.loop.create_task(lavalink.close()) + shutdown_lavalink_server() + self._cleaned_up = True + + __del__ = __unload diff --git a/redbot/cogs/streams/streams.py b/redbot/cogs/streams/streams.py index f537ce026..0cf654ce7 100644 --- a/redbot/cogs/streams/streams.py +++ b/redbot/cogs/streams/streams.py @@ -666,3 +666,5 @@ class Streams: def __unload(self): if self.task: self.task.cancel() + + __del__ = __unload