This commit is contained in:
2026-01-23 18:40:54 +08:00
parent a97c1f2b3f
commit 8553c6797b
3 changed files with 60 additions and 12 deletions

View File

@@ -39,6 +39,7 @@ class Bot(MessageAPI, GroupAPI, FriendAPI, AccountAPI, MediaAPI):
"""
super().__init__(ws_client, ws_client.self_id or 0)
self.code_executor: Optional["CodeExecutor"] = None
self.nickname: str = ""
async def get_group_list(self, no_cache: bool = False) -> List[GroupInfo]:
# GroupAPI.get_group_list 不支持 no_cache 参数,这里忽略它

View File

@@ -38,17 +38,38 @@ def _get_system_info():
cpu_percent = psutil.cpu_percent(interval=1)
mem_info = psutil.virtual_memory()
bot_mem_mb = PROCESS.memory_info().rss / (1024 * 1024)
# 磁盘信息
disk_usage = psutil.disk_usage('/')
# 网络信息
net_io = psutil.net_io_counters()
return {
"cpu_percent": f"{cpu_percent:.1f}",
"mem_percent": f"{mem_info.percent:.1f}",
"mem_total": f"{mem_info.total / (1024**3):.1f}",
"mem_used": f"{mem_info.used / (1024**3):.1f}",
"bot_mem_mb": f"{bot_mem_mb:.2f}",
"disk_percent": f"{disk_usage.percent:.1f}",
"disk_total": f"{disk_usage.total / (1024**3):.1f}",
"disk_used": f"{disk_usage.used / (1024**3):.1f}",
"net_sent": f"{net_io.bytes_sent / (1024**2):.1f}",
"net_recv": f"{net_io.bytes_recv / (1024**2):.1f}",
}
except Exception as e:
logger.error(f"获取系统信息失败: {e}")
return {
"cpu_percent": "N/A",
"mem_percent": "N/A",
"mem_total": "N/A",
"mem_used": "N/A",
"bot_mem_mb": "N/A",
"disk_percent": "N/A",
"disk_total": "N/A",
"disk_used": "N/A",
"net_sent": "N/A",
"net_recv": "N/A",
}
@matcher.command("status", "状态")
@@ -60,18 +81,22 @@ async def handle_status(bot: Bot, event: MessageEvent, args: list[str]):
try:
# 1. 获取API信息 (增加独立错误处理)
# 尝试获取或更新 bot.nickname
if not hasattr(bot, "nickname") or not bot.nickname:
try:
# 优先使用 get_stranger_info 获取自身信息,比 get_login_info 更轻量
stranger_info = await bot.get_stranger_info(user_id=bot.self_id)
nickname = stranger_info.nickname
bot.nickname = stranger_info.nickname
except Exception as e:
logger.warning(f"获取 stranger_info 失败: {e}, 将回退到 login_info")
try:
login_info = await bot.get_login_info()
nickname = login_info.nickname
bot.nickname = login_info.nickname
except Exception as e2:
logger.warning(f"获取 login_info 也失败了: {e2}")
nickname = "获取失败"
bot.nickname = "获取失败"
nickname = bot.nickname
# 状态信息:如果能响应此命令,说明机器人必然在线且状态良好
# 这避免了依赖可能超时或未实现的 get_status API
@@ -138,14 +163,28 @@ async def handle_status(bot: Bot, event: MessageEvent, args: list[str]):
system_data = {
"cpu_percent": "Timeout",
"mem_percent": "Timeout",
"mem_total": "Timeout",
"mem_used": "Timeout",
"bot_mem_mb": "Timeout",
"disk_percent": "Timeout",
"disk_total": "Timeout",
"disk_used": "Timeout",
"net_sent": "Timeout",
"net_recv": "Timeout",
}
except Exception as e:
logger.error(f"获取系统信息异常: {e}")
system_data = {
"cpu_percent": "Error",
"mem_percent": "Error",
"mem_total": "Error",
"mem_used": "Error",
"bot_mem_mb": "Error",
"disk_percent": "Error",
"disk_total": "Error",
"disk_used": "Error",
"net_sent": "Error",
"net_recv": "Error",
}
# 5. 准备模板所需的所有数据

View File

@@ -223,12 +223,20 @@
</li>
<li class="info-item">
<span class="info-label">内存占用</span>
<span class="info-value">{{ system.mem_percent }}%</span>
<span class="info-value">{{ system.mem_percent }}% ({{ system.mem_used }}G / {{ system.mem_total }}G)</span>
</li>
<li class="info-item">
<span class="info-label">Bot 进程内存</span>
<span class="info-value">{{ system.bot_mem_mb }} MB</span>
</li>
<li class="info-item">
<span class="info-label">磁盘占用</span>
<span class="info-value">{{ system.disk_percent }}% ({{ system.disk_used }}G / {{ system.disk_total }}G)</span>
</li>
<li class="info-item">
<span class="info-label">网络流量 (↑/↓)</span>
<span class="info-value">{{ system.net_sent }}MB / {{ system.net_recv }}MB</span>
</li>
</ul>
</div>