import datetime import typing import discord import lavalink from cogs.music.voice_client import LavalinkVoiceClient from utils.log import logger from bot import colors if typing.TYPE_CHECKING: from lavalink import DefaultPlayer from bot import TuneBot def get_player(bot: "TuneBot", guild_id: int) -> "DefaultPlayer": if player := bot.lavalink.player_manager.get(guild_id=guild_id): return player return bot.lavalink.player_manager.create(guild_id) async def fill_player_queue( bot: "TuneBot", player: "DefaultPlayer", amount: typing.Optional[int] = 1 ): queries = await bot.global_playlist.pick_random(amount) logger.info(f"Got queries for {player.guild_id} {queries=} {amount=}") for query in queries: result = await player.node.get_tracks(query) if not result or not result["tracks"]: continue track = lavalink.models.AudioTrack( result["tracks"][0], bot.user.id, recommended=False ) player.add(requester=bot.user.id, track=track) def create_track_embed(track: lavalink.models.AudioTrack) -> discord.Embed: embed = discord.Embed( title="Now playing...", colour=colors["embed"], ) embed.description = f"[{track.title}]({track.uri})" embed.set_thumbnail(url=f"https://i3.ytimg.com/vi/{track.identifier}/mqdefault.jpg") try: duration = str(datetime.timedelta(milliseconds=int(track.duration))) except OverflowError: duration = "🔴 LIVE" embed.add_field(name="Duration", value=duration) embed.add_field(name="Author", value=track.author) return embed async def ensure_voice( permissions: discord.Permissions, player: "DefaultPlayer", author: discord.Member, voice_client: typing.Any, channel_id: int, ): """This ensures that the bot and command author are in the same voicechannel.""" if not author.voice or not author.voice.channel: raise Exception("Join a voicechannel first.") if not voice_client: if not permissions.connect or not permissions.speak: # Check user limit too? raise Exception("I need to be able to join your channel and speak") player.store("channel", channel_id) await author.voice.channel.connect(cls=LavalinkVoiceClient) else: if voice_client.channel.id != author.voice.channel.id: raise Exception("You need to be in my voicechannel") __all__ = ("fill_player_queue", "create_track_embed", "get_player", "ensure_voice")