feat: 重构核心架构,增强类型安全与插件管理
本次提交对核心模块进行了深度重构,引入 Pydantic 增强配置管理的类型安全性,并全面优化了插件管理系统。 主要变更详情: 1. 核心架构与配置 - 重构配置加载模块:引入 Pydantic 模型 (`core/config_models.py`),提供严格的配置项类型检查、验证及默认值管理。 - 统一模块结构:规范化模块导入路径,移除冗余的 `__init__.py` 文件,提升项目结构的清晰度。 - 性能优化:集成 Redis 缓存支持 (`RedisManager`),有效降低高频 API 调用开销,提升响应速度。 2. 插件系统升级 - 实现热重载机制:新增插件文件变更监听功能,支持开发过程中自动重载插件,提升开发效率。 - 优化生命周期管理:改进插件加载与卸载逻辑,支持精确卸载指定插件及其关联的命令、事件处理器和定时任务。 3. 功能特性增强 - 新增媒体 API:引入 `MediaAPI` 模块,封装图片、语音等富媒体资源的获取与处理接口。 - 完善权限体系:重构权限管理系统,实现管理员与操作员的分级控制,支持更细粒度的命令权限校验。 4. 代码质量与稳定性 - 全面类型修复:解决 `mypy` 静态类型检查发现的大量类型错误(包括 `CommandManager`、`EventFactory` 及 `Bot` API 签名不匹配问题)。 - 增强错误处理:优化消息处理管道的异常捕获机制,完善关键路径的日志记录,提升系统运行稳定性。
This commit is contained in:
132
plugins/admin.py
132
plugins/admin.py
@@ -1,74 +1,94 @@
|
||||
"""
|
||||
管理员管理插件
|
||||
|
||||
提供通过聊天指令动态添加或移除机器人管理员的功能。
|
||||
"""
|
||||
from core.bot import Bot
|
||||
from core.managers.command_manager import matcher
|
||||
from core.managers.admin_manager import admin_manager
|
||||
from core.handlers.event_handler import MessageHandler
|
||||
from core.managers import command_manager, permission_manager
|
||||
from core.permission import Permission
|
||||
from models.events.message import MessageEvent
|
||||
|
||||
# 更新插件元信息以包含OP管理
|
||||
__plugin_meta__ = {
|
||||
"name": "管理员管理",
|
||||
"description": "管理机器人的全局管理员",
|
||||
"name": "权限管理",
|
||||
"description": "管理机器人的管理员和操作员",
|
||||
"usage": (
|
||||
"/admin list - 列出所有管理员\n"
|
||||
"/admin add <QQ号> - 添加管理员\n"
|
||||
"/admin remove <QQ号> - 移除管理员"
|
||||
"/admin list - 列出所有管理员和操作员\n"
|
||||
"/admin add_admin <QQ号> - 添加管理员\n"
|
||||
"/admin remove_admin <QQ号> - 移除管理员\n"
|
||||
"/admin add_op <QQ号> - 添加操作员\n"
|
||||
"/admin remove_op <QQ号> - 移除操作员"
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
@matcher.command("admin", permission=MessageEvent.ADMIN)
|
||||
async def admin_command_handler(bot: Bot, event: MessageEvent, args: list[str]):
|
||||
@command_manager.command("admin", permission=Permission.ADMIN)
|
||||
async def admin_management(event: MessageEvent, args: str):
|
||||
"""
|
||||
处理 /admin 指令
|
||||
|
||||
:param bot: Bot 实例
|
||||
:param event: 消息事件实例
|
||||
:param args: 指令参数列表
|
||||
处理所有权限管理相关的命令。
|
||||
"""
|
||||
if not args:
|
||||
await event.reply(__plugin_meta__["usage"])
|
||||
parts = args.split()
|
||||
if not parts:
|
||||
await event.reply(f"用法不正确。\n\n{__plugin_meta__['usage']}")
|
||||
return
|
||||
|
||||
action = args[0].lower()
|
||||
subcommand = parts[0].lower()
|
||||
|
||||
if action == "list":
|
||||
admins = await admin_manager.get_all_admins()
|
||||
if not admins:
|
||||
await event.reply("当前没有设置任何管理员。")
|
||||
return
|
||||
|
||||
admin_list_text = "\n".join(str(admin_id) for admin_id in admins)
|
||||
await event.reply(f"当前管理员列表 ({len(admins)}):\n{admin_list_text}")
|
||||
if subcommand == "list":
|
||||
await list_permissions(event)
|
||||
return
|
||||
|
||||
if action in ("add", "remove"):
|
||||
if len(args) < 2 or not args[1].isdigit():
|
||||
await event.reply("参数错误,请提供一个有效的 QQ 号。\n示例: /admin add 123456")
|
||||
return
|
||||
# 处理需要QQ号的命令
|
||||
if len(parts) < 2 or not parts[1].isdigit():
|
||||
await event.reply(f"请提供有效的用户QQ号。\n用法: /admin {subcommand} <QQ号>")
|
||||
return
|
||||
|
||||
try:
|
||||
user_id = int(args[1])
|
||||
except ValueError:
|
||||
await event.reply("无效的 QQ 号,请输入纯数字。")
|
||||
return
|
||||
try:
|
||||
target_user_id = int(parts[1])
|
||||
except ValueError:
|
||||
await event.reply("无效的QQ号。")
|
||||
return
|
||||
|
||||
if action == "add":
|
||||
success = await admin_manager.add_admin(user_id)
|
||||
if success:
|
||||
await event.reply(f"成功添加管理员: {user_id}")
|
||||
else:
|
||||
await event.reply(f"管理员 {user_id} 已存在,无需重复添加。")
|
||||
return
|
||||
|
||||
elif action == "remove":
|
||||
success = await admin_manager.remove_admin(user_id)
|
||||
if success:
|
||||
await event.reply(f"成功移除管理员: {user_id}")
|
||||
else:
|
||||
await event.reply(f"管理员 {user_id} 不存在。")
|
||||
return
|
||||
# 安全检查
|
||||
if target_user_id == event.user_id:
|
||||
await event.reply("你不能操作自己的权限。")
|
||||
return
|
||||
if target_user_id == event.self_id:
|
||||
await event.reply("你不能操作机器人自身的权限。")
|
||||
return
|
||||
|
||||
await event.reply(f"未知的指令: {action}\n\n{__plugin_meta__['usage']}")
|
||||
# 根据子命令分发
|
||||
if subcommand == "add_admin":
|
||||
permission_manager.set_user_permission(target_user_id, Permission.ADMIN)
|
||||
await event.reply(f"已成功添加管理员:{target_user_id}")
|
||||
elif subcommand == "remove_admin":
|
||||
permission_manager.set_user_permission(target_user_id, Permission.USER)
|
||||
await event.reply(f"已成功移除管理员:{target_user_id}")
|
||||
elif subcommand == "add_op":
|
||||
permission_manager.set_user_permission(target_user_id, Permission.OP)
|
||||
await event.reply(f"已成功添加操作员:{target_user_id}")
|
||||
elif subcommand == "remove_op":
|
||||
permission_manager.set_user_permission(target_user_id, Permission.USER)
|
||||
await event.reply(f"已成功移除操作员:{target_user_id}")
|
||||
else:
|
||||
await event.reply(f"未知的子命令 '{subcommand}'。\n\n{__plugin_meta__['usage']}")
|
||||
|
||||
|
||||
async def list_permissions(event: MessageEvent):
|
||||
"""
|
||||
列出所有具有特殊权限(管理员和操作员)的用户。
|
||||
"""
|
||||
permissions = permission_manager.get_all_user_permissions()
|
||||
if not permissions:
|
||||
await event.reply("当前没有配置任何特殊权限的用户。")
|
||||
return
|
||||
|
||||
admins = {uid for uid, p in permissions.items() if p == 'admin'}
|
||||
ops = {uid for uid, p in permissions.items() if p == 'op'}
|
||||
|
||||
reply_msg = "当前权限列表:\n"
|
||||
if admins:
|
||||
reply_msg += "--- 管理员 ---\n"
|
||||
for user_id in admins:
|
||||
reply_msg += f"- {user_id}\n"
|
||||
if ops:
|
||||
reply_msg += "--- 操作员 ---\n"
|
||||
for user_id in ops:
|
||||
reply_msg += f"- {user_id}\n"
|
||||
|
||||
await event.reply(reply_msg.strip())
|
||||
|
||||
Reference in New Issue
Block a user