mirror of
https://github.com/RafaelSolVargas/Vulkan.git
synced 2025-10-29 16:57:23 +00:00
Changing View in Queue message and creating new handler to jump to music
This commit is contained in:
12
UI/Buttons/AbstractItem.py
Normal file
12
UI/Buttons/AbstractItem.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from discord.ui import Item, View
|
||||
|
||||
|
||||
class AbstractItem(ABC, Item):
|
||||
@abstractmethod
|
||||
def set_view(self, view: View):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_view(self) -> View:
|
||||
pass
|
||||
@@ -1,7 +1,7 @@
|
||||
from typing import Awaitable
|
||||
from Config.Emojis import VEmojis
|
||||
from discord import ButtonStyle, Interaction, Message, TextChannel
|
||||
from discord.ui import Button
|
||||
from discord.ui import Button, View
|
||||
from Handlers.HandlerResponse import HandlerResponse
|
||||
from Messages.MessagesCategory import MessagesCategory
|
||||
from Messages.MessagesManager import MessagesManager
|
||||
@@ -21,6 +21,7 @@ class CallbackButton(Button):
|
||||
self.__args = args
|
||||
self.__kwargs = kwargs
|
||||
self.__callback = cb
|
||||
self.__view: View = None
|
||||
|
||||
async def callback(self, interaction: Interaction) -> None:
|
||||
"""Callback to when Button is clicked"""
|
||||
@@ -29,10 +30,19 @@ class CallbackButton(Button):
|
||||
|
||||
response: HandlerResponse = await self.__callback(*self.__args, **self.__kwargs)
|
||||
|
||||
message = None
|
||||
if response and response.view is not None:
|
||||
message: Message = await self.__channel.send(embed=response.embed, view=response.view)
|
||||
else:
|
||||
response.view.set_message(message)
|
||||
elif response.embed:
|
||||
message: Message = await self.__channel.send(embed=response.embed)
|
||||
|
||||
# Clear the last sended message in this category and add the new one
|
||||
await self.__messagesManager.addMessageAndClearPrevious(self.__guildID, self.__category, message)
|
||||
if message:
|
||||
await self.__messagesManager.addMessageAndClearPrevious(self.__guildID, self.__category, message)
|
||||
|
||||
def set_view(self, view: View):
|
||||
self.__view = view
|
||||
|
||||
def get_view(self) -> View:
|
||||
return self.__view
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from Config.Emojis import VEmojis
|
||||
from discord import ButtonStyle, Interaction, Message, TextChannel
|
||||
from discord.ui import Button
|
||||
from discord.ui import Button, View
|
||||
from Handlers.HandlerResponse import HandlerResponse
|
||||
from Messages.MessagesCategory import MessagesCategory
|
||||
from Music.VulkanBot import VulkanBot
|
||||
@@ -21,6 +21,7 @@ class HandlerButton(Button):
|
||||
self.__args = args
|
||||
self.__kwargs = kwargs
|
||||
self.__handlerClass = handler
|
||||
self.__view: View = None
|
||||
|
||||
async def callback(self, interaction: Interaction) -> None:
|
||||
"""Callback to when Button is clicked"""
|
||||
@@ -31,10 +32,19 @@ class HandlerButton(Button):
|
||||
handler = self.__handlerClass(interaction, self.__bot)
|
||||
response: HandlerResponse = await handler.run(*self.__args, **self.__kwargs)
|
||||
|
||||
message = None
|
||||
if response and response.view is not None:
|
||||
message: Message = await self.__channel.send(embed=response.embed, view=response.view)
|
||||
else:
|
||||
response.view.set_message(message)
|
||||
elif response.embed:
|
||||
message: Message = await self.__channel.send(embed=response.embed)
|
||||
|
||||
# Clear the last category sended message and add the new one
|
||||
await self.__messagesManager.addMessageAndClearPrevious(self.__guildID, self.__category, message)
|
||||
if message:
|
||||
await self.__messagesManager.addMessageAndClearPrevious(self.__guildID, self.__category, message)
|
||||
|
||||
def set_view(self, view: View):
|
||||
self.__view = view
|
||||
|
||||
def get_view(self) -> View:
|
||||
return self.__view
|
||||
|
||||
86
UI/Buttons/PlaylistDropdown.py
Normal file
86
UI/Buttons/PlaylistDropdown.py
Normal file
@@ -0,0 +1,86 @@
|
||||
import asyncio
|
||||
from typing import List
|
||||
from discord import Interaction, Message, TextChannel, SelectOption
|
||||
from discord.ui import Select, View
|
||||
from Handlers.HandlerResponse import HandlerResponse
|
||||
from Messages.MessagesCategory import MessagesCategory
|
||||
from Messages.MessagesManager import MessagesManager
|
||||
from Music.VulkanBot import VulkanBot
|
||||
from Handlers.AbstractHandler import AbstractHandler
|
||||
from UI.Buttons.AbstractItem import AbstractItem
|
||||
from UI.Views.AbstractView import AbstractView
|
||||
from Music.Playlist import Playlist
|
||||
|
||||
|
||||
class PlaylistDropdown(Select, AbstractItem):
|
||||
"""Receives n elements to put in drop down and return the selected, pass the index value to a handler"""
|
||||
|
||||
def __init__(self, bot: VulkanBot, handler: type[AbstractHandler], playlist: Playlist, textChannel: TextChannel, guildID: int, category: MessagesCategory):
|
||||
songs = list(playlist.getSongs())
|
||||
|
||||
values = [str(x) for x in range(1, len(songs) + 1)]
|
||||
# Get the title of each of the 20 first songs, library doesn't accept more
|
||||
songsNames = [song.title[:80] for song in songs[:20]]
|
||||
|
||||
selectOptions: List[SelectOption] = []
|
||||
|
||||
for x in range(len(songsNames)):
|
||||
selectOptions.append(SelectOption(label=songsNames[x], value=values[x]))
|
||||
|
||||
super().__init__(placeholder="Select one music to play now, may be overdue",
|
||||
min_values=1, max_values=1, options=selectOptions)
|
||||
|
||||
self.__playlist = playlist
|
||||
self.__channel = textChannel
|
||||
self.__guildID = guildID
|
||||
self.__category = category
|
||||
self.__handlerClass = handler
|
||||
self.__messagesManager = MessagesManager()
|
||||
self.__bot = bot
|
||||
self.__view: AbstractView = None
|
||||
|
||||
async def callback(self, interaction: Interaction) -> None:
|
||||
"""Callback to when the selection is selected"""
|
||||
await interaction.response.defer()
|
||||
|
||||
# Execute the handler passing the value selected
|
||||
handler = self.__handlerClass(interaction, self.__bot)
|
||||
response: HandlerResponse = await handler.run(self.values[0])
|
||||
|
||||
message = None
|
||||
if response and response.view is not None:
|
||||
message: Message = await self.__channel.send(embed=response.embed, view=response.view)
|
||||
elif response.embed:
|
||||
message: Message = await self.__channel.send(embed=response.embed)
|
||||
|
||||
# Clear the last sended message in this category and add the new one
|
||||
if message:
|
||||
await self.__messagesManager.addMessageAndClearPrevious(self.__guildID, self.__category, message)
|
||||
|
||||
# Extreme ugly way to wait for the player process to actually retrieve the next song
|
||||
await asyncio.sleep(2)
|
||||
|
||||
await self.__update()
|
||||
|
||||
async def __update(self):
|
||||
songs = list(self.__playlist.getSongs())
|
||||
|
||||
values = [str(x) for x in range(1, len(songs) + 1)]
|
||||
# Get the title of each of the 20 first songs, library doesn't accept more
|
||||
songsNames = [song.title[:80] for song in songs[:20]]
|
||||
|
||||
selectOptions: List[SelectOption] = []
|
||||
|
||||
for x in range(len(songsNames)):
|
||||
selectOptions.append(SelectOption(label=songsNames[x], value=values[x]))
|
||||
|
||||
self.options = selectOptions
|
||||
|
||||
if self.__view is not None:
|
||||
await self.__view.update()
|
||||
|
||||
def set_view(self, view: View):
|
||||
self.__view = view
|
||||
|
||||
def get_view(self) -> View:
|
||||
return self.__view
|
||||
Reference in New Issue
Block a user