Source code for pylav.extension.red.ui.buttons.queue

from __future__ import annotations

from pathlib import Path

import discord
from redbot.core.i18n import Translator

from pylav.helpers import emojis
from pylav.type_hints.bot import DISCORD_COG_TYPE, DISCORD_INTERACTION_TYPE

_ = Translator("PyLav", Path(__file__))


[docs] class PreviousTrackButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.PREVIOUS, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_previous.callback(self.cog, context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class StopTrackButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.STOP, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_stop.callback(self.cog, context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class PauseTrackButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.PAUSE, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_pause.callback(self.cog, context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class ResumeTrackButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.PLAY, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_resume.callback(self.cog, context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class SkipTrackButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.NEXT, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_skip.callback(self.cog, context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class IncreaseVolumeButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.VOLUME_UP, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_volume_change_by.callback(self.cog, context, change_by=5) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class DecreaseVolumeButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.VOLUME_DOWN, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_volume_change_by.callback(self.cog, context, change_by=-5) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class ToggleRepeatButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.LOOP, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) player = context.player if not player: return await context.send( embed=await self.cog.pylav.construct_embed( description=_("I am not connected to any voice channel at the moment."), messageable=interaction ), ephemeral=True, ) await self.cog.command_repeat.callback(self.cog, context, queue=await player.config.fetch_repeat_current()) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class QueueHistoryButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.PLAYLIST, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) if not (__ := context.player): return await context.send( embed=await self.cog.pylav.construct_embed( description=_("I am not connected to any voice channel at the moment."), messageable=interaction ), ephemeral=True, ) from pylav.extension.red.ui.menus.queue import QueueMenu from pylav.extension.red.ui.sources.queue import QueueSource await QueueMenu( cog=self.cog, bot=self.cog.bot, source=QueueSource(guild_id=interaction.guild.id, cog=self.cog, history=True), original_author=interaction.user, history=True, ).start(ctx=context)
[docs] class ToggleRepeatQueueButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.REPEAT, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) player = context.player if not player: return await context.send( embed=await self.cog.pylav.construct_embed( description=_("I am not connected to any voice channel at the moment."), messageable=interaction ), ephemeral=True, ) repeat_queue = bool(await player.config.fetch_repeat_current()) await self.cog.command_repeat.callback(self.cog, context, queue=repeat_queue) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class ShuffleButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.RANDOM, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_shuffle.callback(self.cog, context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class DisconnectButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.POWER, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) await self.cog.command_disconnect.callback(self.cog, context) self.view.stop() await self.view.on_timeout()
[docs] class EmptyQueueButton(discord.ui.Button): def __init__(self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None): super().__init__( style=style, emoji=emojis.TRASH, row=row, ) self.cog = cog
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) player = context.player if not player.queue.size(): return await context.send( embed=await self.cog.pylav.construct_embed( description=_("There is nothing in the queue."), messageable=interaction ), ephemeral=True, ) player.queue.clear() await context.send( embed=await self.cog.pylav.construct_embed( description=_("Removed tracks from the queue."), messageable=interaction ), ephemeral=True, ) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class EnqueueButton(discord.ui.Button): def __init__( self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None, ): self.cog = cog super().__init__( style=style, emoji=emojis.PLUS, row=row, )
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): from pylav.extension.red.ui.modals.queue import EnqueueModal modal = EnqueueModal(self.cog, _("What do you want to enqueue?")) await interaction.response.send_modal(modal) await self.cog.bot.get_context(interaction) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class RemoveFromQueueButton(discord.ui.Button): def __init__( self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None, ): self.cog = cog super().__init__( style=style, emoji=emojis.MINUS, row=row, )
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) from pylav.extension.red.ui.menus.queue import QueuePickerMenu from pylav.extension.red.ui.sources.queue import QueuePickerSource picker = QueuePickerMenu( bot=self.cog.bot, cog=self.cog, source=QueuePickerSource(guild_id=interaction.guild.id, cog=self.cog), delete_after_timeout=True, starting_page=0, menu_type="remove", original_author=interaction.user, ) await picker.start(context) await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)
[docs] class PlayNowFromQueueButton(discord.ui.Button): def __init__( self, cog: DISCORD_COG_TYPE, style: discord.ButtonStyle, row: int = None, ): self.cog = cog super().__init__( style=style, emoji=emojis.MUSICAL_NOTE, row=row, )
[docs] async def callback(self, interaction: DISCORD_INTERACTION_TYPE): if not interaction.response.is_done(): await interaction.response.defer(ephemeral=True, thinking=True) context = await self.cog.bot.get_context(interaction) from pylav.extension.red.ui.menus.queue import QueuePickerMenu from pylav.extension.red.ui.sources.queue import QueuePickerSource picker = QueuePickerMenu( bot=self.cog.bot, cog=self.cog, source=QueuePickerSource(guild_id=interaction.guild.id, cog=self.cog), delete_after_timeout=True, starting_page=0, menu_type="play", original_author=interaction.user, ) await picker.start(context) await picker.wait() await self.view.prepare() kwargs = await self.view.get_page(self.view.current_page) attachments = [] if "file" in kwargs: attachments = [kwargs.pop("file")] elif "files" in kwargs: attachments = kwargs.pop("files") if attachments: kwargs["attachments"] = attachments await self.view.message.edit(view=self.view, **kwargs)