From 88a879f98a6133cc262d7dba2d9e1e2b1a6c1d6f Mon Sep 17 00:00:00 2001 From: Choco <94597336+ChocoMeow@users.noreply.github.com> Date: Fri, 12 Apr 2024 19:36:35 +0800 Subject: [PATCH] Optimized code --- cogs/settings.py | 25 +++++++++++++++---------- cogs/task.py | 35 ++++++++++++++++++----------------- function.py | 10 +++++++++- requirements.txt | 4 ---- settings Example.json | 2 +- voicelink/player.py | 10 +++++++--- voicelink/pool.py | 5 ++++- 7 files changed, 54 insertions(+), 37 deletions(-) diff --git a/cogs/settings.py b/cogs/settings.py index afbbfb4..8a93bb2 100644 --- a/cogs/settings.py +++ b/cogs/settings.py @@ -26,7 +26,6 @@ import voicelink import psutil import function as func -from typing import Tuple from discord import app_commands from discord.ext import commands from function import ( @@ -39,15 +38,19 @@ from function import ( get_aliases, cooldown_check ) + from views import DebugView, HelpView, EmbedBuilderView -def formatBytes(bytes: int, unit: bool = False): +def format_bytes(bytes: int, unit: bool = False): if bytes <= 1_000_000_000: return f"{bytes / (1024 ** 2):.1f}" + ("MB" if unit else "") else: return f"{bytes / (1024 ** 3):.1f}" + ("GB" if unit else "") +def status_icon(status: bool) -> str: + return "✅" if status else "❌" + class Settings(commands.Cog, name="settings"): def __init__(self, bot) -> None: self.bot: commands.Bot = bot @@ -162,10 +165,12 @@ class Settings(commands.Cog, name="settings"): perms = ctx.guild.me.guild_permissions embed.add_field(name=texts[5], value=texts[6].format( - '' if perms.administrator else '', - '' if perms.manage_guild else '', - '' if perms.manage_channels else '', - '' if perms.manage_messages else ''), inline=False + status_icon(perms.administrator), + status_icon(perms.manage_guild), + status_icon(perms.manage_channels), + status_icon(perms.manage_messages) + ), + inline=False ) await ctx.send(embed=embed) @@ -242,15 +247,15 @@ class Settings(commands.Cog, name="settings"): return await interaction.response.send_message("You are not able to use this command!") memory = psutil.virtual_memory() - disk = psutil.disk_usage('/') + disk = psutil.disk_usage(func.ROOT_DIR) available_memory, total_memory = memory.available, memory.total used_disk_space, total_disk_space = disk.used, disk.total embed = discord.Embed(title="📄 Debug Panel", color=func.settings.embed_color) embed.description = "```== System Info ==\n" \ f"• CPU: {psutil.cpu_freq().current}Mhz ({psutil.cpu_percent()}%)\n" \ - f"• RAM: {formatBytes(total_memory - available_memory)}/{formatBytes(total_memory, True)} ({memory.percent}%)\n" \ - f"• DISK: {formatBytes(total_disk_space - used_disk_space)}/{formatBytes(total_disk_space, True)} ({disk.percent}%)```" + f"• RAM: {format_bytes(total_memory - available_memory)}/{format_bytes(total_memory, True)} ({memory.percent}%)\n" \ + f"• DISK: {format_bytes(total_disk_space - used_disk_space)}/{format_bytes(total_disk_space, True)} ({disk.percent}%)```" embed.add_field( name="🤖 Bot Information", @@ -269,7 +274,7 @@ class Settings(commands.Cog, name="settings"): value=f"```• ADDRESS: {node._host}:{node._port}\n" \ f"• PLAYERS: {len(node._players)}\n" \ f"• CPU: {node.stats.cpu_process_load:.1f}%\n" \ - f"• RAM: {formatBytes(node.stats.free)}/{formatBytes(total_memory, True)} ({(node.stats.free/total_memory) * 100:.1f}%)\n" + f"• RAM: {format_bytes(node.stats.free)}/{format_bytes(total_memory, True)} ({(node.stats.free/total_memory) * 100:.1f}%)\n" f"• LATENCY: {node.latency:.2f}ms\n" \ f"• UPTIME: {func.time(node.stats.uptime)}```", inline=True diff --git a/cogs/task.py b/cogs/task.py index a4d42e8..56d899d 100644 --- a/cogs/task.py +++ b/cogs/task.py @@ -86,29 +86,30 @@ class Task(commands.Cog): await player.teardown() continue - members = player.channel.members - if (not player.is_playing and player.queue.is_empty) or not any(False if member.bot or member.voice.self_deaf else True for member in members): - if not player.settings.get('24/7', False): - await player.teardown() - continue - else: - if not player.is_paused: - await player.set_pause(True) - else: - if not player.guild.me: - await player.teardown() - continue - elif not player.guild.me.voice: - await player.connect(timeout=0.0, reconnect=True) - try: + members = player.channel.members + if (not player.is_playing and player.queue.is_empty) or not any(False if member.bot or member.voice.self_deaf else True for member in members): + if not player.settings.get('24/7', False): + await player.teardown() + continue + else: + if not player.is_paused: + await player.set_pause(True) + else: + if not player.guild.me: + await player.teardown() + continue + elif not player.guild.me.voice: + await player.connect(timeout=0.0, reconnect=True) + if player.dj not in members: for m in members: if not m.bot: player.dj = m break - except: - pass + + except Exception as e: + func.logger.error("Error occurred while checking the player!", exc_info=e) @tasks.loop(hours=12.0) async def cache_cleaner(self): diff --git a/function.py b/function.py index 1f574c3..25c3f34 100644 --- a/function.py +++ b/function.py @@ -147,7 +147,15 @@ async def send(ctx: Union[commands.Context, discord.Interaction], key: str, *par text = await get_lang(ctx.guild.id, key) text = text.format(*params) - send_func = ctx.send if isinstance(ctx, commands.Context) else (ctx.followup.send if ctx.response.is_done() else ctx.response.send_message) + if isinstance(ctx, commands.Context): + send_func = ctx.send + else: + if not ctx.response.is_done(): + send_func = ctx.response.send_message + + else: + return await ctx.followup.send(text, ephemeral=ephemeral, allowed_mentions=ALLOWED_MENTIONS) + return await send_func(text, delete_after=delete_after, ephemeral=ephemeral, allowed_mentions=ALLOWED_MENTIONS) async def update_db(db: AsyncIOMotorCollection, tempStore: dict, filter: dict, data: dict) -> bool: diff --git a/requirements.txt b/requirements.txt index 41d4156..ea1cbd0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,9 +4,5 @@ dnspython==2.2.1 tldextract==3.2.1 validators==0.18.2 humanize==4.0.0 -python-dotenv==0.20.0 beautifulsoup4==4.11.1 -websockets==10.4 -Flask==2.2.3 -Flask-SocketIO==5.3.2 psutil==5.9.5 diff --git a/settings Example.json b/settings Example.json index 8780556..98f7af7 100644 --- a/settings Example.json +++ b/settings Example.json @@ -10,7 +10,7 @@ }, "prefix": "?", "activity":[ - {"type": "listen", "name": "/help", "status": "online"} + {"type": "listening", "name": "/help", "status": "online"} ], "logging": { "file": { diff --git a/voicelink/player.py b/voicelink/player.py index 0ba1fdb..3ab6918 100644 --- a/voicelink/player.py +++ b/voicelink/player.py @@ -390,7 +390,10 @@ class Player(VoiceProtocol): self.controller = await self.context.channel.send(embed=embed, view=view) elif not await self.is_position_fresh(): - await self.controller.delete() + try: + await self.controller.delete() + except: + pass self.controller = await self.context.channel.send(embed=embed, view=view) else: @@ -466,8 +469,9 @@ class Player(VoiceProtocol): self._node._players[self.guild.id] = self self._is_connected = True - self._logger.debug(f"Player in {self.guild.name}({self.guild.id}) has been connected to {self.channel.name}({self.channel.id}).") - + if self.channel: + self._logger.debug(f"Player in {self.guild.name}({self.guild.id}) has been connected to {self.channel.name}({self.channel.id}).") + async def stop(self): """Stops the currently playing track.""" self._current = None diff --git a/voicelink/pool.py b/voicelink/pool.py index bc314b6..e8dfba8 100644 --- a/voicelink/pool.py +++ b/voicelink/pool.py @@ -611,7 +611,10 @@ class NodePool: """ if identifier in cls._nodes.keys(): raise NodeCreationError(f"A node with identifier '{identifier}' already exists.") - + + if not logger: + logger = logging.getLogger("voicelink") + node = Node( pool=cls, bot=bot, host=host, port=port, password=password, identifier=identifier, secure=secure, heartbeat=heartbeat, spotify_client_id=spotify_client_id,