管理后台 server 使用蓝图模式,降低维护成本,降低修改功能时对其他模块的影响
This commit is contained in:
212
admin/dashboard/blueprints/robot.py
Normal file
212
admin/dashboard/blueprints/robot.py
Normal file
@@ -0,0 +1,212 @@
|
||||
from flask import Blueprint, render_template, jsonify, request
|
||||
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 = robot_bp.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/<group_id>/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/<group_id>/permissions', methods=['POST'])
|
||||
@login_required
|
||||
def api_update_robot_permissions(group_id):
|
||||
# 更新群组功能权限
|
||||
server = robot_bp.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 = robot_bp.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/<group_id>/message_trend')
|
||||
@login_required
|
||||
def api_group_message_trend(group_id):
|
||||
try:
|
||||
server = robot_bp.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
|
||||
Reference in New Issue
Block a user