From b0ff4fb6c3d4ab4228845065daaab3a47392143f Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:27:37 +0800 Subject: [PATCH] Added voice status (#33) * Updated the placeholder name for clarity * Added voice status * Dump bot version * Added global template for voice status * Added new placeholder * Updated settings view --- addons/settings.py | 1 + cogs/settings.py | 20 ++++++++++++++++---- langs/CH.json | 11 +++++++---- langs/DE.json | 11 +++++++---- langs/EN.json | 11 +++++++---- langs/ES.json | 11 +++++++---- langs/JA.json | 11 +++++++---- langs/KO.json | 11 +++++++---- langs/RU.json | 11 +++++++---- langs/UA.json | 11 +++++++---- settings Example.json | 3 ++- update.py | 2 +- voicelink/placeholders.py | 24 +++++++++++++++++------- voicelink/player.py | 25 +++++++++++++++++++++++-- 14 files changed, 116 insertions(+), 47 deletions(-) diff --git a/addons/settings.py b/addons/settings.py index 0937fe3..7638101 100644 --- a/addons/settings.py +++ b/addons/settings.py @@ -27,6 +27,7 @@ class Settings: self.cooldowns_settings: Dict[str, List[int]] = settings.get("cooldowns", {}) self.aliases_settings: Dict[str, List[str]] = settings.get("aliases", {}) self.controller: Dict[str, Dict[str, Any]] = settings.get("default_controller", {}) + self.voice_status_template: str = settings.get("default_voice_status_template", "") self.lyrics_platform: str = settings.get("lyrics_platform", "A_ZLyrics").lower() self.ipc_client: Dict[str, Union[str, bool, int]] = settings.get("ipc_client", {}) self.version: str = settings.get("version", "") \ No newline at end of file diff --git a/cogs/settings.py b/cogs/settings.py index 0cc3178..543089f 100644 --- a/cogs/settings.py +++ b/cogs/settings.py @@ -134,17 +134,18 @@ class Settings(commands.Cog, name="settings"): "Show all the bot settings in your server." settings = await get_settings(ctx.guild.id) - texts = await get_lang(ctx.guild.id, "settingsMenu", "settingsTitle", "settingsValue", "settingsTitle2", "settingsValue2", "settingsPermTitle", "settingsPermValue") + texts = await get_lang(ctx.guild.id, "settingsMenu", "settingsTitle", "settingsValue", "settingsTitle2", "settingsValue2", "settingsTitle3", "settingsPermTitle", "settingsPermValue") embed = discord.Embed(color=func.settings.embed_color) embed.set_author(name=texts[0].format(ctx.guild.name), icon_url=self.bot.user.display_avatar.url) if ctx.guild.icon: embed.set_thumbnail(url=ctx.guild.icon.url) + dj_role = ctx.guild.get_role(settings.get('dj', 0)) embed.add_field(name=texts[1], value=texts[2].format( - settings.get('prefix', func.settings.bot_prefix) or "None", + settings.get('prefix', func.settings.bot_prefix) or 'None', settings.get('lang', 'EN'), settings.get('controller', True), - f"<@&{settings['dj']}>" if 'dj' in settings else '`None`', + dj_role.name if dj_role else 'None', settings.get('votedisable', False), settings.get('24/7', False), settings.get('volume', 100), @@ -157,8 +158,11 @@ class Settings(commands.Cog, name="settings"): settings.get("duplicateTrack", True) )) + if stage_template := settings.get("stage_announce_template"): + embed.add_field(name=texts[5], value=f"```{stage_template}```", inline=False) + perms = ctx.guild.me.guild_permissions - embed.add_field(name=texts[5], value=texts[6].format( + embed.add_field(name=texts[6], value=texts[7].format( status_icon(perms.administrator), status_icon(perms.manage_guild), status_icon(perms.manage_channels), @@ -235,6 +239,14 @@ class Settings(commands.Cog, name="settings"): await update_settings(ctx.guild.id, {"$set": {'controller_msg': toggle}}) await send(ctx, 'toggleControllerMsg', await get_lang(ctx.guild.id, "enabled" if toggle else "disabled")) + @settings.command(name="stageannounce", aliases=get_aliases("stageannounce")) + @commands.has_permissions(manage_guild=True) + @commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild) + async def stageannounce(self, ctx: commands.Context, template: str = None): + """Customize the channel topic template""" + await update_settings(ctx.guild.id, {"$set": {'stage_announce_template': template}}) + await send(ctx, "SetStageAnnounceTemplate") + @app_commands.command(name="debug") async def debug(self, interaction: discord.Interaction): if interaction.user.id not in func.settings.bot_access_user: diff --git a/langs/CH.json b/langs/CH.json index f6d0901..d096e80 100644 --- a/langs/CH.json +++ b/langs/CH.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "現在您已從音樂控制器 `{0}` 消息。", "settingsMenu": "伺服器設置 | {0}", "settingsTitle": "❤️ 基本資訊:", - "settingsValue": "前綴:`{0}`\n語言:`{1}`\n啟用音樂控制器:`{2}`\nDJ 角色:{3}\n投票繞過:`{4}`\n24/7:`{5}`\n默認音量:`{6}%`\n播放時間:`{7}`", + "settingsValue": "```前綴:{0}\n語言:{1}\n音樂控制器:{2}\nDJ 角色:@{3}\n投票繞過:{4}\n24/7:{5}\n默認音量:{6}%\n播放時間:{7}```", "settingsTitle2": "🔗 隊列資訊:", - "settingsValue2": "隊列模式:`{0}`\n最大歌曲數:`{1}`\n允許重複曲目:`{2}`", + "settingsValue2": "```隊列模式:{0}\n最大歌曲數:{1}\n允許重複曲目:{2}```", + "settingsTitle3": "🎤 語音狀態資訊:", "settingsPermTitle": "✨ 權限:", - "settingsPermValue": "{0} 管理員\n{1} 管理伺服器\n{2} 管理頻道\n{3} 管理訊息", + "settingsPermValue": "```{0} 管理員\n{1} 管理伺服器\n{2} 管理頻道\n{3} 管理訊息```", "pingTitle1": "機器人資訊:", "pingTitle2": "播放器信息:", "pingfield1": "```分片 ID: {0}/{1}\n分片延遲: {2:.3f}s {3}\n區域: {4}```", @@ -183,5 +184,7 @@ "deocdeError": "解碼文件時出現問題!", "invalidStartTime": "無效的開始時間! 時間必須在 `00:00` 和 `{0}` 之間。", "invalidEndTime": "無效的結束時間! 時間必須在 `00:00` 和 `{0}` 之間。", - "invalidTimeOrder": "結束時間不能小於或等於開始時間。" + "invalidTimeOrder": "結束時間不能小於或等於開始時間。", + + "SetStageAnnounceTemplate": "完成!從現在開始,像您現在的語音狀態將根據您的模板命名。您應該在幾秒鐘內看到它更新。" } \ No newline at end of file diff --git a/langs/DE.json b/langs/DE.json index f47958c..37bd9a0 100644 --- a/langs/DE.json +++ b/langs/DE.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "Sie haben jetzt `{0}` Nachrichten vom Musik-Controller.", "settingsMenu": "Servereinstellungen | {0}", "settingsTitle": "❤️ Grundlegende Informationen:", - "settingsValue": "Präfix: `{0}`\nSprache: `{1}`\nMusik-Controller aktivieren: `{2}`\nDJ-Rolle: {3}\nAbstimmungsumgehung: `{4}`\nRund um die Uhr: `{5}`\nStandardvolumen: `{6} %`\nSpielzeit: `{7}`", + "settingsValue": "```Präfix: {0}`\nSprache: {1}\nMusik-Controller: {2}\nDJ-Rolle: @{3}\nAbstimmungsumgehung: {4}\nRund um die Uhr: {5}\nStandardvolumen: {6}%\nSpielzeit: {7}```", "settingsTitle2": "🔗 Warteschlangeninformationen:", - "settingsValue2": "Warteschlangenmodus: `{0}`\nMax Lied: `{1}`\nDoppelte Spur zulassen: `{2}`", + "settingsValue2": "```Warteschlangenmodus: {0}\nMax Lied: {1}\nDoppelte Spur zulassen: {2}```", + "settingsTitle3": "🎤 Sprachstatusinfo:", "settingsPermTitle": "✨ Berechtigungen:", - "settingsPermValue": "{0} Administrator\n{1} Gilde verwalten\n{2} Kanal verwalten\n{3} Manage_Messages", + "settingsPermValue": "```{0} Administrator\n{1} Gilde verwalten\n{2} Kanal verwalten\n{3} Manage_Messages```", "pingTitle1": "Bot-Info:", "pingTitle2": "Spielerinfo:", "pingfield1": "```Shard-ID: {0}/{1}\nShard-Latenz: {2:.3f} s {3}\nRegion: {4}```", @@ -183,5 +184,7 @@ "deocdeError": "Beim Dekodieren der Datei ist etwas schief gelaufen!", "invalidStartTime": "Ungültiger Startzeit! Die Zeit muss innerhalb von `00:00` und `{0}` liegen.", "invalidEndTime": "Ungültiger Endzeit! Die Zeit muss innerhalb von `00:00` und `{0}` liegen.", - "invalidTimeOrder": "Der Endzeit darf nicht kleiner oder gleich dem Startzeit sein." + "invalidTimeOrder": "Der Endzeit darf nicht kleiner oder gleich dem Startzeit sein.", + + "SetStageAnnounceTemplate": "Fertig! Ab sofort wird der Sprachstatus wie der, in dem Sie sich gerade befinden, gemäß Ihrer Vorlage benannt. Sie sollten in wenigen Sekunden eine Aktualisierung sehen." } \ No newline at end of file diff --git a/langs/EN.json b/langs/EN.json index 5a8e9ab..00dad17 100644 --- a/langs/EN.json +++ b/langs/EN.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "Now you have `{0}` messages from the music controller.", "settingsMenu": "Server Settings | {0}", "settingsTitle": "❤️ Basic Info:", - "settingsValue": "Prefix: `{0}`\nLanguage: `{1}`\nEnable Music Controller: `{2}`\nDJ Role: {3}\nVote Bypass: `{4}`\n24/7: `{5}`\nDefault Volume: `{6}%`\nPlay Time: `{7}`", + "settingsValue": "```Prefix: {0}\nLanguage: {1}\nMusic Controller: {2}\nDJ Role: @{3}\nVote Bypass: {4}\n24/7: {5}\nDefault Volume: {6}%\nPlay Time: {7}```", "settingsTitle2": "🔗 Queue info:", - "settingsValue2": "Queue Mode: `{0}`\nMax Song: `{1}`\nAllow Duplicate Track: `{2}`", + "settingsValue2": "```Queue Mode: {0}\nMax Song: {1}\nDuplicate Track: {2}```", + "settingsTitle3": "🎤 Voice Status Info:", "settingsPermTitle": "✨ Permissions:", - "settingsPermValue": "{0} Administrator\n{1} Manage_Guild\n{2} Manage_Channel\n{3} Manage_Messages", + "settingsPermValue": "```{0} Administrator\n{1} Manage_Guild\n{2} Manage_Channel\n{3} Manage_Messages```", "pingTitle1": "Bot Info:", "pingTitle2": "Player Info:", "pingfield1": "```Shard ID: {0}/{1}\nShard Latency: {2:.3f}s {3}\nRegion: {4}```", @@ -183,5 +184,7 @@ "deocdeError": "Something went wrong while decoding the file!", "invalidStartTime": "Invalid start time, it must be between `00:00` and `{0}`", "invalidEndTime": "Invalid end time, it must be between `00:00` and `{0}`", - "invalidTimeOrder": "End time cannot be less than or equal to start time" + "invalidTimeOrder": "End time cannot be less than or equal to start time", + + "SetStageAnnounceTemplate": "Done! From now on, voice status like the one you're in now will be named according to your template. You should see it update in a few seconds." } \ No newline at end of file diff --git a/langs/ES.json b/langs/ES.json index 1b95d60..f2a3fcd 100644 --- a/langs/ES.json +++ b/langs/ES.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "Ahora tiene `{0}` mensajes del controlador de música.", "settingsMenu": "Configuración del servidor | {0}", "settingsTitle": "❤️ Información básica:", - "settingsValue": "Prefijo: `{0}`\nIdioma: `{1}`\nHabilitar controlador de música: `{2}`\nRol de DJ: {3}\nBypass de votación: `{4}`\n24/7: `{5}`\nVolumen predeterminado: `{6}%`\nTiempo de reproducción: `{7}`", + "settingsValue": "```Prefijo: {0}\nIdioma: {1}\nHabilitar controlador de música: {2}\nRol de DJ: @{3}\nBypass de votación: {4}\n24/7: {5}\nVolumen predeterminado: {6}%\nTiempo de reproducción: {7}```", "settingsTitle2": "🔗 Información de la cola:", - "settingsValue2": "Modo de cola: `{0}`\nMáximo de canciones: `{1}`\nPermitir pistas duplicadas: `{2}`", + "settingsValue2": "```Modo de cola: {0}\nMáximo de canciones: {1}\nPermitir pistas duplicadas: {2}```", + "settingsTitle3": "🎤 Información del estado de voz:", "settingsPermTitle": "✨ Permisos:", - "settingsPermValue": "{0} Administrador\n{1} Administrar servidor\n{2} Administrar canal\n{3} Administrar mensajes", + "settingsPermValue": "```{0} Administrador\n{1} Administrar servidor\n{2} Administrar canal\n{3} Administrar mensajes```", "pingTitle1": "Información del bot:", "pingTitle2": "Información del reproductor:", "pingfield1": "```ID de fragmento: {0}/{1}\nLatencia de fragmento: {2:.3f}s {3}\nRegión: {4}```", @@ -183,5 +184,7 @@ "deocdeError": "¡Algo salió mal al decodificar el archivo!", "invalidStartTime": "Tiempo de inicio inválido! El tiempo debe estar entre `00:00` y `{0}`.", "invalidEndTime": "Tiempo de finalización inválido! El tiempo debe estar entre `00:00` y `{0}`.", - "invalidTimeOrder": "El tiempo final no puede ser menor o igual que el tiempo de inicio." + "invalidTimeOrder": "El tiempo final no puede ser menor o igual que el tiempo de inicio.", + + "SetStageAnnounceTemplate": "¡Hecho! A partir de ahora, el estado de voz como el que tienes ahora se nombrará según tu plantilla. Deberías verlo actualizarse en unos segundos." } \ No newline at end of file diff --git a/langs/JA.json b/langs/JA.json index 35d36fd..4f008f6 100644 --- a/langs/JA.json +++ b/langs/JA.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "現在、音楽コントローラーから `{0}` 件のメッセージがあります。", "settingsMenu": "サーバー設定| {0}", "settingsTitle": "❤️ 基本情報:", - "settingsValue": "プレフィックス:「{0}」\n言語:「{1}」\n音楽コントローラーを有効にする:「{2}」\nDJロール:{3}\n投票バイパス:「{4}」\n24/7:「{5}」\nデフォルトボリューム:「{6}%」\n再生時間:「{7}」", + "settingsValue": "```プレフィックス:{0}\n言語:{1}\n音楽コントローラーを有効にする:{2}\nDJロール:@{3}\n投票バイパス:{4}\n24/7:{5}\nデフォルトボリューム:{6}%\n再生時間:{7}```", "settingsTitle2": "🔗 キュー情報:", - "settingsValue2": "キューモード:「{0}」\n最大曲数:「{1}」\n重複トラックを許可する:「{2}」", + "settingsValue2": "```キューモード:{0}\n最大曲数:{1}\n重複トラックを許可する:{2}```", + "settingsTitle3": "🎤 音声ステータス情報:", "settingsPermTitle": "✨ 権限:", - "settingsPermValue": "{0} 管理者\n{1} ギルド管理\n{2} チャンネル管理\n{3} メッセージ管理", + "settingsPermValue": "```{0} 管理者\n{1} ギルド管理\n{2} チャンネル管理\n{3} メッセージ管理```", "pingTitle1": "ボット情報:", "pingTitle2": "プレーヤー情報:", "pingfield1": "```シャードID:{0}/{1}\nシャードレイテンシ:{2:.3f}s {3}\nリージョン:{4}```", @@ -183,5 +184,7 @@ "deocdeError": "ファイルのデコード中に問題が発生しました!", "invalidStartTime": "無効な開始時間!時間は `00:00` と `{0}` の間に設定する必要があります。", "invalidEndTime": "無効な終了時間!時間は `00:00` と `{0}` の間に設定する必要があります。", - "invalidTimeOrder": "終了時間は開始時間より大きくない必要があります。" + "invalidTimeOrder": "終了時間は開始時間より大きくない必要があります。", + + "SetStageAnnounceTemplate": "完了!これからは、今いるボイスステータスがあなたのテンプレートに従って名前が付けられます。数秒以内に更新されるのを見ることができるはずです。" } \ No newline at end of file diff --git a/langs/KO.json b/langs/KO.json index 709442f..ccb7fc2 100644 --- a/langs/KO.json +++ b/langs/KO.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "이제 음악 컨트롤러로부터 `{0}` 메시지가 있습니다.", "settingsMenu": "서버 설정 | {0}", "settingsTitle": "❤️ 기본 정보:", - "settingsValue": "접두사: `{0}`\n언어: `{1}`\n음악 컨트롤러 사용: `{2}`\nDJ 역할: {3}\n투표 우회: `{4}`\n24/7 모드: `{5}`\n기본 볼륨: `{6}%`\n재생 시간: `{7}`", + "settingsValue": "```접두사: {0}\n언어: {1}\n음악 컨트롤러 사용: {2}\nDJ 역할: @{3}\n투표 우회: {4}\n24/7 모드: {5}\n기본 볼륨: {6}%\n재생 시간: {7}```", "settingsTitle2": "🔗 대기열 정보:", - "settingsValue2": "큐 모드: `{0}`\n최대 노래: `{1}`\n중복된 트랙 허용: `{2}`", + "settingsValue2": "```큐 모드: {0}\n최대 노래: {1}\n중복된 트랙 허용: {2}```", + "settingsTitle3": "🎤 음성 상태 정보:", "settingsPermTitle": "✨ 권한:", - "settingsPermValue": "{0} 관리자\n{1} 서버 관리\n{2} 채널 관리\n{3} 메시지 관리", + "settingsPermValue": "```{0} 관리자\n{1} 서버 관리\n{2} 채널 관리\n{3} 메시지 관리```", "pingTitle1": "봇 정보:", "pingTitle2": "플레이어 정보:", "pingfield1": "```쉬드 ID: {0}/{1}\n쉬드 대기 시간: {2:.3f}s {3}\n지역: {4}```", @@ -183,5 +184,7 @@ "deocdeError": "파일 디코딩 중 문제가 발생했습니다!", "invalidStartTime": "효력 없는 시작 시간! 시간은 `00:00` 과 `{0}` 사이에 설정해야 합니다.", "invalidEndTime": "효력 없는 종료 시간! 시간은 `00:00` 과 `{0}` 사이에 설정해야 합니다.", - "invalidTimeOrder": "종료 시간은 시작 시간보다 클수 있어야 합니다." + "invalidTimeOrder": "종료 시간은 시작 시간보다 클수 있어야 합니다.", + + "SetStageAnnounceTemplate": "완료! 이제부터 지금 있는 음성 상태는 귀하의 템플릿에 따라 이름이 지정됩니다. 몇 초 후에 업데이트되는 것을 볼 수 있을 것입니다." } \ No newline at end of file diff --git a/langs/RU.json b/langs/RU.json index 8b8aca0..636794d 100644 --- a/langs/RU.json +++ b/langs/RU.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "Теперь у вас `{0}` сообщения от контроллера музыки.", "settingsMenu": "Настройки сервера | {0}", "settingsTitle": "❤️ Основная информация:", - "settingsValue": "Префикс: `{0}`\nЯзык: `{1}`\nВключить контроллер музыки: `{2}`\nDJ роль: {3}\nОбход голосования: `{4}`\n24/7: `{5}`\nГромкость по умолчанию: `{6}%`\nВремя проигрывания: `{7}`", + "settingsValue": "```Префикс: {0}\nЯзык: {1}\nВключить контроллер музыки: {2}\nDJ роль: @{3}\nОбход голосования: {4}\n24/7: {5}\nГромкость по умолчанию: {6}%\nВремя проигрывания: {7}```", "settingsTitle2": "🔗 Информация об очереди:", - "settingsValue2": "Режим очереди: `{0}`\nМаксимальное количество песен: `{1}`\nРазрешить дублирование треков: `{2}`", + "settingsValue2": "```Режим очереди: {0}\nМаксимальное количество песен: {1}\nРазрешить дублирование треков: {2}```", + "settingsTitle3": "🎤 Информация о состоянии голоса:", "settingsPermTitle": "✨ Права:", - "settingsPermValue": "{0} Администратор\n{1} Управление_Сервером\n{2} Управление_Каналом\n{3} Управление_Сообщениями", + "settingsPermValue": "```{0} Администратор\n{1} Управление_Сервером\n{2} Управление_Каналом\n{3} Управление_Сообщениями```", "pingTitle1": "Информация о боте:", "pingTitle2": "Информация о плеере:", "pingfield1": "```ID Шарда: {0}/{1}\nЗадержка Шарда: {2:.3f}s {3}\nРегион: {4}```", @@ -182,5 +183,7 @@ "deocdeError": "Что-то пошло не так при декодировании файла!", "invalidStartTime": "Hевозможное время начала! Вход времени должен быть внутри `00:00` и `{0}`.", "invalidEndTime": "Невозможное время конца! Вход времени должен быть внутри `00:00` и `{0}`.", - "invalidTimeOrder": "Время конца не может быть меньше или равно времени начала." + "invalidTimeOrder": "Время конца не может быть меньше или равно времени начала.", + + "SetStageAnnounceTemplate": "Готово! С этого момента статус голоса, как тот, в котором вы находитесь сейчас, будет называться в соответствии с вашим шаблоном. Вы должны увидеть обновление через несколько секунд." } \ No newline at end of file diff --git a/langs/UA.json b/langs/UA.json index abf0173..b31b613 100644 --- a/langs/UA.json +++ b/langs/UA.json @@ -23,11 +23,12 @@ "toggleControllerMsg": "Тепер у вас `{0}` повідомлення від контролера музики.", "settingsMenu": "Налаштування сервера | {0}", "settingsTitle": "❤️ Основна інформація:", - "settingsValue": "Префікс: `{0}`\nМова: `{1}`\nУвімкнути контролер музики: `{2}`\nDJ роль: {3}\nОбхід голосування: `{4}`\n24/7: `{5}`\nГромкість за замовчуванням: `{6}%`\nЧас програвання: `{7}`", + "settingsValue": "```Префікс: {0}\nМова: {1}\nУвімкнути контролер музики: {2}\nDJ роль: {3}\nОбхід голосування: {4}\n24/7: {5}\nГромкість за замовчуванням: {6}%\nЧас програвання: {7}```", "settingsTitle2": "🔗 Інформація про чергу:", - "settingsValue2": "Режим черги: `{0}`\nМаксимальна кількість пісень: `{1}`\nДозволити дублювання треків: `{2}`", + "settingsValue2": "```Режим черги: {0}\nМаксимальна кількість пісень: {1}\nДозволити дублювання треків: {2}```", + "settingsTitle3": "🎤 Інформація про стан голосу:", "settingsPermTitle": "✨ Права:", - "settingsPermValue": "{0} Адміністратор\n{1} Керування_Сервером\n{2} Керування_Каналом\n{3} Керування_Сообщениями", + "settingsPermValue": "```{0} Адміністратор\n{1} Керування_Сервером\n{2} Керування_Каналом\n{3} Керування_Сообщениями```", "pingTitle1": "Інформація про бота:", "pingTitle2": "Інформація про плеєр:", "pingfield1": "````ID Шарда: {0}/{1}\nЗатримка Шарда: {2:.3f}s {3}\nРегіон: {4}````", @@ -182,5 +183,7 @@ "deocdeError": "Щось пішло не так під час декодування файлу!", "invalidStartTime": "Недійснений час початку! Час має бути в межах `00:00` та `{0}`.", "invalidEndTime": "Недійснений час закінчення! Час має бути в межах `00:00` та `{0}`.", - "invalidTimeOrder": "Час закінчення не може бути меншим або рівним часу початку." + "invalidTimeOrder": "Час закінчення не може бути меншим або рівним часу початку.", + + "SetStageAnnounceTemplate": "Готово! Відтепер статус голосу, як той, в якому ви зараз перебуваєте, буде називатися відповідно до вашого шаблону. Ви повинні побачити оновлення через кілька секунд." } \ No newline at end of file diff --git a/settings Example.json b/settings Example.json index 21a6d12..d9d60b2 100644 --- a/settings Example.json +++ b/settings Example.json @@ -87,7 +87,7 @@ "default_controller": { "embeds": { "active": { - "description": "**Now Playing: ```[@@track_name@@]```\nLink: [Click Me](@@track_url@@) | Requester: @@requester@@ | DJ: @@dj@@**", + "description": "**Now Playing: ```[@@track_name@@]```\nLink: [Click Me](@@track_url@@) | Requester: <#@@track_requester_id@@> | DJ: @@dj@@**", "footer": { "text": "Queue Length: @@queue_length@@ | Duration: @@track_duration@@ | Volume: @@volume@@% {{loop_mode != 'Off' ?? | Repeat: @@loop_mode@@}}" }, @@ -113,6 +113,7 @@ ], "disableButtonText": false }, + "default_voice_status_template": "{{@@track_name@@ != 'None' ?? @@track_source_emoji@@ Now Playing: @@track_name@@ // Waiting for song requests}}", "cooldowns": { "connect": [2, 30], "playlist view": [1, 30] diff --git a/update.py b/update.py index f8334db..7f8d427 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.9b4" +__version__ = "v2.6.9b5" GITHUB_API_URL = "https://api.github.com/repos/ChocoMeow/Vocard/releases/latest" VOCARD_URL = "https://github.com/ChocoMeow/Vocard/archive/" diff --git a/voicelink/placeholders.py b/voicelink/placeholders.py index 3f5ab50..6ffcb70 100644 --- a/voicelink/placeholders.py +++ b/voicelink/placeholders.py @@ -32,9 +32,11 @@ class Placeholders: "track_duration": self.track_duration, "track_thumbnail": self.track_thumbnail, "track_color": self.track_color, - "requester": self.requester, - "requester_name": self.requester_name, - "requester_avatar": self.requester_avatar, + "track_requester_id": self.track_requester_id, + "track_requester_name": self.track_requester_name, + "track_requester_avatar": self.track_requester_avatar, + "track_source_name": self.track_source_name, + "track_source_emoji": self.track_source_emoji, "queue_length": self.queue_length, "volume": self.volume, "dj": self.dj, @@ -70,21 +72,29 @@ class Placeholders: return self.player.get_msg("live") if track.is_stream else func.time(track.length) @ensure_track - def requester(self, track: Track) -> str: - return track.requester.mention if track.requester else self.bot.user.mention + def track_requester_id(self, track: Track) -> str: + return str(track.requester.id if track.requester else self.bot.user.id) @ensure_track - def requester_name(self, track: Track) -> str: + def track_requester_name(self, track: Track) -> str: return track.requester.name if track.requester else self.bot.user.display_name @ensure_track - def requester_avatar(self, track: Track) -> str: + def track_requester_avatar(self, track: Track) -> str: return track.requester.display_avatar.url if track.requester else self.bot.user.display_avatar.url @ensure_track def track_color(self, track: Track) -> int: return int(func.get_source(track.source, "color"), 16) + @ensure_track + def track_source_name(self, track: Track) -> str: + return track.source + + @ensure_track + def track_source_emoji(self, track: Track) -> str: + return track.emoji + def track_thumbnail(self) -> str: if not self.player or not self.player.current: return "https://i.imgur.com/dIFBwU7.png" diff --git a/voicelink/player.py b/voicelink/player.py index e90aeb8..c12f9de 100644 --- a/voicelink/player.py +++ b/voicelink/player.py @@ -365,7 +365,9 @@ class Player(VoiceProtocol): if self.settings.get('controller', True): await self.invoke_controller() - + + await self.update_voice_status() + if self.is_ipc_connected: await self.send_ws({ "op": "trackUpdate", @@ -428,7 +430,7 @@ class Player(VoiceProtocol): "playTime": round(self.settings.get("playTime", 0) + ((timeNow - self.joinTime) / 60), 2) }} ) - + await self.update_voice_status(remove_status=True) if self.is_ipc_connected: await self.send_ws({"op": "playerClose"}) @@ -778,6 +780,25 @@ class Player(VoiceProtocol): return True return False + async def update_voice_status(self, remove_status: bool = False) -> None: + template = self.settings.get("stage_announce_template", func.settings.voice_status_template) + if not template or not self.channel: + return + + try: + rv = {key: func() if callable(func) else func for key, func in self._ph.variables.items()} + status = None if remove_status else self._ph.replace(text=template, variables=rv) + # if self.channel.status != status: + await self.channel.edit(status=status) + + except Exception as e: + self._logger.error( + f"Failed to update voice status in channel '{self.channel.name}' " + f"({self.channel.id}) for guild '{self.channel.guild}' " + f"({self.channel.guild.id})", + exc_info=e + ) + async def send_ws(self, payload, requester: Member = None): payload['guild_id'] = str(self.guild.id) if requester: