2017-06-07 20:30:19 +12:00
|
|
|
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 = []
|
|
|
|
|
2017-07-03 15:18:51 +12:00
|
|
|
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
|
2017-06-07 20:30:19 +12:00
|
|
|
|
|
|
|
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))
|