diff --git a/langs/CH.json b/langs/CH.json index ff6d4be..1b7ba66 100644 --- a/langs/CH.json +++ b/langs/CH.json @@ -116,6 +116,7 @@ "buttonShuffle": "隨機播放", "buttonForward": "前進", "buttonRewind": "後退", + "buttonLyrics": "歌詞", "nowplayingDesc": "**現在播放:**\n```{0}```", "nowplayingField": "接下來播放:", diff --git a/langs/DE.json b/langs/DE.json index c863567..aa92b94 100644 --- a/langs/DE.json +++ b/langs/DE.json @@ -116,6 +116,7 @@ "buttonShuffle": "Zufall", "buttonForward": "Vorspulen", "buttonRewind": "Zurückspulen", + "buttonLyrics": "Liedtexte", "nowplayingDesc": "**Jetzt wird abgespielt:**\n```{0}```", "nowplayingField": "Als nächstes:", diff --git a/langs/EN.json b/langs/EN.json index e11767f..271e270 100644 --- a/langs/EN.json +++ b/langs/EN.json @@ -116,6 +116,7 @@ "buttonShuffle": "Shuffle", "buttonForward": "Forward", "buttonRewind": "Rewind", + "buttonLyrics": "Lyrics", "nowplayingDesc": "**Now Playing:**\n```{0}```", "nowplayingField": "Up Next:", diff --git a/langs/ES.json b/langs/ES.json index 990cdea..c0185a9 100644 --- a/langs/ES.json +++ b/langs/ES.json @@ -116,6 +116,7 @@ "buttonShuffle": "Aleatorio", "buttonForward": "Adelante", "buttonRewind": "Atrás", + "buttonLyrics": "Letras", "nowplayingDesc": "**Reproduciendo ahora:**\n```{0}```", "nowplayingField": "A continuación:", diff --git a/langs/JA.json b/langs/JA.json index 9544615..10abde1 100644 --- a/langs/JA.json +++ b/langs/JA.json @@ -116,6 +116,7 @@ "buttonShuffle": "シャッフル", "buttonForward": "進む", "buttonRewind": "戻る", + "buttonLyrics": "歌詞", "nowplayingDesc": "**現在再生中:**\n```{0}```", "nowplayingField": "次に再生する曲:", diff --git a/langs/KO.json b/langs/KO.json index 0dfd6c6..0429429 100644 --- a/langs/KO.json +++ b/langs/KO.json @@ -116,6 +116,7 @@ "buttonShuffle": "셔플", "buttonForward": "앞으로", "buttonRewind": "뒤로", + "buttonLyrics": "가사", "nowplayingDesc": "**현재 재생중인 곡:**\n```{0}```", "nowplayingField": "다음 곡:", diff --git a/langs/RU.json b/langs/RU.json index bbc9cca..7d34277 100644 --- a/langs/RU.json +++ b/langs/RU.json @@ -116,7 +116,8 @@ "buttonShuffle": "Перемешать", "buttonForward": "+10сек", "buttonRewind": "Назад", - + "buttonLyrics": "Тексты песен", + "nowplayingDesc": "**Сейчас играет:**\n```{0}```", "nowplayingField": "Следующее:", "nowplayingLink": "Слушать на {0}", diff --git a/langs/UA.json b/langs/UA.json index df3a9e0..9aebf32 100644 --- a/langs/UA.json +++ b/langs/UA.json @@ -116,6 +116,7 @@ "buttonShuffle": "Перемішати", "buttonForward": "Вперед", "buttonRewind": "Назад", + "buttonLyrics": "Тексти пісень", "nowplayingDesc": "**Зараз грає:**\n```{0}```", "nowplayingField": "Наступне:", diff --git a/views/controller.py b/views/controller.py index d142b3e..07790d8 100644 --- a/views/controller.py +++ b/views/controller.py @@ -22,14 +22,15 @@ SOFTWARE. """ import discord +import re import voicelink +import addons +import views import function as func from discord.ext import commands from typing import Dict -from . import ButtonOnCooldown - def key(interaction: discord.Interaction): return interaction.user @@ -45,10 +46,11 @@ class ControlButton(discord.ui.Button): self.disable_button_text: bool = func.settings.controller.get("disableButtonText", False) super().__init__(label=self.player.get_msg(label) if label and not self.disable_button_text else None, **kwargs) - async def send(self, interaction: discord.Interaction, key: str, *params, ephemeral: bool = False) -> None: + async def send(self, interaction: discord.Interaction, key: str, *params, view: discord.ui.View = None, ephemeral: bool = False) -> None: stay = self.player.settings.get("controller_msg", True) return await func.send( interaction, key, *params, + view=view, delete_after=None if ephemeral or stay else 10, ephemeral=ephemeral ) @@ -362,6 +364,29 @@ class Rewind(ControlButton): await self.player.seek(position) await self.send(interaction, 'rewind', func.time(position)) +class Lyrics(ControlButton): + def __init__(self, **kwargs): + super().__init__( + emoji="📜", + label="buttonLyrics", + disabled=kwargs["player"].current is None, + **kwargs + ) + + async def callback(self, interaction: discord.Interaction): + if not self.player or not self.player.is_playing: + return await self.send(interaction, "noTrackPlaying", ephemeral=True) + + title = self.player.current.title + artist = self.player.current.author + + song: dict[str, str] = await addons.lyricsPlatform.get(func.settings.lyrics_platform)().get_lyrics(title, artist) + if not song: + return await self.send(interaction, "lyricsNotFound", ephemeral=True) + + view = views.LyricsView(name=title, source={_: re.findall(r'.*\n(?:.*\n){,22}', v) for _, v in song.items()}, author=interaction.user) + view.response = await self.send(interaction, view.build_embed(), view=view, ephemeral=True) + class Tracks(discord.ui.Select): def __init__(self, player, style, row): @@ -435,6 +460,7 @@ BUTTONTYPE: Dict[str, ControlButton] = { "shuffle": Shuffle, "forward": Forward, "rewind": Rewind, + "lyrics": Lyrics, "tracks": Tracks, "effects": Effects } @@ -476,14 +502,14 @@ class InteractiveController(discord.ui.View): if self.player.channel and self.player.is_user_join(interaction.user): retry_after = self.cooldown.update_rate_limit(interaction) if retry_after: - raise ButtonOnCooldown(retry_after) + raise views.ButtonOnCooldown(retry_after) return True else: await func.send(interaction, "notInChannel", interaction.user.mention, self.player.channel.mention, ephemeral=True) return False async def on_error(self, interaction: discord.Interaction, error: Exception, item: discord.ui.Item): - if isinstance(error, ButtonOnCooldown): + if isinstance(error, views.ButtonOnCooldown): sec = int(error.retry_after) await interaction.response.send_message(f"You're on cooldown for {sec} second{'' if sec == 1 else 's'}!", ephemeral=True)