From 74846c583f12ca1ea2e682f8847e2e78ff3c1767 Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Sun, 19 Mar 2023 16:46:55 +0800 Subject: [PATCH] Cleaned up some code --- addons/__init__.py | 3 +- addons/settings.py | 18 +++++++ cogs/admin.py | 10 ++-- cogs/basic.py | 8 +-- cogs/{listener.py => listeners.py} | 2 +- cogs/playlist.py | 4 +- function.py | 81 ++++++++++++------------------ main.py | 17 ++++--- settings Example.json | 6 ++- views/controller.py | 4 +- views/help.py | 6 +-- views/inbox.py | 2 +- views/list.py | 2 +- views/lyrics.py | 2 +- views/playlist.py | 4 +- voicelink/player.py | 10 ++-- 16 files changed, 94 insertions(+), 85 deletions(-) create mode 100644 addons/settings.py rename cogs/{listener.py => listeners.py} (98%) diff --git a/addons/__init__.py b/addons/__init__.py index 088e3ad..aa4e903 100644 --- a/addons/__init__.py +++ b/addons/__init__.py @@ -1 +1,2 @@ -from .lyrics import getLyrics \ No newline at end of file +from .lyrics import getLyrics +from .settings import Settings \ No newline at end of file diff --git a/addons/settings.py b/addons/settings.py new file mode 100644 index 0000000..91ad991 --- /dev/null +++ b/addons/settings.py @@ -0,0 +1,18 @@ +class Settings: + def __init__(self, settings: dict) -> None: + self.invite_link = "https://discord.gg/wRCgB7vBQv" + self.nodes = settings.get("nodes", {}) + self.max_queue = settings.get("default_max_queue", 1000) + self.bot_prefix = settings.get("prefix", "") + self.embed_color = int(settings.get("embed_color", "0xb3b3b3"), 16) + self.bot_access_user = settings.get("bot_access_user", []) + 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.ipc_server = settings.get("ipc_server", { + "host": "127.0.0.1", + "port": 8000, + "enable": False + } + ) \ No newline at end of file diff --git a/cogs/admin.py b/cogs/admin.py index 3067c47..a040e34 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -13,7 +13,7 @@ from function import ( update_settings, get_settings, get_lang, - embed_color, + settings as sett, time as ctime, get_aliases, cooldown_check @@ -138,13 +138,13 @@ class Admin(commands.Cog, name="settings"): async def view(self, ctx: commands.Context): "Show all the bot settings in your server." player, settings = self.get_settings(ctx) - embed = discord.Embed(color=embed_color) + embed = discord.Embed(color=sett.embed_color) 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('prefix', func.settings.bot_prefix), settings.get('lang', 'EN'), settings.get('controller', True), f"<@&{settings['dj']}>" if 'dj' in settings else '`None`', @@ -156,7 +156,7 @@ class Admin(commands.Cog, name="settings"): ) embed.add_field(name=get_lang(ctx.guild.id, 'settingsTitle2'), value=get_lang(ctx.guild.id, 'settingsValue2').format( settings.get("queueType", "Queue"), - func.max_queue, + func.settings.max_queue, settings.get("duplicateTrack", True) ) ) @@ -219,7 +219,7 @@ class Admin(commands.Cog, name="settings"): @app_commands.command(name="debug") async def debug(self, interaction: discord.Interaction): - if interaction.user.id not in func.bot_access_user: + if interaction.user.id not in func.settings.bot_access_user: return await interaction.response.send_message("You are not able to use this command!") def clear_code(content): diff --git a/cogs/basic.py b/cogs/basic.py index 80c0cb3..0dd87b5 100644 --- a/cogs/basic.py +++ b/cogs/basic.py @@ -11,7 +11,7 @@ from function import ( youtube_api_key, requests_api, get_lang, - embed_color, + settings, cooldown_check, get_aliases, connect_channel @@ -36,7 +36,7 @@ async def nowplay(ctx: commands.Context, player: voicelink.Player): upnext = "\n".join(f"`{index}.` `[{track.formatLength}]` [{track.title[:30]}]({track.uri})" for index, track in enumerate( player.queue.tracks()[:2], start=2)) embed = discord.Embed(description=player.get_msg( - 'nowplayingDesc').format(track.title), color=embed_color) + 'nowplayingDesc').format(track.title), color=settings.embed_color) embed.set_author(name=track.requester if track.requester else ctx.bot, icon_url=track.requester.display_avatar.url if track.requester else ctx.me.display_avatar.url) @@ -187,7 +187,7 @@ class Basic(commands.Cog): query_track = "\n".join( f"`{index}.` `[{track.formatLength}]` **{track.title[:35]}**" for index, track in enumerate(tracks[0:10], start=1)) embed = discord.Embed(title=player.get_msg('searchTitle').format(query), description=player.get_msg( - 'searchDesc').format(emoji_source(platform), platform, len(tracks[0:10]), query_track), color=embed_color) + 'searchDesc').format(emoji_source(platform), platform, len(tracks[0:10]), query_track), color=settings.embed_color) view = SearchView(tracks=tracks[0:10], lang=player.lang) message = await ctx.send(embed=embed, view=view, ephemeral=True) view.response = message @@ -759,7 +759,7 @@ class Basic(commands.Cog): async def ping(self, ctx: commands.Context): "Test if the bot is alive, and see the delay between your commands and my response." player: voicelink.Player = ctx.guild.voice_client - embed = discord.Embed(color=embed_color) + embed = discord.Embed(color=settings.embed_color) embed.add_field(name=get_lang(ctx.guild.id, 'pingTitle1'), value=get_lang(ctx.guild.id, 'pingfield1').format( "0", "0", self.bot.latency, '😭' if self.bot.latency > 5 else ('😨' if self.bot.latency > 1 else 'šŸ‘Œ'), "St Louis, MO, United States")) if player: diff --git a/cogs/listener.py b/cogs/listeners.py similarity index 98% rename from cogs/listener.py rename to cogs/listeners.py index 43c33f5..71cd510 100644 --- a/cogs/listener.py +++ b/cogs/listeners.py @@ -19,7 +19,7 @@ class Nodes(commands.Cog): async def start_nodes(self) -> None: """Connect and intiate nodes.""" await self.bot.wait_until_ready() - for n in func.nodes.values(): + for n in func.settings.nodes.values(): try: await self.voicelink.create_node(bot=self.bot, spotify_client_id=getenv('SPOTIFY_CLIENT_ID'), diff --git a/cogs/playlist.py b/cogs/playlist.py index d027c72..e10571b 100644 --- a/cogs/playlist.py +++ b/cogs/playlist.py @@ -13,7 +13,7 @@ from function import ( update_inbox, get_lang, playlist_name, - embed_color, + settings, get_aliases, cooldown_check, connect_channel @@ -179,7 +179,7 @@ class Playlists(commands.Cog, name="playlist"): embed = discord.Embed(title=get_lang(ctx.guild.id, 'playlistViewTitle').format(ctx.author.name), description='```%0s %4s %10s %10s %10s\n' % tuple(get_lang(ctx.guild.id, 'playlistViewHeaders')) + '\n'.join( '%0s %3s. %10s %10s %10s' % (info['emoji'], info['id'], f"[{info['time']}]", info['name'], len(info['tracks'])) for info in results) + '```', - color=embed_color) + color=settings.embed_color) embed.add_field(name=get_lang(ctx.guild.id, 'playlistMaxP'), value=f"āž„ {len(user)}/{max_p}", inline=True) embed.add_field(name=get_lang(ctx.guild.id, diff --git a/function.py b/function.py index 351a140..556b329 100644 --- a/function.py +++ b/function.py @@ -11,6 +11,7 @@ from time import strptime from io import BytesIO from pymongo import MongoClient from typing import Optional +from addons import Settings root_dir = os.path.dirname(os.path.abspath(__file__)) @@ -36,30 +37,18 @@ Playlist = mongodb[MONGODB_NAME]['Playlist'] youtube_api_key = os.getenv('YOUTUBE_API_KEY') #--------------- Cache Var --------------- -invite_link = "https://discord.gg/wRCgB7vBQv" #Template of invite link -embed_color = None - try: report_channel_id = int(os.getenv("BUG_REPORT_CHANNEL_ID")) except: report_channel_id = 0 -emoji_source_raw = {} #Stores all source emoji for track +settings: Settings error_log = {} #Stores error that not a Voicelink Exception -bot_access_user = [] #Stores bot access user id langs = {} #Stores all the languages in ./langs 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 -max_queue = 1000 #The default maximum number of tracks in the queue -cooldowns_settings = {} #Stores command cooldown settings -aliases_settings = {} #Stores command aliases settings -controller_settings = {} #Stores the layout of music controller -enable_ipc = False #Enable ipc server or not -#----------------- Nodes ----------------- -nodes = {} #-------------- Vocard Functions -------------- def get_settings(guild_id:int): @@ -86,38 +75,12 @@ def update_settings(guild_id:int, data: dict, mode="Set"): collection.update_one({"_id":guild_id}, {"$unset":data}) return -def langs_setup(): - for language in os.listdir(os.path.join(root_dir, "langs")): - if language.endswith('.json'): - with open(os.path.join(root_dir, "langs", language), encoding="utf8") as json_file: - lang = json.load(json_file) - - langs[language[:-5]] = lang - - for language in os.listdir(os.path.join(root_dir, "local_langs")): - if language.endswith('.json'): - with open(os.path.join(root_dir, "local_langs", language), encoding="utf8") as json_file: - lang = json.load(json_file) - - local_langs[language[:-5]] = lang - return - -def settings_setup(): - with open(os.path.join(root_dir, "settings.json"), encoding="utf8") as json_file: - rawSettings = json.load(json_file) - - global nodes, max_queue, bot_prefix, embed_color, bot_access_user, emoji_source_raw, cooldowns_settings, aliases_settings, controller_settings, enable_ipc - nodes = rawSettings.get("nodes", {}) - if (new_max_queue := rawSettings.get("default_max_queue", max_queue)): - max_queue = new_max_queue - bot_prefix = rawSettings.get("prefix", "") - enable_ipc = rawSettings.get("enable_ipc", False) - embed_color = int(rawSettings.get("embed_color", "0xb3b3b3"), 16) - bot_access_user = rawSettings.get("bot_access_user", []) - emoji_source_raw = rawSettings.get("emoji_source_raw", {}) - cooldowns_settings = rawSettings.get("cooldowns", {}) - aliases_settings = rawSettings.get("aliases", {}) - controller_settings = rawSettings.get("controller", [["back", "resume", "skip", {"stop": "red"}, "add"], ["tracks"]]) +def open_json(path: str): + try: + with open(path, encoding="utf8") as json_file: + return json.load(json_file) + except: + return {} def get_lang(guild_id:int, key:str): lang = get_settings(guild_id).get("lang", "EN") @@ -131,12 +94,30 @@ async def requests_api(url: str): return await resp.json(encoding="utf-8") +def init(): + global settings + + json = open_json(os.path.join(root_dir, "settings.json")) + if json: + settings = Settings(json) + +def langs_setup(): + for language in os.listdir(os.path.join(root_dir, "langs")): + if language.endswith('.json'): + langs[language[:-5]] = open_json(os.path.join(root_dir, "langs", language)) + + for language in os.listdir(os.path.join(root_dir, "local_langs")): + if language.endswith('.json'): + local_langs[language[:-5]] = open_json(os.path.join(root_dir, "local_langs", language)) + + return + async def create_account(ctx: commands.Context): if not ctx.author: return from views import CreateView view = CreateView() - embed=discord.Embed(title="Do you want to create an account on Vocard?", color=embed_color) + embed=discord.Embed(title="Do you want to create an account on Vocard?", color=settings.embed_color) embed.description = f"> Plan: `Default` | `5` Playlist | `500` tracks in each playlist." embed.add_field(name="Terms of Service:", value="ā€Œ āž„ We assure you that all your data on Vocard will not be disclosed to any third party\n" "ā€Œ āž„ We will not perform any data analysis on your data\n" @@ -262,7 +243,7 @@ def formatTime(number:str) -> Optional[int]: return (int(num.tm_hour) * 3600 + int(num.tm_min) * 60 + int(num.tm_sec)) * 1000 def emoji_source(emoji:str): - return emoji_source_raw.get(emoji.lower(), "šŸ”—") + return settings.emoji_source_raw.get(emoji.lower(), "šŸ”—") def gen_report() -> Optional[discord.File]: if error_log: @@ -278,12 +259,12 @@ def gen_report() -> Optional[discord.File]: return None def cooldown_check(ctx: commands.Context) -> Optional[commands.Cooldown]: - if ctx.author.id in bot_access_user: + if ctx.author.id in settings.bot_access_user: return None - cooldown = cooldowns_settings.get(f"{ctx.command.parent.qualified_name} {ctx.command.name}" if ctx.command.parent else ctx.command.name) + cooldown = settings.cooldowns_settings.get(f"{ctx.command.parent.qualified_name} {ctx.command.name}" if ctx.command.parent else ctx.command.name) if not cooldown: return None return commands.Cooldown(cooldown[0], cooldown[1]) def get_aliases(name: str) -> list: - return aliases_settings.get(name, []) + return settings.aliases_settings.get(name, []) diff --git a/main.py b/main.py index bf11c87..b927b40 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,7 @@ from datetime import datetime from voicelink import VoicelinkException load_dotenv() -func.settings_setup() +func.init() class Translator(discord.app_commands.Translator): async def load(self): @@ -30,7 +30,12 @@ class Vocard(commands.Bot): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.ipc = IPCServer(self, sercet_key="Vocard") + self.ipc = IPCServer( + self, + func.settings.ipc_server["host"], + func.settings.ipc_server["port"], + sercet_key="Vocard" + ) async def on_message(self, message: discord.Message, /) -> None: if message.author.bot or not message.guild: @@ -51,7 +56,7 @@ class Vocard(commands.Bot): except Exception as e: print(traceback.format_exc()) - if func.enable_ipc: + if func.settings.ipc_server["enable"]: await self.ipc.start() await bot.tree.set_translator(Translator()) @@ -101,11 +106,11 @@ class CommandCheck(discord.app_commands.CommandTree): async def get_prefix(bot, message: discord.Message): settings = func.get_settings(message.guild.id) - return settings.get("prefix", func.bot_prefix) + return settings.get("prefix", func.settings.bot_prefix) intents = discord.Intents.default() intents.members = True -intents.message_content = True if func.bot_prefix else False +intents.message_content = True if func.settings.bot_prefix else False member_cache = discord.MemberCacheFlags( voice=True, joined=False @@ -128,7 +133,7 @@ async def app_command_error(interaction: discord.Interaction, error): elif isinstance(error, (discord.app_commands.CommandOnCooldown, discord.app_commands.errors.MissingPermissions)): pass elif not issubclass(error.__class__, VoicelinkException): - error = func.get_lang(interaction.guild_id, "unknownException") + func.invite_link + error = func.get_lang(interaction.guild_id, "unknownException") + func.settings.invite_link if (guildId := interaction.guild_id) not in func.error_log: func.error_log[guildId] = {} func.error_log[guildId][round(datetime.timestamp(datetime.now()))] = str(traceback.format_exc()) diff --git a/settings Example.json b/settings Example.json index 286f234..bbc1608 100644 --- a/settings Example.json +++ b/settings Example.json @@ -10,9 +10,13 @@ }, "prefix": "?", "bot_access_user": [], - "enable_ipc": false, "color_code":"0xb3b3b3", "default_max_queue": 1000, + "ipc_server": { + "host": "127.0.0.1", + "port": 8000, + "enable": false + }, "emoji_source_raw": { "youtube": "<:youtube:826661982760992778>", "youtube music": "<:youtube:826661982760992778>", diff --git a/views/controller.py b/views/controller.py index ff30cb7..82709d7 100644 --- a/views/controller.py +++ b/views/controller.py @@ -301,7 +301,7 @@ class InteractiveController(discord.ui.View): super().__init__(timeout=None) self.player = player - for row, btnRow in enumerate(func.controller_settings): + for row, btnRow in enumerate(func.settings.controller_settings): for btn in btnRow: color = "" if isinstance(btn, Dict): @@ -320,7 +320,7 @@ class InteractiveController(discord.ui.View): await interaction.response.send_message(self.player.get_msg("nodeReconnect"), ephemeral=True) return False - if interaction.user.id in func.bot_access_user: + if interaction.user.id in func.settings.bot_access_user: return True if self.player.channel and self.player.is_user_join(interaction.user): diff --git a/views/help.py b/views/help.py index 0a94774..506fde1 100644 --- a/views/help.py +++ b/views/help.py @@ -58,7 +58,7 @@ class HelpView(discord.ui.View): self.response = None self.categorys = [ name.capitalize() for name, cog in bot.cogs.items() if len([c for c in cog.walk_commands()]) ] - self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=func.invite_link)) + self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=func.settings.invite_link)) self.add_item(discord.ui.Button(label='Invite', emoji=':invite:915152589056790589', url='https://discord.com/oauth2/authorize?client_id={}&permissions=2184260928&scope=bot%20applications.commands'.format(getenv('CLIENT_ID')))) self.add_item(discord.ui.Button(label='Github', url='https://github.com/ChocoMeow/Vocard')) self.add_item(discord.ui.Button(label='Donate', emoji=':patreon:913397909024800878', url='https://www.patreon.com/Vocard')) @@ -84,7 +84,7 @@ class HelpView(discord.ui.View): def build_embed(self, category: str): category = category.lower() if category == "news": - embed = discord.Embed(title="Vocard Help Menu", url="https://discord.com/channels/811542332678996008/811909963718459392/1069971173116481636", color=func.embed_color) + embed = discord.Embed(title="Vocard Help Menu", url="https://discord.com/channels/811542332678996008/811909963718459392/1069971173116481636", color=func.settings.embed_color) embed.add_field(name=f"Available Categories: [{2 + len(self.categorys)}]", value="```py\nšŸ‘‰ News\n2. Tutorial\n{}```".format("".join(f"{i}. {c}\n" for i, c in enumerate(self.categorys, start=3))), @@ -101,7 +101,7 @@ class HelpView(discord.ui.View): return embed - embed = discord.Embed(title=f"Category: {category.capitalize()}", color=func.embed_color) + embed = discord.Embed(title=f"Category: {category.capitalize()}", color=func.settings.embed_color) embed.add_field(name=f"Categories: [{2 + len(self.categorys)}]", value="```py\n" + "\n".join(("šŸ‘‰ " if c == category.capitalize() else f"{i}. ") + c for i, c in enumerate(['News', 'Tutorial'] + self.categorys, start=1)) + "```", inline=True) if category == 'tutorial': diff --git a/views/inbox.py b/views/inbox.py index e169e9f..68597ff 100644 --- a/views/inbox.py +++ b/views/inbox.py @@ -51,7 +51,7 @@ class InboxView(discord.ui.View): def build_embed(self): embed=discord.Embed(title=f"šŸ“­ All {self.author}'s Inbox", description=f'Max Messages: {len(self.inbox)}/10' + '```%0s %2s %20s\n' % (" ", "ID:", "Title:") + '\n'.join('%0s %2s. %35s'% ('āœ‰ļø' if mail['type'] == 'invite' else 'šŸ“¢', index, mail['title'][:35] + "...") for index, mail in enumerate(self.inbox, start=1)) + '```', - color=func.embed_color) + color=func.settings.embed_color) if self.current: embed.add_field(name="Message Info:", value=f"```{self.current['description']}\nSender ID: {self.current['sender']}\nPlaylist ID: {self.current['referId']}\nInvite Time: {self.current['time'].strftime('%d-%m %H:%M:%S')}```") return embed diff --git a/views/list.py b/views/list.py index 5a4d623..cbc582a 100644 --- a/views/list.py +++ b/views/list.py @@ -64,7 +64,7 @@ class ListView(discord.ui.View): offset = self.current_page * 7 tracks = self.tracks[(offset-7):offset] - embed = discord.Embed(title=self.player.get_msg('viewTitle'), color=func.embed_color) + embed = discord.Embed(title=self.player.get_msg('viewTitle'), color=func.settings.embed_color) embed.description=self.player.get_msg('viewDesc').format(self.player.current.uri, f"```{self.player.current.title}```") if self.player.current else self.player.get_msg('nowplayingDesc').format("None") queueText = "" for index, track in enumerate(tracks, start=offset - 6): diff --git a/views/lyrics.py b/views/lyrics.py index c374be9..26fbe3c 100644 --- a/views/lyrics.py +++ b/views/lyrics.py @@ -72,7 +72,7 @@ class LyricsView(discord.ui.View): def build_embed(self): chunk = self.source.get(self.lang)[self.current_page - 1] - embed=discord.Embed(description=chunk, color=func.embed_color) + embed=discord.Embed(description=chunk, color=func.settings.embed_color) embed.set_author(name=f"Searching Query: {self.name}", icon_url=self.author.display_avatar.url) embed.set_footer(text=f"Page: {self.current_page}/{self.pages}") return embed diff --git a/views/playlist.py b/views/playlist.py index f749891..e4ab7df 100644 --- a/views/playlist.py +++ b/views/playlist.py @@ -88,7 +88,7 @@ class PlaylistView(discord.ui.View): offset = self.current_page * 7 tracks = self.current['tracks'][(offset-7):offset] - embed = discord.Embed(title=func.get_lang(self.guildID, 'playlistView'), color=func.embed_color) + embed = discord.Embed(title=func.get_lang(self.guildID, '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']), self.current.get('owner', "None"), self.current['type']) @@ -163,7 +163,7 @@ class CreateView(discord.ui.View): self.value = None self.response = None self.add_item(agree()) - self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=func.invite_link)) + self.add_item(discord.ui.Button(label='Support', emoji=':support:915152950471581696', url=func.settings.invite_link)) async def on_timeout(self): for child in self.children: diff --git a/voicelink/player.py b/voicelink/player.py index a75e4c2..048684b 100644 --- a/voicelink/player.py +++ b/voicelink/player.py @@ -88,7 +88,7 @@ class Player(VoiceProtocol): self.joinTime = round(time.time()) self._volume = self.settings.get('volume', 100) self.lang = self.settings.get('lang', 'EN') if self.settings.get('lang', 'EN') in func.langs else "EN" - self.queue = eval(self.settings.get("queueType", "Queue"))(self.settings.get("maxQueue", func.max_queue), self.settings.get("duplicateTrack", True), self.get_msg) + self.queue = eval(self.settings.get("queueType", "Queue"))(self.settings.get("maxQueue", func.settings.max_queue), self.settings.get("duplicateTrack", True), self.get_msg) self._node = NodePool.get_node() self._current: Track = None @@ -216,7 +216,7 @@ class Player(VoiceProtocol): return True def is_privileged(self, user: Member, check_user_join: bool = True): - if user.id in func.bot_access_user: + if user.id in func.settings.bot_access_user: return True manage_perm = user.guild_permissions.manage_guild @@ -360,18 +360,18 @@ class Player(VoiceProtocol): track = self.current if not track: - embed=Embed(title=self.get_msg("noTrackPlaying"), description=f"[Vote](https://top.gg/bot/605618911471468554/vote/) | [Support]({func.invite_link}) | [Invite](https://discord.com/oauth2/authorize?client_id=605618911471468554&permissions=2184260928&scope=bot%20applications.commands) | [Questionnaire](https://forms.gle/UqeeEv4GEdCq9hi3A)", color=func.embed_color) + 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') else: try: - embed = Embed(color=func.embed_color) + 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.embed_color) + embed = Embed(description=self.get_msg("missingTrackInfo"), color=func.settings.embed_color) return embed async def is_position_fresh(self):