1
0
Fork 0
mirror of synced 2024-05-19 03:52:25 +12:00
Bonfire/cogs/dj.py
2017-07-02 22:18:51 -05:00

75 lines
2.8 KiB
Python

from .voice_utilities import *
import discord
class DJEvents:
"""A simple class to save our DJ objects, once someone is detected to have joined a channel,
their DJ information will automatically update"""
def __init__(self, bot):
self.bot = bot
self.djs = {}
async def on_ready(self):
for channel in [c for c in self.bot.get_all_channels() if isinstance(c, discord.VoiceChannel)]:
for member in [m for m in channel.members if not m.bot]:
if member.id not in self.djs:
dj = DJ(member, self.bot)
self.bot.loop.create_task(dj.resolve_playlist())
self.djs[member.id] = dj
async def on_voice_state_update(self, member, _, after):
if member and not member.bot and member.id not in self.djs:
dj = DJ(member, self.bot)
self.bot.loop.create_task(dj.resolve_playlist())
self.djs[member.id] = dj
# Alternatively, if the bot has joined the channel and we never detected the members that are in the channel
# This most likely means the bot has just started up, lets get these user's ready too
if member and member.id == member.guild.me.id and after and after.channel:
for m in after.channel.members:
if not m.bot and m.id not in self.djs:
dj = DJ(m, self.bot)
self.bot.loop.create_task(dj.resolve_playlist())
self.djs[m.id] = dj
class DJ(Playlist):
def __init__(self, member, bot):
super().__init__(bot)
self.member = member
self.playlists = []
async def next_entry(self):
"""Get the next song in the playlist; this class will wait until the next song is ready"""
entry = self.peek()
# While we have an entry available
while entry:
# Check if we are ready or if we've errored, either way we'll pop it from the deque
if entry.ready or entry.error:
self.entries.rotate(-1)
return entry
# Otherwise, wait a second and check again
else:
await asyncio.sleep(1)
# If we've reached here, we have no entries
return None
async def resolve_playlist(self):
self.playlists = self.bot.db.load('user_playlists', key=self.member.id, pluck='playlists') or []
self.clear()
for pl in self.playlists:
if pl['active']:
for song in pl['songs']:
try:
await self.add_entry(song['url'])
except ExtractionError:
# For now, just silently ignore this
pass
def setup(bot):
bot.add_cog(DJEvents(bot))