From e2e6c0567eefa030fbb9bb3368e3e588a22d5729 Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Mon, 11 Sep 2023 20:02:08 +0800 Subject: [PATCH] General clean code --- addons/lyrics.py | 12 ++++++--- cogs/basic.py | 6 ++--- requirements.txt | 2 +- update.py | 2 +- views/chapter.py | 45 +++++++++++++++++-------------- views/debug.py | 17 ++++++------ views/embedBuilder.py | 6 ++--- views/help.py | 61 +++++++++++++++++++++-------------------- views/inbox.py | 27 +++++++++++-------- views/list.py | 56 +++++++++++++++++++++----------------- views/lyrics.py | 63 ++++++++++++++++++++++--------------------- views/playlist.py | 6 +++-- voicelink/player.py | 4 +-- 13 files changed, 166 insertions(+), 141 deletions(-) diff --git a/addons/lyrics.py b/addons/lyrics.py index c24d702..10e4cac 100644 --- a/addons/lyrics.py +++ b/addons/lyrics.py @@ -1,6 +1,7 @@ import aiohttp, random, bs4, re import function as func +from abc import ABC, abstractmethod from urllib.parse import quote from math import floor from importlib import import_module @@ -46,7 +47,12 @@ Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.9 (KHTM Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.6 (KHTML, like Gecko) Chrome/ Safari/530.6 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5''' -class A_ZLyrics(): +class LyricsPlatform(ABC): + @abstractmethod + async def getLyrics(): + ... + +class A_ZLyrics(LyricsPlatform): async def get(self, url): try: async with aiohttp.ClientSession() as session: @@ -166,7 +172,7 @@ class A_ZLyrics(): return text -class Genius(): +class Genius(LyricsPlatform): def __init__(self) -> None: self.module = import_module("lyricsgenius") self.genius = self.module.Genius(func.tokens.genius_token) @@ -178,7 +184,7 @@ class Genius(): return {"default": song.lyrics} -lyricsPlatform = { +lyricsPlatform: dict[str, LyricsPlatform] = { "a_zlyrics": A_ZLyrics, "genius": Genius } \ No newline at end of file diff --git a/cogs/basic.py b/cogs/basic.py index d6db904..dfc0b63 100644 --- a/cogs/basic.py +++ b/cogs/basic.py @@ -59,8 +59,8 @@ async def nowplay(ctx: commands.Context, player: voicelink.Player): upnext = "\n".join(f"`{index}.` `[{track.formatted_length}]` [{track.title[:30]}]({track.uri})" for index, track in enumerate(player.queue.tracks()[:2], start=2)) embed = discord.Embed(description=player.get_msg('nowplayingDesc').format(track.title), color=settings.embed_color) embed.set_author( - name=track.requester if track.requester else ctx.bot, - icon_url=track.requester.display_avatar.url if track.requester else ctx.me.display_avatar.url + name=track.requester, + icon_url=track.requester.display_avatar.url ) embed.set_thumbnail(url=track.thumbnail) @@ -792,7 +792,7 @@ class Basic(commands.Cog): name = player.current.title + " " + player.current.author await ctx.defer() - song = await lyricsPlatform.get(settings.lyrics_platform)().getLyrics(name) + song: dict[str, str] = await lyricsPlatform.get(settings.lyrics_platform)().getLyrics(name) if not song: return await ctx.send(get_lang(ctx.guild.id, 'lyricsNotFound'), ephemeral=True) diff --git a/requirements.txt b/requirements.txt index 86938fa..ce159b4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ discord.py==2.3.2 -pymongo==4.1.1 +pymongo==4.5.0 dnspython==2.2.1 tldextract==3.2.1 validators==0.18.2 diff --git a/update.py b/update.py index 6902e7f..b8432b3 100644 --- a/update.py +++ b/update.py @@ -2,7 +2,7 @@ import requests, zipfile, os, shutil, argparse from io import BytesIO ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) -__version__ = "v2.6.6b4" +__version__ = "v2.6.6b5" GITHUB_API_URL = "https://api.github.com/repos/ChocoMeow/Vocard/releases/latest" VOCARD_URL = "https://github.com/ChocoMeow/Vocard/archive/" diff --git a/views/chapter.py b/views/chapter.py index b64c536..ad67d16 100644 --- a/views/chapter.py +++ b/views/chapter.py @@ -20,28 +20,30 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +from __future__ import annotations import discord from function import formatTime +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from voicelink import Player class Dropdown(discord.ui.Select): - def __init__(self, player, chapters): + def __init__(self, player: Player, chapters): + self.view: ChapterView - self.player = player - self.chapters = chapters - self.current = player.current.uri - - options = [ - discord.SelectOption(label=f"{index}. {title[:30]}", - description=time) - for index, (time, title) in enumerate(self.chapters, start=1) - ] + self.player: Player = player + self.chapters: list[str] = chapters + self.current: str = player.current.uri super().__init__( placeholder=self.player.get_msg('chaptersDropdown'), min_values=1, max_values=1, - options=options[:25], + options=[ + discord.SelectOption(label=f"{index}. {title[:30]}", description=time) + for index, (time, title) in enumerate(self.chapters, start=1) + ][:25] ) async def callback(self, interaction: discord.Interaction): @@ -55,13 +57,18 @@ class Dropdown(discord.ui.Select): await interaction.response.send_message(self.player.get_msg('seek').format(formatTime(position))) class ChapterView(discord.ui.View): - def __init__(self, player, chapters, author): + def __init__( + self, + player: Player, + chapters: list[str], + author: discord.Member + ) -> None: super().__init__(timeout=180) - self.player = player - self.chapters = chapters - self.author = author - self.response = None + self.player: Player = player + self.chapters: list[str] = chapters + self.author: discord.Member = author + self.response: discord.Message = None self.add_item(Dropdown(player, chapters)) async def on_error(self, error: Exception, item, interaction) -> None: @@ -78,7 +85,5 @@ class ChapterView(discord.ui.View): async def on_timeout(self) -> None: await self.stop_view() - async def interaction_check(self, interaction): - if interaction.user == self.author: - return True - return False \ No newline at end of file + async def interaction_check(self, interaction: discord.Interaction): + return interaction.user == self.author \ No newline at end of file diff --git a/views/debug.py b/views/debug.py index 0f63aeb..0f9b14a 100644 --- a/views/debug.py +++ b/views/debug.py @@ -33,7 +33,7 @@ from discord.ext import commands class ExceuteModal(discord.ui.Modal): def __init__(self, code: str, *args, **kwargs) -> None: super().__init__(*args, **kwargs) - self.code = code + self.code: str = code self.add_item( discord.ui.TextInput( @@ -51,24 +51,23 @@ class ExceuteModal(discord.ui.Modal): class CogsDropdown(discord.ui.Select): def __init__(self, bot: commands.Bot): - self.bot = bot - - options = [discord.SelectOption(label="All", description="All the cogs")] - - for name, cog in bot.cogs.items(): - options.append(discord.SelectOption(label=name.capitalize(), description=cog.description[:50])) + self.bot: commands.Bot = bot super().__init__( placeholder="Select a cog to reload...", min_values=1, max_values=1, - options=options, + options=[discord.SelectOption(label="All", description="All the cogs")] + + [ + discord.SelectOption(label=name.capitalize(), description=cog.description[:50]) + for name, cog in bot.cogs.items() + ], ) async def callback(self, interaction: discord.Interaction) -> None: selected = self.values[0].lower() try: if selected == "all": - for name in self.bot.cogs.copy().keys(): + for name in self.bot.cogs.keys(): await self.bot.reload_extension(f"cogs.{name.lower()}") else: await self.bot.reload_extension(f"cogs.{selected}") diff --git a/views/embedBuilder.py b/views/embedBuilder.py index 449f7b9..aa9e07c 100644 --- a/views/embedBuilder.py +++ b/views/embedBuilder.py @@ -59,10 +59,8 @@ class EmbedBuilderView(discord.ui.View): except: pass - async def interaction_check(self, interaction): - if interaction.user == self.author: - return True - return False + async def interaction_check(self, interaction: discord.Interaction): + return interaction.user == self.author @discord.ui.button(label="Edit Content", style=discord.ButtonStyle.blurple) async def edit_content(self, interaction: discord.Interaction, button: discord.ui.Button): diff --git a/views/help.py b/views/help.py index 693ba53..fd485cb 100644 --- a/views/help.py +++ b/views/help.py @@ -28,34 +28,33 @@ import function as func class HelpDropdown(discord.ui.Select): def __init__(self, categorys:list): - options = [ - discord.SelectOption(emoji="šŸ†•", label="News", description="View new updates of Vocard."), - discord.SelectOption(emoji="šŸ•¹ļø", label="Tutorial", description="How to use Vocard."), - ] - cog_emojis = ["1ļøāƒ£", "2ļøāƒ£", "3ļøāƒ£", "4ļøāƒ£", "5ļøāƒ£", "6ļøāƒ£", "7ļøāƒ£"] - for category, emoji in zip(categorys, cog_emojis): - options.append(discord.SelectOption(emoji=emoji, - label=f"{category} Commands", - description=f"This is {category.lower()} Category.")) - + self.view: HelpView + super().__init__( placeholder="Select Category!", min_values=1, max_values=1, - options=options, custom_id="select" + options=[ + discord.SelectOption(emoji="šŸ†•", label="News", description="View new updates of Vocard."), + discord.SelectOption(emoji="šŸ•¹ļø", label="Tutorial", description="How to use Vocard."), + ] + [ + discord.SelectOption(emoji=emoji, label=f"{category} Commands", description=f"This is {category.lower()} Category.") + for category, emoji in zip(categorys, ["1ļøāƒ£", "2ļøāƒ£", "3ļøāƒ£", "4ļøāƒ£", "5ļøāƒ£", "6ļøāƒ£", "7ļøāƒ£"]) + ], + custom_id="select" ) - async def callback(self, interaction: discord.Interaction): + async def callback(self, interaction: discord.Interaction) -> None: embed = self.view.build_embed(self.values[0].split(" ")[0]) await interaction.response.edit_message(embed=embed) class HelpView(discord.ui.View): - def __init__(self, bot: commands.Bot, author: discord.Member): + def __init__(self, bot: commands.Bot, author: discord.Member) -> None: super().__init__(timeout=60) - self.author = author - self.bot = bot - self.response = None - self.categorys = [ name.capitalize() for name, cog in bot.cogs.items() if len([c for c in cog.walk_commands()]) ] + self.author: discord.Member = author + self.bot: commands.Bot = bot + self.response: discord.Message = None + self.categorys: list[str] = [ name.capitalize() for name, cog in bot.cogs.items() if len([c for c in cog.walk_commands()]) ] self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=func.settings.invite_link)) self.add_item(discord.ui.Button(label='Invite', emoji=':invite:915152589056790589', url='https://discord.com/oauth2/authorize?client_id={}&permissions=2184260928&scope=bot%20applications.commands'.format(func.tokens.client_id))) @@ -63,10 +62,10 @@ class HelpView(discord.ui.View): self.add_item(discord.ui.Button(label='Donate', emoji=':patreon:913397909024800878', url='https://www.patreon.com/Vocard')) self.add_item(HelpDropdown(self.categorys)) - async def on_error(self, error, item, interaction): + async def on_error(self, error, item, interaction) -> None: return - async def on_timeout(self): + async def on_timeout(self) -> None: for child in self.children: if child.custom_id == "select": child.disabled = True @@ -75,22 +74,20 @@ class HelpView(discord.ui.View): except: pass - async def interaction_check(self, interaction): - if interaction.user == self.author: - return True - return False + async def interaction_check(self, interaction: discord.Interaction) -> None: + return interaction.user == self.author - def build_embed(self, category: str): + def build_embed(self, category: str) -> discord.Embed: category = category.lower() if category == "news": embed = discord.Embed(title="Vocard Help Menu", url="https://discord.com/channels/811542332678996008/811909963718459392/1069971173116481636", color=func.settings.embed_color) - - embed.add_field(name=f"Available Categories: [{2 + len(self.categorys)}]", - value="```py\nšŸ‘‰ News\n2. Tutorial\n{}```".format("".join(f"{i}. {c}\n" for i, c in enumerate(self.categorys, start=3))), - inline=True) + embed.add_field( + name=f"Available Categories: [{2 + len(self.categorys)}]", + value="```py\nšŸ‘‰ News\n2. Tutorial\n{}```".format("".join(f"{i}. {c}\n" for i, c in enumerate(self.categorys, start=3))), + inline=True + ) update = "Vocard is a simple music bot. It leads to a comfortable experience which is user-friendly, It supports YouTube, Soundcloud, Spotify, Twitch and more!" - embed.add_field(name="šŸ“° Information:", value=update, inline=True) embed.add_field(name="Get Started", value="```Join a voice channel and /play {Song/URL} a song. (Names, Youtube Video Links or Playlist links or Spotify links are supported on Vocard)```", inline=False) @@ -107,7 +104,9 @@ class HelpView(discord.ui.View): commands = [command for command in cog.walk_commands()] embed.description = cog.description - embed.add_field(name=f"{category} Commands: [{len(commands)}]", - value="```{}```".format("".join(f"/{command.qualified_name}\n" for command in commands if not command.qualified_name == cog.qualified_name))) + embed.add_field( + name=f"{category} Commands: [{len(commands)}]", + value="```{}```".format("".join(f"/{command.qualified_name}\n" for command in commands if not command.qualified_name == cog.qualified_name)) + ) return embed \ No newline at end of file diff --git a/views/inbox.py b/views/inbox.py index 70a008e..d9c8fd9 100644 --- a/views/inbox.py +++ b/views/inbox.py @@ -24,8 +24,11 @@ SOFTWARE. import discord import function as func +from typing import Any + class Select_message(discord.ui.Select): def __init__(self, inbox): + self.view: InboxView options = [discord.SelectOption(label=f"{index}. {mail['title'][:50]}", description=mail['type'], emoji='āœ‰ļø' if mail['type'] == 'invite' else 'šŸ“¢') for index, mail in enumerate(inbox, start=1) ] super().__init__( @@ -38,25 +41,27 @@ class Select_message(discord.ui.Select): await self.view.button_change(interaction) class InboxView(discord.ui.View): - def __init__(self, author, inbox): + def __init__(self, author: discord.Member, inbox: list[dict[str, Any]]): super().__init__(timeout=60) - self.author: discord.Member = author - self.inbox = inbox - self.response = None + self.inbox: list[dict[str, Any]] = inbox self.newplaylist = [] + self.author: discord.Member = author + self.response: discord.Message = None self.current = None + self.add_item(Select_message(inbox)) async def interaction_check(self, interaction: discord.Interaction): - if interaction.user == self.author: - return True - return False + return interaction.user == self.author + + def build_embed(self) -> discord.Embed: + embed=discord.Embed( + title=f"šŸ“­ All {self.author.name}'s Inbox", + description=f'Max Messages: {len(self.inbox)}/10' + '```%0s %2s %20s\n' % (" ", "ID:", "Title:") + '\n'.join('%0s %2s. %35s'% ('āœ‰ļø' if mail['type'] == 'invite' else 'šŸ“¢', index, mail['title'][:35] + "...") for index, mail in enumerate(self.inbox, start=1)) + '```', + color=func.settings.embed_color + ) - def build_embed(self): - embed=discord.Embed(title=f"šŸ“­ All {self.author.name}'s Inbox", - description=f'Max Messages: {len(self.inbox)}/10' + '```%0s %2s %20s\n' % (" ", "ID:", "Title:") + '\n'.join('%0s %2s. %35s'% ('āœ‰ļø' if mail['type'] == 'invite' else 'šŸ“¢', index, mail['title'][:35] + "...") for index, mail in enumerate(self.inbox, start=1)) + '```', - color=func.settings.embed_color) if self.current: embed.add_field(name="Message Info:", value=f"```{self.current['description']}\nSender ID: {self.current['sender']}\nPlaylist ID: {self.current['referId']}\nInvite Time: {self.current['time'].strftime('%d-%m %H:%M:%S')}```") return embed diff --git a/views/list.py b/views/list.py index 3fcf184..9b60eb0 100644 --- a/views/list.py +++ b/views/list.py @@ -25,29 +25,38 @@ import discord import function as func from math import ceil +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from voicelink import Player, Track class ListView(discord.ui.View): - def __init__(self, player, author, isQueue = True): + def __init__( + self, + player: "Player", + author: discord.Member, + isQueue = True + ) -> None: super().__init__(timeout=60) - self.player = player + self.player: Player = player self.name: str = player.get_msg('queueTitle') if isQueue else player.get_msg('historyTitle') - self.tracks: list = player.queue.tracks() if isQueue else player.queue.history() + self.tracks: list[Track] = player.queue.tracks() if isQueue else player.queue.history() self.response: discord.Message = None if not isQueue: self.tracks.reverse() self.author: discord.Member = author - self.page = ceil(len(self.tracks) / 7) - self.current_page = 1 + self.page: int = ceil(len(self.tracks) / 7) + self.current_page: int = 1 try: - self.time = func.time(sum([track.length for track in self.tracks])) - except: + self.time: str = func.time(sum([track.length for track in self.tracks])) + except Exception as _: self.time = "āˆž" - async def on_timeout(self): + async def on_timeout(self) -> None: for child in self.children: child.disabled = True try: @@ -55,58 +64,57 @@ class ListView(discord.ui.View): except: pass - async def on_error(self, error, item, interaction): + async def on_error(self, error, item, interaction) -> None: return - async def interaction_check(self, interaction): - if interaction.user == self.author: - return True - return False + async def interaction_check(self, interaction: discord.Interaction) -> bool: + return interaction.user == self.author - def build_embed(self): - offset = self.current_page * 7 - tracks = self.tracks[(offset-7):offset] + def build_embed(self) -> discord.Embed: + offset: int = self.current_page * 7 + tracks: list[Track] = self.tracks[(offset-7):offset] embed = discord.Embed(title=self.player.get_msg('viewTitle'), color=func.settings.embed_color) embed.description=self.player.get_msg('viewDesc').format(self.player.current.uri, f"```{self.player.current.title}```") if self.player.current else self.player.get_msg('nowplayingDesc').format("None") - queueText = "" - for index, track in enumerate(tracks, start=offset - 6): - queueText += f"{track.emoji} `{index}.` `[" + (self.player.get_msg("live") if track.is_stream else func.time(track.length)) + f'`] **{track.title[:30]}** ' + (track.requester.mention if track.requester else self.player.client.id) + "\n" + queueText = "\n".join([ + f"{track.emoji} `{i}.` `[" + (self.player.get_msg("live") if track.is_stream else func.time(track.length)) + f'`] **{track.title[:30]}** ' + (track.requester.mention) + for i, track in enumerate(tracks, start=offset-6) + ]) embed.add_field(name=self.name, value=queueText) embed.set_footer(text=self.player.get_msg('viewFooter').format(self.current_page, self.page, self.time)) return embed @discord.ui.button(label='<<', style=discord.ButtonStyle.grey) - async def fast_back_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def fast_back_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page != 1: self.current_page = 1 return await interaction.response.edit_message(embed=self.build_embed()) await interaction.response.defer() @discord.ui.button(label='Back', style=discord.ButtonStyle.blurple) - async def back_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def back_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page > 1: self.current_page -= 1 return await interaction.response.edit_message(embed=self.build_embed()) await interaction.response.defer() @discord.ui.button(label='Next', style=discord.ButtonStyle.blurple) - async def next_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def next_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page < self.page: self.current_page += 1 return await interaction.response.edit_message(embed=self.build_embed()) await interaction.response.defer() @discord.ui.button(label='>>', style=discord.ButtonStyle.grey) - async def fast_next_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def fast_next_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page != self.page: self.current_page = self.page return await interaction.response.edit_message(embed=self.build_embed()) await interaction.response.defer() @discord.ui.button(emoji='šŸ—‘ļø', style=discord.ButtonStyle.red) - async def stop_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def stop_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: await self.response.delete() self.stop() \ No newline at end of file diff --git a/views/lyrics.py b/views/lyrics.py index b93169a..b520313 100644 --- a/views/lyrics.py +++ b/views/lyrics.py @@ -25,41 +25,40 @@ import discord import function as func class LyricsDropdown(discord.ui.Select): - def __init__(self, langs: list): - options = [discord.SelectOption(label=lang) for lang in langs] + def __init__(self, langs: list[str]) -> None: + self.view: LyricsView super().__init__( placeholder="Select A Lyrics Translation", min_values=1, max_values=1, - options=options, custom_id="selectLyricsLangs" + options=[discord.SelectOption(label=lang) for lang in langs], + custom_id="selectLyricsLangs" ) - async def callback(self, interaction: discord.Interaction): + async def callback(self, interaction: discord.Interaction) -> None: self.view.lang = self.values[0] self.view.current_page = 1 self.view.pages = len(self.view.source.get(self.values[0])) await interaction.response.edit_message(embed=self.view.build_embed()) class LyricsView(discord.ui.View): - def __init__(self, name: str, source: dict, author: discord.Member): + def __init__(self, name: str, source: dict, author: discord.Member) -> None: super().__init__(timeout=60) - self.name = name - self.source = source - self.lang = list(source.keys())[0] - self.author = author + self.name: str = name + self.source: dict[str, list[str]] = source + self.lang: list[str] = list(source.keys())[0] + self.author: discord.Member = author - self.response = None - self.pages = len(self.source.get(self.lang)) - self.current_page = 1 + self.response: discord.Message = None + self.pages: int = len(self.source.get(self.lang)) + self.current_page: int = 1 self.add_item(LyricsDropdown(list(source.keys()))) - async def interaction_check(self, interaction): - if interaction.user == self.author: - return True - return False + async def interaction_check(self, interaction: discord.Interaction) -> bool: + return interaction.user == self.author - async def on_timeout(self): + async def on_timeout(self) -> None: for child in self.children: child.disabled = True try: @@ -67,10 +66,10 @@ class LyricsView(discord.ui.View): except: pass - async def on_error(self, error, item, interaction): + async def on_error(self, error, item, interaction) -> None: return - def build_embed(self): + def build_embed(self) -> discord.Embed: chunk = self.source.get(self.lang)[self.current_page - 1] embed=discord.Embed(description=chunk, color=func.settings.embed_color) embed.set_author(name=f"Searching Query: {self.name}", icon_url=self.author.display_avatar.url) @@ -78,30 +77,34 @@ class LyricsView(discord.ui.View): return embed @discord.ui.button(label='<<', style=discord.ButtonStyle.grey) - async def fast_back_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def fast_back_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page != 1: self.current_page = 1 - await interaction.response.edit_message(embed=self.build_embed()) - + return await interaction.response.edit_message(embed=self.build_embed()) + await interaction.response.defer() + @discord.ui.button(label='Back', style=discord.ButtonStyle.blurple) - async def back_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def back_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page > 1: self.current_page -= 1 - await interaction.response.edit_message(embed=self.build_embed()) - + return await interaction.response.edit_message(embed=self.build_embed()) + await interaction.response.defer() + @discord.ui.button(label='Next', style=discord.ButtonStyle.blurple) - async def next_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def next_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page < self.pages: self.current_page += 1 - await interaction.response.edit_message(embed=self.build_embed()) + return await interaction.response.edit_message(embed=self.build_embed()) + await interaction.response.defer() @discord.ui.button(label='>>', style=discord.ButtonStyle.grey) - async def fast_next_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def fast_next_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: if self.current_page != self.pages: self.current_page = self.pages - await interaction.response.edit_message(embed=self.build_embed()) + return await interaction.response.edit_message(embed=self.build_embed()) + await interaction.response.defer() @discord.ui.button(emoji='šŸ—‘ļø', style=discord.ButtonStyle.red) - async def stop_button(self, interaction: discord.Interaction, button: discord.ui.Button): + async def stop_button(self, interaction: discord.Interaction, button: discord.ui.Button) -> None: await self.response.delete() self.stop() \ No newline at end of file diff --git a/views/playlist.py b/views/playlist.py index c90b95e..545375a 100644 --- a/views/playlist.py +++ b/views/playlist.py @@ -24,10 +24,12 @@ SOFTWARE. import discord import function as func -from voicelink import Track from math import ceil from tldextract import extract -from typing import Any +from typing import Any, TYPE_CHECKING + +if TYPE_CHECKING: + from voicelink import Track class Select_playlist(discord.ui.Select): def __init__(self, results): diff --git a/voicelink/player.py b/voicelink/player.py index 0f6d0d4..14cee67 100644 --- a/voicelink/player.py +++ b/voicelink/player.py @@ -96,8 +96,8 @@ class Player(VoiceProtocol): channel: Optional[VoiceChannel] = None, ctx: Union[commands.Context, Interaction] = None, ): - self.client = client - self._bot = client + self.client: Client = client + self._bot: Client = client self.context = ctx self.dj: Member = ctx.user if isinstance(ctx, Interaction) else ctx.author self.channel: VoiceChannel = channel