diff --git a/admin/dashboard/blueprints/plugin_routes.py b/admin/dashboard/blueprints/plugin_routes.py index 682fceb..40d3dde 100644 --- a/admin/dashboard/blueprints/plugin_routes.py +++ b/admin/dashboard/blueprints/plugin_routes.py @@ -7,11 +7,42 @@ from flask import Blueprint, request, jsonify, render_template, current_app from admin.dashboard.blueprints.auth import login_required from utils.robot_cmd.robot_command import GroupBotManager, PermissionStatus +from plugins.robot_menu.menu_render_tool import RobotMenuRenderTool # 创建蓝图 plugin_routes = Blueprint('plugin_routes', __name__) LOG = logger +# 后台命令索引页只复用“命令目录生成”能力,不需要图片渲染, +# 因此这里固定使用轻量 text 配置创建一个工具实例即可。 +_command_catalog_tool = RobotMenuRenderTool( + output_mode="text", + image_fallback_to_text=True, + image_render_timeout_seconds=30, + image_render_retries=1, + image_template_path="plugins/robot_menu/templates/menu_cards.html", + log=LOG, +) + + +def _build_group_options(server) -> list: + """构建后台命令索引页的群组选项列表。""" + group_ids = sorted(set(GroupBotManager.get_group_list() or [])) + options = [] + for group_id in group_ids: + group_name = "" + try: + group_name = server.contact_manager.get_nickname(group_id) or "" + except Exception: + group_name = "" + options.append( + { + "group_id": group_id, + "group_name": str(group_name or group_id), + } + ) + return options + # 机器人管理页面 @plugin_routes.route('/plugins_manage') @@ -20,6 +51,13 @@ def robot_management(): return render_template('plugins_manage.html') +@plugin_routes.route('/command_catalog') +@login_required +def command_catalog_page(): + """后台命令索引页面。""" + return render_template('command_catalog.html') + + @plugin_routes.route('/api/plugins', methods=['GET']) @login_required def get_plugins(): @@ -37,6 +75,37 @@ def get_plugins(): return jsonify({"success": False, "message": f"获取插件列表失败: {str(e)}"}) +@plugin_routes.route('/api/plugins/command_catalog', methods=['GET']) +@login_required +def get_command_catalog(): + """获取后台命令索引数据。""" + try: + server = current_app.dashboard_server + group_id = str(request.args.get('group_id') or '').strip() + + # 后台命令索引默认站在“管理员”视角, + # 这样既能看到当前可用命令,也能看到未启用能力和管理指令。 + catalog = _command_catalog_tool.build_command_catalog_data( + group_id=group_id, + requester_id="dashboard_admin", + force_admin=True, + ) + data = { + **catalog, + "group_options": _build_group_options(server), + "summary": { + "available_manual_count": len(catalog.get("available_manual", []) or []), + "available_auto_count": len(catalog.get("available_auto", []) or []), + "unavailable_manual_count": len(catalog.get("unavailable_manual", []) or []), + "admin_command_count": len(catalog.get("admin_commands", []) or []), + }, + } + return jsonify({"success": True, "data": data}) + except Exception as e: + LOG.error(f"获取命令索引失败: {str(e)}", exc_info=True) + return jsonify({"success": False, "message": f"获取命令索引失败: {str(e)}"}) + + @plugin_routes.route('/api/plugins/group_status', methods=['GET']) @login_required def get_plugin_group_status(): diff --git a/admin/dashboard/templates/base.html b/admin/dashboard/templates/base.html index eca0f07..84133bc 100644 --- a/admin/dashboard/templates/base.html +++ b/admin/dashboard/templates/base.html @@ -1012,6 +1012,7 @@ items: [ { label: '插件统计', path: '/plugins' }, { label: '插件管理', path: '/plugins_manage' }, + { label: '命令索引', path: '/command_catalog' }, { label: '插件定时任务', path: '/plugin_schedules' }, { label: '群级插件配置', path: '/group_plugin_config' }, { label: '响应指令管理', path: '/fun_command_rules' }, @@ -1152,6 +1153,7 @@ '12': '/virtual_group', '13': '/api_docs', '14': '/system_status', + '18': '/command_catalog', '17': '/system_llm', '15': '/file_browser', '16': '/message_push' diff --git a/admin/dashboard/templates/command_catalog.html b/admin/dashboard/templates/command_catalog.html new file mode 100644 index 0000000..f00ee7c --- /dev/null +++ b/admin/dashboard/templates/command_catalog.html @@ -0,0 +1,478 @@ +{% extends "base.html" %} + +{% block title %}命令索引 - 机器人管理后台{% endblock %} + +{% block content %} +
集中查看当前插件命令、群可用状态、自动能力与管理员触发示例,减少靠记忆找功能的成本。
+支持按命令、插件名、描述关键词快速定位。
+这里展示的是当前群在管理员视角下“真实可触发”的命令入口。
+这部分只在后台管理员视角展示,便于你知道还有哪些能力没在当前群打开。
+用于提醒你哪些功能不是靠用户发命令触发,而是自动执行。
+给管理员的常用操作命令,适合快速开关功能和维护群管理员。
+