From 091496099acf91f7cf6d651997fbc625cfeeb2b0 Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Wed, 12 Apr 2023 17:16:03 +0800 Subject: [PATCH] Add custom embed --- addons/settings.py | 30 +++++++++++++++++++++- langs/CH.json | 4 --- langs/DE.json | 4 --- langs/EN.json | 4 --- langs/JP.json | 4 --- langs/KO.json | 4 --- settings Example.json | 32 +++++++++++++++++++++--- views/controller.py | 2 +- voicelink/__init__.py | 3 ++- voicelink/player.py | 58 ++++++++++++++++++++++++++++++++----------- 10 files changed, 104 insertions(+), 41 deletions(-) diff --git a/addons/settings.py b/addons/settings.py index f0f0bc3..e2d52ac 100644 --- a/addons/settings.py +++ b/addons/settings.py @@ -13,7 +13,35 @@ class Settings: self.emoji_source_raw = settings.get("emoji_source_raw", {}) self.cooldowns_settings = settings.get("cooldowns", {}) self.aliases_settings = settings.get("aliases", {}) - self.controller_settings = settings.get("controller", [["back", "resume", "skip", {"stop": "red"}, "add"], ["tracks"]]) + self.controller = settings.get("default_controller", + { + "embeds": { + "active": { + "description": "**Now Playing: ```[@@track_name@@]```\nLink: [Click Me](@@track_url@@) | Requester: @@requester@@ | DJ: @@dj@@**", + "footer": { + "text": "Queue Length: @@queue_length@@ | Duration: @@duration@@ | Volume: @@volume@@% {{loop_mode!=Off ?? | Repeat: @@loop_mode@@}}", + }, + "image": "@@track_thumbnail@@", + "author": { + "name": "Music Controller | @@channel_name@@", + "icon_url": "@@bot_icon@@" + }, + "color": "@@default_embed_color@@" + }, + "inactive": { + "header": { + "title": "There are no songs playing right now" + }, + "description": "[Support](@@server_invite_link@@) | [Invite](@@invite_link@@) | [Questionnaire](https://forms.gle/Qm8vjBfg2kp13YGD7)", + "image": "https://i.imgur.com/dIFBwU7.png", + "color": "@@default_embed_color@@" + } + }, + "default_buttons": [ + ["back", "resume", "skip", {"stop": "red"}, "add"], + ["tracks"] + ] + }) self.lyrics_platform = settings.get("lyrics_platform", "A_ZLyrics").lower() self.ipc_server = settings.get("ipc_server", { "host": "127.0.0.1", diff --git a/langs/CH.json b/langs/CH.json index 176801c..f32a6b6 100644 --- a/langs/CH.json +++ b/langs/CH.json @@ -106,10 +106,6 @@ "playlistrepeated": "您的播放列表中已經有相同的曲目!", "playlistAdded": "❤️ 將 **{0}** 添加到 {1} 的播放列表 [`{2}`]!", - "playerAuthor": "音樂控制器 | {0}", - "playerDesc": "**現在播放: ```[{0}]```\n鏈接: [點擊我]({1}) | 請求者: {2} | DJ: {3}**", - "playerFooter": "隊列長度: {0} | 時長: {1} | 音量: {2}% {3}", - "playerFooter2": "| 重複: {0}", "playerDropdown": "選擇要跳到的歌曲...", "buttonBack": "後退", diff --git a/langs/DE.json b/langs/DE.json index 213fae0..226c27a 100644 --- a/langs/DE.json +++ b/langs/DE.json @@ -106,10 +106,6 @@ "playlistrepeated": "Es gibt bereits denselben Titel in Ihrer Playlist!", "playlistAdded": "❤️ **{0}** zur Playlist [`{2}`] von {1} hinzugefügt!", - "playerAuthor": "Musik-Controller | {0}", - "playerDesc": "**Läuft gerade: ```[{0}]```\nLink: [Klick mich]({1}) | Anforderer: {2} | DJ: {3}**", - "playerFooter": "Warteschlangelänge: {0} | Dauer: {1} | Lautstärke: {2}% {3}", - "playerFooter2": "| Wiederholen: {0}", "playerDropdown": "Wählen Sie einen Song aus, zudem Sie springen möchten...", "buttonBack": "Zurück", diff --git a/langs/EN.json b/langs/EN.json index 20c72ba..e00adea 100644 --- a/langs/EN.json +++ b/langs/EN.json @@ -106,10 +106,6 @@ "playlistrepeated": "There is already the same track in your playlist!", "playlistAdded": "❤️ Added **{0}** into {1}'s playlist [`{2}`]!", - "playerAuthor": "Music Controller | {0}", - "playerDesc": "**Now Playing: ```[{0}]```\nLink: [Click Me]({1}) | Requester: {2} | DJ: {3}**", - "playerFooter": "Queue Length: {0} | Duration: {1} | Volume: {2}% {3}", - "playerFooter2": "| Repeat: {0}", "playerDropdown": "Select a song to skip to ...", "buttonBack": "Back", diff --git a/langs/JP.json b/langs/JP.json index ab9cda6..d2b1a87 100644 --- a/langs/JP.json +++ b/langs/JP.json @@ -106,10 +106,6 @@ "playlistrepeated": "プレイリストにはすでに同じトラックがあります!", "playlistAdded": "❤️ {1}のプレイリスト[`{2}`]に** {0} **を追加しました!", - "playerAuthor": "ミュージックコントローラー | {0}", - "playerDesc": "**再生中: ```[{0}]```\nリンク: [クリックしてください]({1}) | リクエスター: {2} | DJ: {3}**", - "playerFooter": "キューの長さ: {0} | 間隔: {1} | 音量: {2}% {3}", - "playerFooter2": "| 繰り返す: {0}", "playerDropdown": "スキップする曲を選択してください...", "buttonBack": "戻る", diff --git a/langs/KO.json b/langs/KO.json index d5588f9..f0df06e 100644 --- a/langs/KO.json +++ b/langs/KO.json @@ -106,10 +106,6 @@ "playlistrepeated": "재생 목록에 이미 같은 트랙이 있습니다!", "playlistAdded": "❤️ **{0}**을 {1}의 재생목록 [`{2}`]에 추가했습니다!", - "playerAuthor": "음악 컨트롤러 | {0}", - "playerDesc": "**지금 재생 중: ```[{0}]```\n링크: [클릭 해주세요]({1}) | 요청자: {2} | DJ: {3}**", - "playerFooter": "대기열 길이: {0} | 지속: {1} | 무게: {2}% {3}", - "playerFooter2": "| 반복하다: {0}", "playerDropdown": "건너뛸 노래 선택 ...", "buttonBack": "뒤", diff --git a/settings Example.json b/settings Example.json index 5bb6bb8..4070c2e 100644 --- a/settings Example.json +++ b/settings Example.json @@ -33,10 +33,34 @@ "reddit": "<:reddit:996007566863773717>", "tiktok": "<:tiktok:996007689798811698>" }, - "controller": [ - ["back", "resume", "skip", {"stop": "red"}, "add"], - ["tracks"] - ], + "default_controller": { + "embeds": { + "active": { + "description": "**Now Playing: ```[@@track_name@@]```\nLink: [Click Me](@@track_url@@) | Requester: @@requester@@ | DJ: @@dj@@**", + "footer": { + "text": "Queue Length: @@queue_length@@ | Duration: @@duration@@ | Volume: @@volume@@% {{loop_mode!=Off ?? | Repeat: @@loop_mode@@}}" + }, + "image": "@@track_thumbnail@@", + "author": { + "name": "Music Controller | @@channel_name@@", + "icon_url": "@@bot_icon@@" + }, + "color": "@@default_embed_color@@" + }, + "inactive": { + "header": { + "title": "There are no songs playing right now" + }, + "description": "[Support](@@server_invite_link@@) | [Invite](@@invite_link@@) | [Questionnaire](https://forms.gle/Qm8vjBfg2kp13YGD7)", + "image": "https://i.imgur.com/dIFBwU7.png", + "color": "@@default_embed_color@@" + } + }, + "default_buttons": [ + ["back", "resume", "skip", {"stop": "red"}, "add"], + ["tracks"] + ] + }, "cooldowns": { "connect": [2, 30], "playlist view": [1, 30] diff --git a/views/controller.py b/views/controller.py index c1d3ebc..4f2dcb4 100644 --- a/views/controller.py +++ b/views/controller.py @@ -335,7 +335,7 @@ class InteractiveController(discord.ui.View): super().__init__(timeout=None) self.player = player - for row, btnRow in enumerate(func.settings.controller_settings): + for row, btnRow in enumerate(func.settings.controller.get("default_buttons")): for btn in btnRow: color = "" if isinstance(btn, Dict): diff --git a/voicelink/__init__.py b/voicelink/__init__.py index e2eb446..c7fba0e 100644 --- a/voicelink/__init__.py +++ b/voicelink/__init__.py @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = "0.9" +__version__ = "1.0" __author__ = 'Vocard Development, Choco' __license__ = "MIT" __copyright__ = "Copyright 2023 (c) Vocard Development, Choco" @@ -34,3 +34,4 @@ from .objects import * from .player import Player from .pool import * from .queue import * +from placeholders import Placeholders diff --git a/voicelink/player.py b/voicelink/player.py index 8523f91..078a5a1 100644 --- a/voicelink/player.py +++ b/voicelink/player.py @@ -57,6 +57,7 @@ from .filters import Filter, Filters from .objects import Track from .pool import Node, NodePool from .queue import Queue, FairQueue +from .placeholders import Placeholders from random import shuffle class Player(VoiceProtocol): @@ -365,21 +366,50 @@ class Player(VoiceProtocol): self.updating = False async def build_embed(self): - track = self.current - - if not track: - embed=Embed(title=self.get_msg("noTrackPlaying"), description=f"[Vote](https://top.gg/bot/605618911471468554/vote/) | [Support]({func.settings.invite_link}) | [Invite](https://discord.com/oauth2/authorize?client_id=605618911471468554&permissions=2184260928&scope=bot%20applications.commands) | [Questionnaire](https://forms.gle/UqeeEv4GEdCq9hi3A)", color=func.settings.embed_color) - embed.set_image(url='https://i.imgur.com/dIFBwU7.png') - + if self.current: + raw = func.settings.controller.get("embeds", {}).get("active") else: - try: - embed = Embed(color=func.settings.embed_color) - embed.set_author(name=self.get_msg("playerAuthor").format(self.channel.name), icon_url=self.client.user.avatar.url) - embed.description = self.get_msg("playerDesc").format(track.title, track.uri, (track.requester.mention if track.requester else "<@605618911471468554>"), (f"<@&{self.settings['dj']}>" if self.settings.get('dj') else f"{self.dj.mention}")) - embed.set_image(url=track.thumbnail if track.thumbnail else "https://cdn.discordapp.com/attachments/674788144931012638/823086668445384704/eq-dribbble.gif") - embed.set_footer(text=self.get_msg("playerFooter").format(self.queue.count, (self.get_msg("live") if track.is_stream else func.time(track.length)), self.volume, self.get_msg("playerFooter2").format(self.queue.repeat.capitalize()) if self.queue._repeat else "")) - except: - embed = Embed(description=self.get_msg("missingTrackInfo"), color=func.settings.embed_color) + raw = func.settings.controller.get("embeds", {}).get("inactive") + + if not raw: + return + + ph = Placeholders(self) + try: + embed = Embed() + if author := raw.get("author"): + embed.set_author( + name = ph.replace(author.get("name")), + url = ph.replace(author.get("url")), + icon_url = ph.replace(author.get("icon_url")) + ) + + if header := raw.get("header"): + embed.title = ph.replace(header.get("title")) + embed.url = ph.replace(header.get("url")) + + if fields := raw.get("fields", []): + for f in fields: + embed.add_field(name=ph.replace(f.get("name")), value=ph.replace(f.get("value"))) + + if footer := raw.get("footer"): + embed.set_footer( + text = ph.replace(footer.get("text")), + icon_url = ph.replace(footer.get("icon_url")) + ) + + if thumbnail := raw.get("thumbnail"): + embed.set_thumbnail(url = ph.replace(thumbnail)) + + if image := raw.get("image"): + embed.set_image(url = ph.replace(image)) + + embed.description = ph.replace(raw.get("description")) + embed.color = int(ph.replace(raw.get("color"))) + + except: + embed = Embed(description=self.get_msg("missingTrackInfo"), color=func.settings.embed_color) + return embed async def is_position_fresh(self):