diff --git a/cogs/system_check_cog.py b/cogs/system_check_cog.py index 72bee24..824daec 100644 --- a/cogs/system_check_cog.py +++ b/cogs/system_check_cog.py @@ -15,7 +15,7 @@ except ImportError: WMI_AVAILABLE = False -def create_progress_bar(value: float, total: float, length: int = 12) -> str: +def create_progress_bar(value: float, total: float, length: int = 10) -> str: """Creates a text-based progress bar.""" if total == 0: percentage = 0 @@ -46,7 +46,6 @@ class SystemStatusView(ui.LayoutView): cpu_usage: float, ram_used: int, ram_total: int, - ram_percent: float, gpu_info: str, requester: discord.User, ) -> None: @@ -65,13 +64,20 @@ class SystemStatusView(ui.LayoutView): self.cpu_usage = cpu_usage self.ram_used = ram_used self.ram_total = ram_total - self.ram_percent = ram_percent self.gpu_info = gpu_info self.requester = requester # --- Build the UI --- self._build_ui() + def _create_aligned_block(self, data: dict) -> str: + """Creates a neatly aligned text block inside a markdown code block.""" + max_key_len = max(len(k) for k in data.keys()) + lines = [] + for key, value in data.items(): + lines.append(f"{key.ljust(max_key_len)} : {value}") + return "```\n" + "\n".join(lines) + "\n```" + def _build_ui(self): """Constructs the UI elements of the view.""" # Main container with Discord's "Blurple" color @@ -79,20 +85,14 @@ class SystemStatusView(ui.LayoutView): # --- Header --- header = ui.Section(accessory=ui.Thumbnail(media=self.bot_user.display_avatar.url)) - header.add_item(ui.TextDisplay("**📊 System & Bot Status**")) + header.add_item(ui.TextDisplay("**📊 System Status**")) container.add_item(header) - container.add_item(ui.Separator(spacing=discord.SeparatorSpacing.small)) - # --- Bot & System Info --- self._add_bot_system_info(container) - container.add_item(ui.Separator(spacing=discord.SeparatorSpacing.small)) - # --- Hardware Info --- self._add_hardware_info(container) - - container.add_item(ui.Separator(spacing=discord.SeparatorSpacing.small)) # --- Footer --- self._add_footer(container) @@ -101,49 +101,43 @@ class SystemStatusView(ui.LayoutView): def _add_bot_system_info(self, container: ui.Container): """Adds bot and system information fields.""" - bot_info = ( - f"**🤖 Bot Information**\n" - f"`Servers :` {self.guild_count}\n" - f"`Users :` {self.user_count}\n" - ) - container.add_item(ui.TextDisplay(bot_info)) + container.add_item(ui.Separator(spacing=discord.SeparatorSpacing.small)) + + bot_data = { + "Servers": self.guild_count, + "Users": self.user_count + } + container.add_item(ui.TextDisplay("**🤖 Bot Info**" + self._create_aligned_block(bot_data))) - system_info = ( - f"**🖥️ System Information**\n" - f"`OS :` {self.os_info}{self.distro_info}\n" - f"`Hostname:` {self.hostname}\n" - f"`Uptime :` {self.uptime}" - ) - container.add_item(ui.TextDisplay(system_info)) + system_data = { + "OS": f"{self.os_info}{self.distro_info}", + "Hostname": self.hostname, + "Uptime": self.uptime + } + container.add_item(ui.TextDisplay("**🖥️ System Info**" + self._create_aligned_block(system_data))) def _add_hardware_info(self, container: ui.Container): """Adds hardware information with progress bars.""" - container.add_item(ui.TextDisplay("**⚙️ Hardware Utilization**")) - - # RAM usage text - ram_usage_text = f"{self.ram_used // (1024**2)}MB / {self.ram_total // (1024**2)}MB" - - # Progress Bars + container.add_item(ui.Separator(spacing=discord.SeparatorSpacing.small)) + + ram_usage_text = f"{self.ram_used // (1024**2):,}MB / {self.ram_total // (1024**2):,}MB" cpu_bar = create_progress_bar(self.cpu_usage, 100.0) ram_bar = create_progress_bar(self.ram_used, self.ram_total) - hardware_details = ( - f"`CPU ` {cpu_bar}\n" - f"`RAM ` {ram_bar}\n" - f"└ {ram_usage_text}" - ) - container.add_item(ui.TextDisplay(hardware_details)) + hardware_data = { + "CPU Usage": cpu_bar, + "RAM Usage": f"{ram_bar}\n{''.ljust(len('RAM Usage'))} └ {ram_usage_text}", + "Board": self.motherboard_info, + "CPU": self.cpu_name, + "GPU": self.gpu_info + } - hardware_specs = ( - f"**📋 Hardware Specifications**\n" - f"`Board:` {self.motherboard_info}\n" - f"`CPU :` {self.cpu_name}\n" - f"`GPU :` {self.gpu_info}" - ) - container.add_item(ui.TextDisplay(hardware_specs)) + container.add_item(ui.TextDisplay("**⚙️ Hardware Info**" + self._create_aligned_block(hardware_data))) + def _add_footer(self, container: ui.Container): """Adds the footer with timestamp and requester info.""" + container.add_item(ui.Separator(spacing=discord.SeparatorSpacing.small)) timestamp = discord.utils.format_dt(discord.utils.utcnow(), style="R") footer_text = f"Updated: {timestamp} | Requested by: {self.requester.display_name}" container.add_item(ui.TextDisplay(f"_{footer_text}_")) @@ -157,6 +151,7 @@ class SystemCheckCog(commands.Cog): """Gathers all system data and returns the constructed view.""" # Bot information guild_count = len(self.bot.guilds) + # A more efficient way to get unique users, avoiding large member lists in memory user_ids = {member.id for guild in self.bot.guilds for member in guild.members if not member.bot} user_count = len(user_ids) @@ -174,8 +169,9 @@ class SystemCheckCog(commands.Cog): distro_info_str = "" # Fail silently elif system == "Windows": try: - win_ver = platform.version() - os_info = f"Windows {win_ver}" + # Use a more reliable way to get Windows version + win_ver = platform.win32_ver() + os_info = f"Windows {win_ver[0]} {win_ver[2]}" except Exception: pass # Fail silently @@ -189,6 +185,7 @@ class SystemCheckCog(commands.Cog): cpu_usage = psutil.cpu_percent(interval=0.1) try: + cpu_name_base = "N/A" if system == "Linux": with open("/proc/cpuinfo") as f: for line in f: @@ -211,8 +208,9 @@ class SystemCheckCog(commands.Cog): try: gpus = GPUtil.getGPUs() if gpus: + # Format multi-GPU info on new lines for readability gpu_info_lines = [f"{gpu.name} ({gpu.load*100:.1f}% Load)" for gpu in gpus] - gpu_info = " | ".join(gpu_info_lines) + gpu_info = "\n".join(gpu_info_lines) else: gpu_info = "No dedicated GPU detected" except Exception: @@ -234,7 +232,6 @@ class SystemCheckCog(commands.Cog): cpu_usage=cpu_usage, ram_used=memory.used, ram_total=memory.total, - ram_percent=memory.percent, gpu_info=gpu_info, requester=user, ) @@ -248,8 +245,13 @@ class SystemCheckCog(commands.Cog): board = w.Win32_BaseBoard()[0] return f"{board.Manufacturer} {board.Product}" elif system == "Linux": - with open("/sys/devices/virtual/dmi/id/product_name", "r") as f: - return f.read().strip() + # Check for product_name first, then fallback to board_name + try: + with open("/sys/devices/virtual/dmi/id/product_name", "r") as f: + return f.read().strip() + except FileNotFoundError: + with open("/sys/devices/virtual/dmi/id/board_name", "r") as f: + return f.read().strip() return "N/A" except Exception: return "N/A" @@ -269,4 +271,4 @@ class SystemCheckCog(commands.Cog): async def setup(bot): - await bot.add_cog(SystemCheckCog(bot)) \ No newline at end of file + await bot.add_cog(SystemCheckCog(bot))