From e7f4118470bb4e04da7a5995d6242edb55f0886d Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:20:07 +0800 Subject: [PATCH] General clean code --- cogs/playlist.py | 2 +- views/list.py | 18 +++++--- views/playlist.py | 112 ++++++++++++++++++++++++++-------------------- views/search.py | 27 +++++------ 4 files changed, 89 insertions(+), 70 deletions(-) diff --git a/cogs/playlist.py b/cogs/playlist.py index 449950f..0d3cb7c 100644 --- a/cogs/playlist.py +++ b/cogs/playlist.py @@ -191,7 +191,7 @@ class Playlists(commands.Cog, name="playlist"): init.append(dt) playlist['tracks'] = init results.append({'emoji': ('๐Ÿ”’' if max_p < index else ('๐Ÿค' if share else 'โค๏ธ')), 'id': data, 'time': ctime(time), 'name': user[data]['name'], 'tracks': playlist['tracks'], 'perms': playlist['perms'], 'owner': user[data].get('user', None), 'type': user[data]['type']}) - + except Exception as e: results.append({'emoji': 'โ›”', 'id': data, 'time': '00:00', 'name': 'Error', 'tracks': [], 'type': 'error'}) diff --git a/views/list.py b/views/list.py index 8def253..3fcf184 100644 --- a/views/list.py +++ b/views/list.py @@ -82,26 +82,30 @@ class ListView(discord.ui.View): async def fast_back_button(self, interaction: discord.Interaction, button: discord.ui.Button): 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): 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): if self.current_page < self.page: 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): if self.current_page != self.page: self.current_page = self.page - 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): await self.response.delete() diff --git a/views/playlist.py b/views/playlist.py index 1cc077d..c90b95e 100644 --- a/views/playlist.py +++ b/views/playlist.py @@ -24,35 +24,40 @@ SOFTWARE. import discord import function as func +from voicelink import Track from math import ceil from tldextract import extract +from typing import Any class Select_playlist(discord.ui.Select): def __init__(self, results): - options = [discord.SelectOption(emoji='๐ŸŒŽ', label='All Playlist')] - for index, playlist in enumerate(results, start=1): - if playlist['type'] != 'error': - options.append(discord.SelectOption(emoji=playlist['emoji'], label=f'{index}. {playlist["name"]}', description=f"{playlist['time']} ยท {playlist['type']}")) + self.view: PlaylistView super().__init__( placeholder="Select a playlist to view ..", - options=options + options=[discord.SelectOption(emoji='๐ŸŒŽ', label='All Playlist')] + + [ + discord.SelectOption(emoji=playlist['emoji'], label=f'{index}. {playlist["name"]}', description=f"{playlist['time']} ยท {playlist['type']}") + for index, playlist in enumerate(results, start=1) if playlist['type'] != 'error' + ] ) - async def callback(self, interaction: discord.Interaction): + async def callback(self, interaction: discord.Interaction) -> None: if self.values[0] == 'All Playlist': self.view.current = None return await interaction.response.edit_message(embed=self.view.viewEmbed) + self.view.current = self.view.results[int(self.values[0].split(". ")[0]) - 1] self.view.page = ceil(len(self.view.current['tracks']) / 7) self.view.current_page = 1 await interaction.response.edit_message(embed=self.view.build_embed()) class agree(discord.ui.Button): - def __init__(self): + def __init__(self) -> None: + self.view: CreateView super().__init__(label="Agree", style=discord.ButtonStyle.green) - async def callback(self, interaction: discord.Interaction): + async def callback(self, interaction: discord.Interaction) -> None: self.label = "Created" self.disabled = True self.style=discord.ButtonStyle.primary @@ -62,57 +67,61 @@ class agree(discord.ui.Button): self.view.stop() class PlaylistView(discord.ui.View): - def __init__(self, viewEmbed, results, author): + def __init__( + self, + viewEmbed: discord.Embed, + results: list[dict[str, Any]], + author: discord.Message + ) -> None: super().__init__(timeout=60) - self.viewEmbed = viewEmbed - self.results = results - self.author = author - self.guildID = author.guild.id - self.response = None - self.current = None - self.page = 0 - self.current_page = 1 + self.viewEmbed: discord.Embed = viewEmbed + self.results: list[dict[str, Any]] = results + self.author: discord.Member = author + self.response: discord.Message = None + + self.current: dict[str, Any] = None + self.page: int = 0 + self.current_page: int = 1 self.add_item(Select_playlist(results)) - 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_error(self, error, item, interaction): + async def on_error(self, error, item, interaction) -> None: return - def build_embed(self): - offset = self.current_page * 7 - tracks = self.current['tracks'][(offset-7):offset] + def build_embed(self) -> discord.Embed: + offset: int = self.current_page * 7 + tracks: list[Track] = self.current['tracks'][(offset-7):offset] + guild_id = self.author.id - embed = discord.Embed(title=func.get_lang(self.guildID, 'playlistView'), color=func.settings.embed_color) + embed = discord.Embed(title=func.get_lang(guild_id, 'playlistView'), color=func.settings.embed_color) - embed.description= func.get_lang(self.guildID, 'playlistViewDesc').format(self.current['name'], self.current['id'], len(self.current['tracks']), owner if (owner := self.current.get('owner')) else f"{self.author.id} (You)", self.current['type']) + embed.description= func.get_lang(guild_id, 'playlistViewDesc').format(self.current['name'], self.current['id'], len(self.current['tracks']), owner if (owner := self.current.get('owner')) else f"{self.author.id} (You)", self.current['type']) perms = self.current['perms'] - permsStr = func.get_lang(self.guildID, 'settingsPermTitle') + permsStr = func.get_lang(guild_id, 'settingsPermTitle') if self.current['type'] == 'share': - embed.add_field(name=permsStr, value=func.get_lang(self.guildID, 'playlistViewPermsValue').format('โœ“' if 'write' in perms and self.author.id in perms['write'] else 'โœ˜', 'โœ“' if 'remove' in perms and self.author.id in perms['remove'] else 'โœ˜')) + embed.add_field(name=permsStr, value=func.get_lang(guild_id, 'playlistViewPermsValue').format('โœ“' if 'write' in perms and self.author.id in perms['write'] else 'โœ˜', 'โœ“' if 'remove' in perms and self.author.id in perms['remove'] else 'โœ˜')) else: - embed.add_field(name=permsStr, value=func.get_lang(self.guildID, 'playlistViewPermsValue2').format(', '.join(f'<@{user}>' for user in perms['read']))) + embed.add_field(name=permsStr, value=func.get_lang(guild_id, 'playlistViewPermsValue2').format(', '.join(f'<@{user}>' for user in perms['read']))) - trackStr = func.get_lang(self.guildID, 'playlistViewTrack') + trackStr = func.get_lang(guild_id, 'playlistViewTrack') if tracks: if self.current.get("type") == "playlist": embed.add_field(name=trackStr, value="\n".join(f"{func.emoji_source(track['sourceName'])} `{index}.` `[{func.time(track['length'])}]` **{track['title'][:30]}**" for index, track in enumerate(tracks, start=offset - 6)), inline=False) else: embed.add_field(name=trackStr, value='\n'.join(f"{func.emoji_source(extract(track.info['uri']).domain)} `{index}.` `[{func.time(track.length)}]` **{track.title[:30]}** " for index, track in enumerate(tracks, start=offset - 6)), inline=False) else: - embed.add_field(name=trackStr, value=func.get_lang(self.guildID, 'playlistNoTrack').format(self.current['name']), inline=False) + embed.add_field(name=trackStr, value=func.get_lang(guild_id, 'playlistNoTrack').format(self.current['name']), inline=False) - embed.set_footer(text=func.get_lang(self.guildID, 'playlistViewPage').format(self.current_page, self.page, self.current['time'])) + embed.set_footer(text=func.get_lang(guild_id, 'playlistViewPage').format(self.current_page, self.page, self.current['time'])) return embed - async def on_timeout(self): + async def on_timeout(self) -> None: for child in self.children: child.disabled = True try: @@ -121,51 +130,56 @@ class PlaylistView(discord.ui.View): pass @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 not self.current: return 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 not self.current: return 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 not self.current: return if self.current_page < self.page: 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 not self.current: return if self.current_page != self.page: self.current_page = self.page - 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() class CreateView(discord.ui.View): - def __init__(self): + def __init__(self) -> None: super().__init__(timeout=20) - self.value = None - self.response = None + self.value: bool = None + self.response: discord.Message = None + self.add_item(agree()) self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=func.settings.invite_link)) - async def on_timeout(self): + async def on_timeout(self) -> None: for child in self.children: child.disabled = True try: diff --git a/views/search.py b/views/search.py index 6d7b344..720021b 100644 --- a/views/search.py +++ b/views/search.py @@ -23,23 +23,23 @@ SOFTWARE. import discord -from function import LANGS +from voicelink import Track class SearchDropdown(discord.ui.Select): - def __init__(self, tracks, get_msg): - self.tracks = tracks - self.get_msg = get_msg - options = [] - for index, track in enumerate(self.tracks, start=1): - options.append(discord.SelectOption(label=f"{index}. {track.title[:50]}", description=f"{track.author[:50]} ยท {track.formatted_length}")) - + def __init__(self, tracks: list[Track], get_msg: callable) -> None: + self.view: SearchView + self.get_msg: callable = get_msg + super().__init__( placeholder=get_msg('searchWait'), min_values=1, max_values=len(tracks), - options=options + options=[ + discord.SelectOption(label=f"{i}. {track.title[:50]}", description=f"{track.author[:50]} ยท {track.formatted_length}") + for i, track in enumerate(tracks, start=1) + ] ) - async def callback(self, interaction: discord.Interaction): + async def callback(self, interaction: discord.Interaction) -> None: self.disabled = True self.placeholder = self.get_msg('searchSuccess') await interaction.response.edit_message(view=self.view) @@ -47,10 +47,11 @@ class SearchDropdown(discord.ui.Select): self.view.stop() class SearchView(discord.ui.View): - def __init__(self, tracks, lang): + def __init__(self, tracks: list[Track], lang: callable) -> None: super().__init__(timeout=60) - self.response = None - self.values = None + + self.response: discord.Message = None + self.values: list[str] = None self.add_item(SearchDropdown(tracks, lang)) async def on_error(self, error, item, interaction):