from flask import Blueprint, render_template, jsonify, request, current_app from .auth import login_required import logging from robot_cmd.robot_command import GroupBotManager, Feature, PermissionStatus from datetime import datetime # 创建机器人管理蓝图 robot_bp = Blueprint('robot', __name__, url_prefix='/robot') logger = logging.getLogger("RobotBlueprint") # 机器人管理页面 @robot_bp.route('/') @login_required def robot_management(): return render_template('robot_management.html') # API路由 @robot_bp.route('/api/groups') @login_required def api_robot_groups(): try: server = current_app.dashboard_server # 获取所有群组列表 groups = GroupBotManager.get_group_list() # 如果方法返回None或发生异常,使用本地缓存 if groups is None and hasattr(GroupBotManager, "local_cache"): groups = GroupBotManager.local_cache.get("group_list", set()) # 如果仍然为None,则初始化为空集合 if groups is None: groups = set() logger.info(f"获取到 {len(groups)} 个群组") group_data = [] for group_id in groups: try: # 获取群名称,如果失败则使用默认值 group_name = server.contact_manager.get_nickname(group_id) if not group_name: group_name = f"未知群组({group_id})" # 获取机器人状态,如果失败则使用默认值 try: robot_status = GroupBotManager.get_group_permission(group_id, Feature.ROBOT) except: robot_status = PermissionStatus.UNKNOWN group_data.append({ "group_id": group_id, "group_name": group_name, "robot_status": robot_status.value if robot_status else "unknown" }) except Exception as e: logger.warning(f"处理群组 {group_id} 信息时出错: {e}") # 添加基本信息,避免单个群组错误影响整个列表 group_data.append({ "group_id": group_id, "group_name": "获取失败", "robot_status": "unknown" }) return jsonify({"success": True, "data": group_data}) except Exception as e: logger.error(f"获取群组列表失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @robot_bp.route('/api/group//permissions') @login_required def api_robot_group_permissions(group_id): try: permissions = GroupBotManager.list_group_permissions(group_id) permission_data = [] for feature, status in permissions.items(): permission_data.append({ "feature_id": feature.value, "feature_name": feature.name, "feature_description": feature.description, "status": status.value }) return jsonify({"success": True, "data": permission_data}) except Exception as e: logger.error(f"获取群组权限失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @robot_bp.route('/api/group//permissions', methods=['POST']) @login_required def api_update_robot_permissions(group_id): # 更新群组功能权限 server = current_app.dashboard_server data = request.json feature_id = data.get('feature_id') status = data.get('status') try: feature = Feature(int(feature_id)) new_status = PermissionStatus(status) # 特殊处理ROBOT功能 if feature == Feature.ROBOT: r = server.db_manager.get_redis_connection() if new_status == PermissionStatus.ENABLED: GroupBotManager.local_cache["group_list"].add(group_id) r.sadd("group:list", group_id) else: GroupBotManager.local_cache["group_list"].remove(group_id) r.srem("group:list", group_id) GroupBotManager.set_group_permission(group_id, feature, new_status) return jsonify({"success": True}) except Exception as e: logger.error(f"更新群组权限失败: {e}") return jsonify({"success": False, "error": str(e)}), 400 @robot_bp.route('/api/batch_operation', methods=['POST']) @login_required def api_robot_batch_operation(): # 批量操作接口 data = request.json operation = data.get('operation') group_ids = data.get('group_ids', []) results = {} try: if operation == 'remove_groups': for group_id in group_ids: result = GroupBotManager.remove_group(group_id) results[group_id] = result return jsonify({"success": True, "results": results}) else: return jsonify({"success": False, "error": "不支持的操作类型"}), 400 except Exception as e: logger.error(f"批量操作失败: {e}") return jsonify({"success": False, "error": str(e)}), 400 @robot_bp.route('/api/add_group', methods=['POST']) @login_required def api_add_group(): try: server = current_app.dashboard_server data = request.json group_id = data.get('group_id') if not group_id or not group_id.strip(): return jsonify({"success": False, "error": "群组ID不能为空"}), 400 group_id = group_id.strip() # 检查群组是否已存在 if group_id in GroupBotManager.local_cache["group_list"]: return jsonify({"success": False, "error": "该群组已存在"}), 400 # 添加群组到列表并启用机器人功能 GroupBotManager.local_cache["group_list"].add(group_id) r = server.db_manager.get_redis_connection() r.sadd("group:list", group_id) # 设置ROBOT功能为启用状态 GroupBotManager.set_group_permission(group_id, Feature.ROBOT, PermissionStatus.ENABLED) # 获取群组名称(如果可能) group_name = server.contact_manager.get_nickname(group_id) return jsonify({ "success": True, "message": f"群组 {group_id} 已成功添加", "group": { "group_id": group_id, "group_name": group_name, "robot_status": "enabled" } }) except Exception as e: logger.error(f"添加群组失败: {e}") return jsonify({"success": False, "error": str(e)}), 500 @robot_bp.route('/api/group//message_trend') @login_required def api_group_message_trend(group_id): try: server = current_app.dashboard_server days = request.args.get('days', 7, type=int) trend_data = server.message_storage.get_message_trend(group_id, days) # 格式化数据为前端需要的格式 dates = [] counts = [] for item in trend_data: # 将日期转换为字符串 if isinstance(item['date'], datetime): date_str = item['date'].strftime('%Y-%m-%d') else: date_str = str(item['date']) dates.append(date_str) counts.append(item['message_count']) return jsonify({ 'success': True, 'data': { 'dates': dates, 'counts': counts } }) except Exception as e: logger.error(f"获取群组消息趋势数据出错: {e}") return jsonify({'success': False, 'error': str(e)}), 500