From adeef0b9285ac6c2a4aba237899d09794e4ac6e6 Mon Sep 17 00:00:00 2001 From: liuwei Date: Fri, 16 Jan 2026 16:02:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E8=8F=9C=E5=8D=95=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/robot_menu/config.toml | 12 +++++ plugins/robot_menu/main.py | 82 +++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/plugins/robot_menu/config.toml b/plugins/robot_menu/config.toml index 7da0887..265c5f2 100644 --- a/plugins/robot_menu/config.toml +++ b/plugins/robot_menu/config.toml @@ -5,4 +5,16 @@ command-format = """ 📝功能菜单指令: 菜单 - 显示功能菜单 菜单 状态 - 显示功能状态 +菜单 群列表 - 显示所有启用机器人的群组 + +🔧管理员指令(需要管理员权限): +菜单 启用 序号 - 启用指定功能 +菜单 关闭 序号 - 关闭指定功能 +菜单 启用 功能名 - 启用指定功能 +菜单 关闭 功能名 - 关闭指定功能 + +示例: +菜单 启用 1 - 启用群机器人(总开关) +菜单 关闭 2 - 关闭每日新闻播报 +菜单 启用 PDF_CAPABILITY - 启用PDF能力 """ diff --git a/plugins/robot_menu/main.py b/plugins/robot_menu/main.py index 6505247..e8580f6 100644 --- a/plugins/robot_menu/main.py +++ b/plugins/robot_menu/main.py @@ -160,32 +160,100 @@ class RobotMenuPlugin(MessagePluginInterface): bot: WechatAPIClient = message.get("bot") revoke: MessageAutoRevoke = message.get("revoke") + if not bot: + self.LOG.error("WechatAPIClient 未初始化") + return False, "Bot 未初始化" + # 检查权限 if roomid and gbm.get_group_permission(roomid, self.feature) == PermissionStatus.DISABLED: return False, "没有权限" + target = roomid if roomid else sender + # 检查命令格式 - if len(content.split(" ")) == 1: + parts = content.split() + if len(parts) == 1: # 显示功能菜单 menu_text = self.get_enabled_features(roomid if roomid else sender) - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), - menu_text, sender) - revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 90) + client_msg_id, create_time, new_msg_id = await bot.send_text_message(target, menu_text, sender) + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 90) return True, "显示功能菜单" # 提取命令名 cmd_name = content[len(command):].strip() + try: # 处理特殊命令 if cmd_name.upper() == "状态": # 显示所有功能状态 status_text = self.display_menu_status(roomid if roomid else sender) - client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), - status_text, sender) - revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 90) + client_msg_id, create_time, new_msg_id = await bot.send_text_message(target, status_text, sender) + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 90) return True, "显示功能状态" + # 处理群列表命令 + if cmd_name.upper() == "群列表": + group_list_text = self.get_group_list() + client_msg_id, create_time, new_msg_id = await bot.send_text_message(target, group_list_text, sender) + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 90) + return True, "显示群列表" + + # 处理功能启用/关闭命令 + # 格式:菜单 启用 功能名 或 菜单 关闭 功能名 + if len(parts) >= 3 and parts[1] in ["启用", "关闭"]: + # 检查管理员权限 + if not self._is_admin(sender, gbm): + await bot.send_at_message(target, "❌权限不足,只有管理员可以管理功能", [sender]) + return True, "权限不足" + + action = parts[1] + feature_identifier = " ".join(parts[2:]) # 支持带空格的功能名 + + # 构造命令字符串,调用 GroupBotManager.handle_command + # 尝试作为序号 + if feature_identifier.isdigit(): + command_str = f"{feature_identifier}-{action}" + else: + # 尝试作为功能名 + # 查找匹配的功能枚举 + matched_feature = None + for feature in Feature: + # 尝试通过枚举名称匹配 + if feature.name.lower() == feature_identifier.lower(): + matched_feature = feature + break + # 尝试通过序号匹配 + if str(feature.value) == feature_identifier: + matched_feature = feature + break + + if matched_feature: + command_str = f"{matched_feature.value}-{action}" + else: + # 直接使用功能标识符(可能是序号或功能名) + command_str = f"{feature_identifier}-{action}" + + # 调用 GroupBotManager 处理命令 + result = gbm.handle_command(roomid if roomid else sender, command_str) + + client_msg_id, create_time, new_msg_id = await bot.send_text_message(target, result, sender) + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 90) + return True, "处理功能命令" + + # 如果是其他未知命令,显示帮助 + help_text = f"❌命令格式错误!\n{self.command_format}" + client_msg_id, create_time, new_msg_id = await bot.send_text_message(target, help_text, sender) + revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 90) + return True, "命令格式错误" + except Exception as e: self.LOG.error(f"处理功能请求出错: {e}") + import traceback + self.LOG.error(traceback.format_exc()) return False, f"处理出错: {e}" + + def _is_admin(self, user_id: str, gbm: GroupBotManager) -> bool: + """检查用户是否为管理员""" + admin_list = gbm.get_admin_list() if gbm else [] + return user_id in admin_list