[Audio] Remove players which no longer have a guild. (#2414)

Cleanup players when the bot has one for a guild it leaves.

Bumps Red-Lavalink to v0.2.2
This commit is contained in:
Michael H
2019-02-15 19:15:33 -05:00
committed by Toby Harradine
parent eebed27fe7
commit d96062226d
2 changed files with 18 additions and 1 deletions

View File

@@ -2624,3 +2624,20 @@ class Audio(commands.Cog):
self._cleaned_up = True self._cleaned_up = True
__del__ = __unload __del__ = __unload
async def on_guild_remove(self, guild: discord.Guild):
"""
This is to clean up players when
the bot either leaves or is removed from a guild
"""
channels = {
x # x is a voice_channel
for y in [g.voice_channels for g in self.bot.guilds]
for x in y # y is a list of voice channels
} # Yes, this is ugly. It's also the most performant and commented.
zombie_players = {p for p in lavalink.player_manager.players if p.channel not in channels}
# Do not unroll to combine with next line.
# Can result in iterator changing size during context switching.
for zombie in zombie_players:
await zombie.destroy()

View File

@@ -19,7 +19,7 @@ install_requires = [
"pyyaml==3.13", "pyyaml==3.13",
"raven==6.10.0", "raven==6.10.0",
"raven-aiohttp==0.7.0", "raven-aiohttp==0.7.0",
"red-lavalink==0.2.1", "red-lavalink==0.2.2",
"schema==0.6.8", "schema==0.6.8",
"websockets==7.0", "websockets==7.0",
"yarl==1.3.0", "yarl==1.3.0",