General clean code

This commit is contained in:
Choco
2023-09-11 13:20:07 +08:00
parent c8fd1cca19
commit e7f4118470
4 changed files with 89 additions and 70 deletions

View File

@@ -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()

View File

@@ -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:

View File

@@ -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):