Cleaned up some code

This commit is contained in:
Choco
2023-03-19 16:46:55 +08:00
parent 0c941e804e
commit 74846c583f
16 changed files with 94 additions and 85 deletions

View File

@@ -1 +1,2 @@
from .lyrics import getLyrics
from .lyrics import getLyrics
from .settings import Settings

18
addons/settings.py Normal file
View File

@@ -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
}
)

View File

@@ -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):

View File

@@ -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:

View File

@@ -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'),

View File

@@ -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,

View File

@@ -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, [])

17
main.py
View File

@@ -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())

View File

@@ -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>",

View File

@@ -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):

View File

@@ -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':

View File

@@ -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

View File

@@ -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):

View File

@@ -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

View File

@@ -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:

View File

@@ -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):