From 18a9cb3995f316bd91511599cfb2e2ad82b9080e Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Wed, 8 Mar 2023 12:13:13 +0800 Subject: [PATCH] Add prefix command and general code cleanup --- cogs/admin.py | 17 +++++++++++------ cogs/task.py | 2 +- function.py | 47 ++++++++++++++++++++++++----------------------- langs/CH.json | 3 ++- langs/DE.json | 3 ++- langs/EN.json | 3 ++- langs/JP.json | 3 ++- langs/KO.json | 3 ++- main.py | 35 ++++++++++++++++++++--------------- 9 files changed, 66 insertions(+), 50 deletions(-) diff --git a/cogs/admin.py b/cogs/admin.py index 897c7e8..0bee764 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -10,7 +10,6 @@ from discord import app_commands from discord.ext import commands from function import ( langs, - lang_guilds, update_settings, get_settings, get_lang, @@ -21,7 +20,6 @@ from function import ( ) from views import DebugModal, HelpView - class Admin(commands.Cog, name="settings"): def __init__(self, bot) -> None: self.bot = bot @@ -45,6 +43,14 @@ class Admin(commands.Cog, name="settings"): message = await ctx.send(embed=embed, view=view) view.response = message + @settings.command(name="prefix", aliases=get_aliases("prefix")) + @commands.has_permissions(manage_guild=True) + @commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild) + async def prefix(self, ctx: commands.Context, prefix: str): + "Change the default prefix for message commands." + update_settings(ctx.guild.id, {"prefix": prefix}) + await ctx.send(get_lang(ctx.guild.id, "setPrefix").format(ctx.prefix, prefix)) + @settings.command(name="language", aliases=get_aliases("language")) @commands.has_permissions(manage_guild=True) @commands.dynamic_cooldown(cooldown_check, commands.BucketType.guild) @@ -57,9 +63,8 @@ class Admin(commands.Cog, name="settings"): player, settings = self.get_settings(ctx) if player: player.lang = language - lang_guilds[ctx.guild.id] = language - update_settings(ctx.guild.id, {'lang': language}) + update_settings(ctx.guild.id, {'lang': language}) await ctx.send(get_lang(ctx.guild.id, 'changedLanguage').format(language)) @language.autocomplete('language') @@ -134,12 +139,12 @@ class Admin(commands.Cog, name="settings"): "Show all the bot settings in your server." player, settings = self.get_settings(ctx) embed = discord.Embed(color=embed_color) - embed.set_author(name=get_lang(ctx.guild.id, 'settingsMenu').format( - ctx.guild.name), icon_url=self.bot.user.display_avatar.url) + embed.set_author(name=get_lang(ctx.guild.id, 'settingsMenu').format(ctx.guild.name), icon_url=self.bot.user.display_avatar.url) if ctx.guild.icon: embed.set_thumbnail(url=ctx.guild.icon.url) embed.add_field(name=get_lang(ctx.guild.id, 'settingsTitle'), value=get_lang(ctx.guild.id, 'settingsValue').format( + settings.get('prefix', func.bot_prefix), settings.get('lang', 'EN'), settings.get('controller', True), f"<@&{settings['dj']}>" if 'dj' in settings else '`None`', diff --git a/cogs/task.py b/cogs/task.py index 6462fc0..ae5f504 100644 --- a/cogs/task.py +++ b/cogs/task.py @@ -55,7 +55,7 @@ class Task(commands.Cog): @tasks.loop(hours=12.0) async def cache_cleaner(self): - func.lang_guilds.clear() + func.guild_settings.clear() func.playlist_name.clear() errorFile = func.gen_report() diff --git a/function.py b/function.py index b0ec94b..2e88a2c 100644 --- a/function.py +++ b/function.py @@ -48,7 +48,7 @@ emoji_source_raw = {} #Stores all source emoji for track error_log = {} #Stores error that not a Voicelink Exception bot_access_user = [] #Stores bot access user id langs = {} #Stores all the languages in ./langs -lang_guilds = {} #Cache guild language +guild_settings = {} #Cache guild language local_langs = {} #Stores all the localization languages in ./local_langs playlist_name = {} #Cache the user's playlist name bot_prefix = "?" #The default bot prefix @@ -61,23 +61,29 @@ controller_settings = {} #Stores the layout of music controller nodes = {} #-------------- Vocard Functions -------------- -def get_settings(guildid:int): - settings = collection.find_one({"_id":guildid}) +def get_settings(guild_id:int): + settings = guild_settings.get(guild_id, None) if not settings: - collection.insert_one({"_id":guildid}) - return {} + settings = collection.find_one({"_id":guild_id}) + if not settings: + collection.insert_one({"_id":guild_id}) + settings = {} + guild_settings[guild_id] = settings return settings -def update_settings(guildid:int, data, mode="Set"): +def update_settings(guild_id:int, data: dict, mode="Set"): + settings = get_settings(guild_id) if mode == "Set": - collection.update_one({"_id":guildid}, {"$set":data}) + for key, value in data.items(): + if settings.get(key) != value: + guild_settings[guild_id][key] = value + collection.update_one({"_id":guild_id}, {"$set":data}) elif mode == "Delete": - collection.update_one({"_id":guildid}, {"$unset":data}) - elif mode == "Add": - collection.update_one({"_id":guildid}, {"$push":data}) - elif mode == "Remove": - collection.update_one({"_id":guildid}, {"$pull":data}) - return + for key, value in data.items(): + if settings.get(key) != value: + del guild_settings[guild_id][key] + collection.update_one({"_id":guild_id}, {"$unset":data}) + return def langs_setup(): for language in os.listdir(os.path.join(root_dir, "langs")): @@ -111,12 +117,8 @@ def settings_setup(): aliases_settings = rawSettings.get("aliases", {}) controller_settings = rawSettings.get("controller", [["back", "resume", "skip", {"stop": "red"}, "add"], ["tracks"]]) -def get_lang(guildid:int, key:str): - lang = lang_guilds.get(guildid) - if not lang: - settings = get_settings(guildid) - lang = lang_guilds[guildid] = settings.get('lang', 'EN') - +def get_lang(guild_id:int, key:str): + lang = get_settings(guild_id).get("lang", "EN") return langs.get(lang, langs["EN"])[key] async def requests_api(url: str): @@ -213,8 +215,7 @@ async def similar_track(player) -> bool: return False if tracks: - for track in tracks: - player.queue.put(track) + await player.add_track(tracks) return True return False @@ -263,8 +264,8 @@ def emoji_source(emoji:str): def gen_report() -> Optional[discord.File]: if error_log: errorText = "" - for guildId, error in error_log.items(): - errorText += f"Guild ID: {guildId}\n" + "-" * 30 + "\n" + for guild_id, error in error_log.items(): + errorText += f"Guild ID: {guild_id}\n" + "-" * 30 + "\n" for index, (key, value) in enumerate(error.items() , start=1): errorText += f"Error No: {index}, Time: {datetime.fromtimestamp(key)}\n" + value + "-" * 30 + "\n\n" diff --git a/langs/CH.json b/langs/CH.json index aed6bcc..097c361 100644 --- a/langs/CH.json +++ b/langs/CH.json @@ -12,6 +12,7 @@ "notVote": "此命令需要您的投票!輸入 `/vote` 獲取更多信息。", "languageNotFound": "未找到語言包,請選擇一個存在的語言包。", "changedLanguage": "已成功更改為`{0}`語言包。", + "setPrefix": "完畢!我在您的服務器中的前綴現在是 `{0}`。嘗試運行 `{1}ping` 進行測試。", "setDJ": "將 dj 設置為 {0}。", "setqueue": "將隊列模式設置為 `{0}`。", "247": "現在您有了 `{0}` 24/7 模式。", @@ -21,7 +22,7 @@ "toggleDuplicateTrack": "現在您已經 `{0}` 以防止隊列中的重複曲目。", "settingsMenu": "服務器設置 | {0}", "settingsTitle": "❤️ 基本信息:", - "settingsValue": "語言:`{0}`\n啟用音樂控制器:`{1}`\nDJ角色:{2}\n投票繞過:`{3}`\n24/7:`{4}`\n默認音量:`{5}%`\n播放時間: `{6}`", + "settingsValue": "前綴:`{0}`\n語言:`{1}`\n啟用音樂控制器:`{2}`\nDJ角色:{3}\n投票繞過:`{4}`\n24/7:`{5}`\n默認音量:`{6}%`\n播放時間: `{7}`", "settingsTitle2": "🔗 隊列信息:", "settingsValue2": "隊列模式: `{0}`\n最大曲目: `{1}`\n允許重複軌道: `{2}`", "settingsPermTitle": "✨ 權限:", diff --git a/langs/DE.json b/langs/DE.json index 632fa67..90dd529 100644 --- a/langs/DE.json +++ b/langs/DE.json @@ -12,6 +12,7 @@ "notVote": "Dieser Befehl erfordert Ihre Stimme! Geben Sie `/vote` ein, um weitere Informationen zu erhalten.", "languageNotFound": "Kein Sprachpaket gefunden, bitte wählen Sie ein vorhandenes Sprachpaket aus.", "changedLanguage": "Erfolgreich auf das Sprachpaket `{0}` geändert.", + "setPrefix": "Erledigt! Mein Präfix auf Ihrem Server ist jetzt `{0}`. Versuchen Sie, `{1}ping` auszuführen, um es zu testen.", "setDJ": "Stellen Sie den DJ auf {0}.", "setqueue": "Stellen Sie den Warteschlangenmodus auf `{0}` ein.", "247": "Jetzt haben Sie den 24/7-Modus von `{0}`.", @@ -21,7 +22,7 @@ "toggleDuplicateTrack": "Jetzt haben Sie `{0}`, um doppelte Tracks in der Warteschlange zu verhindern.", "settingsMenu": "Servereinstellungen | {0}", "settingsTitle": "❤️ Grundlegende Informationen:", - "settingsValue": "Sprache: `{0}`\nMusik-Controller aktivieren: `{1}`\nDJ-Rolle: {2}\nAbstimmungsumgehung: `{3}`\nRund um die Uhr: `{4}`\nStandardvolumen: `{5} %`\nSpielzeit: `{6}`", + "settingsValue": "Präfix: `{0}`\nSprache: `{1}`\nMusik-Controller aktivieren: `{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}`", "settingsPermTitle": "✨ Berechtigungen:", diff --git a/langs/EN.json b/langs/EN.json index c37bb5c..c625f7e 100644 --- a/langs/EN.json +++ b/langs/EN.json @@ -12,6 +12,7 @@ "notVote": "This command requires your vote! Type `/vote` for more info.", "languageNotFound": "No language pack found! please select an existing language pack.", "changedLanguage": "Successfully changed to `{0}` language pack.", + "setPrefix": "Done! My prefix in your server is now `{0}`. Try running `{1}ping` to test it out.", "setDJ": "Set the dj to {0}.", "setqueue": "Set queue mode to `{0}`.", "247": "Now you have `{0}` 24/7 mode.", @@ -21,7 +22,7 @@ "toggleDuplicateTrack": "Now you have `{0}` to prevent duplicate track in the queue.", "settingsMenu": "Server Settings | {0}", "settingsTitle": "❤️ Basic Info:", - "settingsValue": "Language: `{0}`\nEnable Music Controller: `{1}`\nDJ Role: {2}\nVote Bypass: `{3}`\n24/7: `{4}`\nDefault Volume: `{5}%`\nPlay Time: `{6}`", + "settingsValue": "Prefix: `{0}`\nLanguage: `{1}`\nEnable Music 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}`", "settingsPermTitle": "✨ Permissions:", diff --git a/langs/JP.json b/langs/JP.json index 64be2b5..7ca2e61 100644 --- a/langs/JP.json +++ b/langs/JP.json @@ -12,6 +12,7 @@ "notVote": "このコマンドにはあなたの投票が必要です! 詳細については、`/vote` と入力してください。", "languageNotFound": "言語パックが見つかりません。既存の言語パックを選択してください", "changedLanguage": "`{0}` 言語パックに正常に変更されました。", + "setPrefix": "終わり! あなたのサーバーの私のプレフィックスは現在`{0}`です。 `{1}ping` を実行してテストしてみてください。", "setDJ": "DJ を {0} に設定します。", "setqueue": "キュー モードを `{0}` に設定します。", "247": "これで `{0}` 24/7 モードになりました。", @@ -21,7 +22,7 @@ "toggleDuplicateTrack": "これで、キュー内でトラックが重複しないように `{0}` になりました。", "settingsMenu": "サーバー設定 | {0}", "settingsTitle": "❤️ 基本情報:", - "settingsValue": "言語: `{0}`\nミュージック コントローラを有効にする: `{1}`\nDJ ロール: {2}\n投票バイパス: `{3}`\n年中無休: `{4}`\nデフォルトのボリューム: `{5}%`\nプレイ時間: `{6}`", + "settingsValue": "プレフィックス: `{0}`\n言語: `{1}`\nミュージック コントローラを有効にする: `{2}`\nDJ ロール: {3}\n投票バイパス: `{4}`\n年中無休: `{5}`\nデフォルトのボリューム: `{6}%`\nプレイ時間: `{7}`", "settingsTitle2": "🔗 キュー情報:", "settingsValue2": "キューモード: `{0}`\nマックスソング: `{1}`\n重複トラックを許可: `{2}`", "settingsPermTitle": "✨ パーミッション:", diff --git a/langs/KO.json b/langs/KO.json index 68271fa..eb8f79c 100644 --- a/langs/KO.json +++ b/langs/KO.json @@ -12,6 +12,7 @@ "notVote": "이 명령에는 투표가 필요합니다! 자세한 정보를 보려면 `/vote`를 입력하세요.", "languageNotFound": "언어 팩을 찾을 수 없습니다. 기존 언어 팩을 선택하십시오.", "changedLanguage": "`{0}` 언어 팩으로 변경되었습니다.", + "setPrefix": "완료! 서버의 내 접두어는 이제 `{0}`입니다. `{1}ping`을 실행하여 테스트해 보십시오.", "setDJ": "DJ를 {0}으로 설정합니다.", "setqueue": "대기열 모드를 `{0}`로 설정합니다.", "247": "이제 `{0}` 24/7 모드가 있습니다.", @@ -21,7 +22,7 @@ "toggleDuplicateTrack": "이제 대기열에서 중복 트랙을 방지하기 위해 `{0}`되었습니다.", "settingsMenu": "서버 설정 | {0}", "settingsTitle": "❤️ 기본 정보:", - "settingsValue": "언어: `{0}`\n음악 컨트롤러 활성화: `{1}`\nDJ 역할: {2}\n투표 우회: `{3}`\n연중무휴: `{4}`\n기본 볼륨: `{5}%`\n플레이 시간: `{6}`", + "settingsValue": "접두어: `{0}`\n언어: `{1}`\n음악 컨트롤러 활성화: `{2}`\nDJ 역할: {3}\n투표 우회: `{4}`\n연중무휴: `{5}`\n기본 볼륨: `{6}%`\n플레이 시간: `{7}`", "settingsTitle2": "🔗 대기열 정보:", "settingsValue2": "대기열 모드: `{0}`\n맥스송: `{1}`\n중복 트랙 허용: `{2}`", "settingsPermTitle": "✨ 권한:", diff --git a/main.py b/main.py index b1c3a43..a7e9fe9 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,7 @@ import discord import sys, os, traceback, aiohttp import update -import function +import function as func from discord.ext import commands from dotenv import load_dotenv @@ -9,7 +9,7 @@ from datetime import datetime from voicelink import VoicelinkException load_dotenv() -function.settings_setup() +func.settings_setup() class Translator(discord.app_commands.Translator): async def load(self): @@ -19,8 +19,8 @@ class Translator(discord.app_commands.Translator): print("Unload Translator") async def translate(self, string: discord.app_commands.locale_str, locale: discord.Locale, context: discord.app_commands.TranslationContext): - if str(locale) in function.local_langs: - return function.local_langs[str(locale)].get(string.message, None) + if str(locale) in func.local_langs: + return func.local_langs[str(locale)].get(string.message, None) return None class Vocard(commands.Bot): @@ -30,13 +30,13 @@ class Vocard(commands.Bot): return False if self.user.mentioned_in(message) and not message.mention_everyone: - await message.channel.send(f"My prefix is `{self.command_prefix}`") - + await message.channel.send(f"My prefix is `{await self.command_prefix(self, message)}`") + await self.process_commands(message) async def setup_hook(self): - function.langs_setup() - for module in os.listdir(function.root_dir + '/cogs'): + func.langs_setup() + for module in os.listdir(func.root_dir + '/cogs'): if module.endswith('.py'): try: await self.load_extension(f"cogs.{module[:-3]}") @@ -89,21 +89,25 @@ class CommandCheck(discord.app_commands.CommandTree): return await super().interaction_check(interaction) +async def get_prefix(bot, message: discord.Message): + settings = func.get_settings(message.guild.id) + return settings.get("prefix", func.bot_prefix) + intents = discord.Intents.default() intents.members = True -intents.message_content = True if function.bot_prefix else False +intents.message_content = True if func.bot_prefix else False member_cache = discord.MemberCacheFlags( voice=True, joined=False ) -bot = Vocard(command_prefix=function.bot_prefix, +bot = Vocard(command_prefix=get_prefix, help_command=None, tree_cls=CommandCheck, - chunk_guilds_at_startup = False, + chunk_guilds_at_startup=False, member_cache_flags=member_cache, - activity=discord.Activity(type=discord.ActivityType.listening,name="/help"), - case_insensitive = True, + activity=discord.Activity(type=discord.ActivityType.listening, name="/help"), + case_insensitive=True, intents=intents) @bot.tree.error @@ -126,5 +130,6 @@ async def app_command_error(interaction: discord.Interaction, error): except: pass -update.checkVersion(withMsg = True) -bot.run(os.getenv("TOKEN"), log_handler=None) \ No newline at end of file +if __name__ == "__main__": + update.checkVersion(withMsg=True) + bot.run(os.getenv("TOKEN")) \ No newline at end of file