ForcePilot/backend/package/yuxi/channels/adapters/qqbot/commands/builtin.py
Kris 1f78c44b03 refactor: 整理并清理项目中的冗余代码与格式问题
这是一个批量整理提交,包含以下主要改动:
1.  删除多处冗余的空行和未使用的导入
2.  修复文件末尾缺少换行符的问题
3.  调整部分模块的导入顺序与代码排版
4.  修复部分配置默认值与策略逻辑
5.  新增多个功能模块与辅助工具
6.  完善异常处理与日志记录
7.  修复速率限制、消息缓存、权限校验等逻辑bug
8.  废弃部分旧有API与配置项并添加警告提示
2026-05-12 14:51:53 +08:00

142 lines
4.4 KiB
Python

from __future__ import annotations
import time
from .framework import CommandContext, CommandRegistry, CommandResult
_start_time = time.time()
_QQBOT_CMD_INPUT_TAG = "<qqbot-cmd-input>"
_QQBOT_CMD_ENTER_TAG = "<qqbot-cmd-enter>"
async def _cmd_ping(ctx: CommandContext) -> CommandResult:
uptime = time.time() - _start_time
hours = int(uptime // 3600)
minutes = int((uptime % 3600) // 60)
seconds = int(uptime % 60)
msg = ctx.msg
user = msg.identity.channel_user_id or "Unknown"
return CommandResult(
success=True,
message=f"Pong! 在线时间: {hours}h {minutes}m {seconds}s\n发送者: {user}",
)
async def _cmd_version(ctx: CommandContext) -> CommandResult:
adapter = ctx.adapter
version = getattr(adapter, "_plugin_version", "1.0.0")
extra: dict[str, str] = {}
bot_info = getattr(adapter, "_bot_info", None)
if bot_info:
extra["BotID"] = bot_info.get("id", "")
extra["BotName"] = bot_info.get("username", "")
parts = [f"版本: {version}"]
for k, v in extra.items():
if v:
parts.append(f"{k}: {v}")
return CommandResult(success=True, message="\n".join(parts))
async def _cmd_help(ctx: CommandContext) -> CommandResult:
registry = ctx.adapter._command_registry if hasattr(ctx.adapter, "_command_registry") else None
if registry is None:
return CommandResult(success=True, message="命令系统未初始化。")
is_group = getattr(ctx.msg, "chat_type", None)
is_group_val = str(is_group) == "ChatType.GROUP" or (
hasattr(is_group, "value") and is_group.value == "group"
)
lines = ["可用命令:"]
seen: set[str] = set()
for name in sorted(registry.command_names):
cmd = registry._commands.get(name)
if cmd is None or name in seen:
continue
if name.startswith("_") or name != cmd.name:
continue
seen.add(name)
hidden = cmd.metadata.get("hidden_in_group", False) if hasattr(cmd, "metadata") else False
if is_group_val and hidden:
continue
desc = cmd.description or "(无描述)"
usage = f" - 用法: {cmd.usage}" if cmd.usage else ""
cmd_display = f"{_QQBOT_CMD_INPUT_TAG}/{name}{_QQBOT_CMD_ENTER_TAG}"
lines.append(f" {cmd_display} - {desc}{usage}")
return CommandResult(success=True, message="\n".join(lines))
async def _cmd_status(ctx: CommandContext) -> CommandResult:
adapter = ctx.adapter
status = getattr(adapter, "status", "unknown")
reconnect = getattr(adapter, "_reconnect_manager", None)
reconnect_state = reconnect.state.name if reconnect else "N/A"
circuit_breaker = getattr(adapter, "_circuit_breaker", None)
cb_state = "open" if circuit_breaker and circuit_breaker.is_open else "closed"
return CommandResult(
success=True,
message=(f"状态: {status}\n重连状态: {reconnect_state}\n熔断器: {cb_state}"),
)
async def _cmd_clearlogs(ctx: CommandContext) -> CommandResult:
adapter = ctx.adapter
known_users = getattr(adapter, "_known_users", None)
group_buffer = getattr(adapter, "_group_buffer", None)
if known_users:
known_users.clear()
if group_buffer:
group_buffer.gc()
return CommandResult(success=True, message="日志已清理(已知用户记录 + 过期群聊缓冲)。")
def register_builtin_commands(registry: CommandRegistry) -> CommandRegistry:
registry.register(
name="bot-ping",
handler=_cmd_ping,
description="检测 Bot 是否在线",
usage="/bot-ping",
aliases=["ping", "p"],
)
registry.register(
name="bot-version",
handler=_cmd_version,
description="显示 Bot 版本信息",
usage="/bot-version",
aliases=["version", "v"],
)
registry.register(
name="bot-help",
handler=_cmd_help,
description="显示所有可用命令",
usage="/bot-help",
aliases=["help", "h"],
)
registry.register(
name="bot-status",
handler=_cmd_status,
description="查看 Bot 运行状态",
usage="/bot-status",
aliases=["status", "st"],
)
registry.register(
name="bot-clearlogs",
handler=_cmd_clearlogs,
description="清理运行日志和缓存",
usage="/bot-clearlogs",
aliases=["clearlogs"],
)
return registry