diff --git a/cogs/music/__init__.py b/cogs/music/__init__.py index 51b61d3..888158a 100644 --- a/cogs/music/__init__.py +++ b/cogs/music/__init__.py @@ -7,6 +7,7 @@ from discord.ext import commands from bot import TuneBot from cogs.music import helper +from cogs.music import track_embed from cogs.music.interactions import MusicCommands from cogs.music.interactions import QUEUE_SIZE from cogs.music.voice_client import LavalinkVoiceClient @@ -51,8 +52,12 @@ class MusicCog(BaseCog, name="Music"): elif isinstance(event, lavalink.events.TrackStartEvent): channel_id = int(event.player.fetch("channel")) channel: TextChannel = self.bot.get_channel(channel_id) - embed = helper.create_track_embed(event.player.current) - await channel.send(embed=embed) + + controls = track_embed.create_embed_controls(self.bot) + embed = track_embed.create_track_embed( + event.player.current, event.player.queue, [] + ) + await channel.send(embed=embed, view=controls) elif isinstance(event, lavalink.events.TrackEndEvent): await helper.fill_player_queue(self.bot, event.player, 1) diff --git a/cogs/music/helper.py b/cogs/music/helper.py index 224c72d..7b43407 100644 --- a/cogs/music/helper.py +++ b/cogs/music/helper.py @@ -37,24 +37,6 @@ async def fill_player_queue( 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", @@ -77,4 +59,4 @@ async def ensure_voice( raise Exception("You need to be in my voicechannel") -__all__ = ("fill_player_queue", "create_track_embed", "get_player", "ensure_voice") +__all__ = ("fill_player_queue", "get_player", "ensure_voice") diff --git a/cogs/music/interactions.py b/cogs/music/interactions.py index d4d5a51..fbeec09 100644 --- a/cogs/music/interactions.py +++ b/cogs/music/interactions.py @@ -6,6 +6,7 @@ from discord import Interaction from bot import config from cogs.music import helper from utils.embed import create_embed +from cogs.music import track_embed if typing.TYPE_CHECKING: from bot import TuneBot @@ -84,8 +85,9 @@ class MusicCommands(app_commands.Group): await ctx.response.send_message(embed=embed) return - embed = helper.create_track_embed(player.current) - await ctx.response.send_message(embed=embed) + controls = track_embed.create_embed_controls(self.bot) + embed = track_embed.create_track_embed(player.current, player.queue, []) + await ctx.response.send_message(embed=embed, view=controls) @app_commands.command(name="queue", description="See what's ahead") async def queue(self, ctx: Interaction): diff --git a/cogs/music/track_embed.py b/cogs/music/track_embed.py new file mode 100644 index 0000000..0c8cbb4 --- /dev/null +++ b/cogs/music/track_embed.py @@ -0,0 +1,88 @@ +import datetime +import typing +import discord +from bot import colors +from cogs.music import helper + +if typing.TYPE_CHECKING: + from lavalink.models import AudioTrack + from bot import TuneBot + + +def format_track(track: "AudioTrack", max_length: int = 0): + if max_length == 0: + return f"[{track.title}]({track.uri})" + + if len(track.title) > max_length: + track_title = track.title[: max_length - 3] + "..." + else: + track_title = track.title + + return f"[{track_title}]({track.uri})" + + +def num_to_emoji(num: int) -> str: + emojis = { + "1": "1️⃣", + "2": "2️⃣", + "3": "3️⃣", + "4": "4️⃣", + "5": "5️⃣", + "6": "6️⃣", + "7": "7️⃣", + "8": "8️⃣", + "9": "9️⃣", + "0": "0️⃣", + } + return "".join(emojis[digit] for digit in str(num)) + + +def create_track_embed( + current: "AudioTrack", + queue: typing.Sequence["AudioTrack"], + history: typing.Sequence["AudioTrack"], +) -> discord.Embed: + embed = discord.Embed( + title="Now playing...", + colour=colors["embed"], + ) + + try: + duration = str(datetime.timedelta(milliseconds=int(current.duration))) + except OverflowError: + duration = "🔴 LIVE" + + embed.description = f"`{duration}` [{current.title}]({current.uri})" + + if len(queue) > 0: + frags: typing.List[str] = [] + for index, track in enumerate(queue, start=1): + prefix = num_to_emoji(index) + max_track_len = 45 - len(prefix) + + track_fmt = format_track(track, max_length=max_track_len) + frags.append(f"{prefix} {track_fmt}") + upcoming_fmt = "\n".join(frags) + else: + upcoming_fmt = "No tracks have been queued yet..." + embed.add_field(name="Upcoming", value=upcoming_fmt) + + embed.set_image(url=f"https://i3.ytimg.com/vi/{current.identifier}/mqdefault.jpg") + embed.set_footer(text=f"Uploaded by: {current.author}") + return embed + + +def create_embed_controls(bot: "TuneBot") -> "EmbedControls": + return EmbedControls(bot) + + +class EmbedControls(discord.ui.View): + def __init__(self, bot: "TuneBot"): + super().__init__() + self.bot = bot + + @discord.ui.button(label="Skip") + async def skip(self, ctx: discord.Interaction, button: discord.ui.Button): + player = helper.get_player(ctx.client, ctx.guild_id) + await player.skip() + await ctx.response.defer()