加入菜单设置功能

This commit is contained in:
liuwei
2026-01-16 16:02:55 +08:00
parent c3e508a498
commit adeef0b928
2 changed files with 87 additions and 7 deletions

View File

@@ -5,4 +5,16 @@ command-format = """
📝功能菜单指令:
菜单 - 显示功能菜单
菜单 状态 - 显示功能状态
菜单 群列表 - 显示所有启用机器人的群组
🔧管理员指令(需要管理员权限):
菜单 启用 序号 - 启用指定功能
菜单 关闭 序号 - 关闭指定功能
菜单 启用 功能名 - 启用指定功能
菜单 关闭 功能名 - 关闭指定功能
示例:
菜单 启用 1 - 启用群机器人(总开关)
菜单 关闭 2 - 关闭每日新闻播报
菜单 启用 PDF_CAPABILITY - 启用PDF能力
"""

View File

@@ -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