273 lines
10 KiB
Python
273 lines
10 KiB
Python
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/<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 = 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()
|
||
#如果group_id 不是@chatroom 结尾,这提示错误
|
||
if not group_id.endswith("@chatroom"):
|
||
return jsonify({"success": False, "error": "群组ID必须以 @chatroom 结尾"}), 400
|
||
|
||
# 检查群组是否已存在
|
||
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 = 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
|
||
|
||
# 添加缺失的群组状态更新接口
|
||
@robot_bp.route('/api/group/<group_id>/status', methods=['POST'])
|
||
@login_required
|
||
def api_update_group_status(group_id):
|
||
try:
|
||
server = current_app.dashboard_server
|
||
data = request.json
|
||
status = data.get('status')
|
||
|
||
if status == 'disabled':
|
||
# 禁用该群组的所有功能
|
||
logger.info(f"正在禁用群组 {group_id} 的所有功能")
|
||
|
||
# 获取所有功能并禁用
|
||
for feature in Feature:
|
||
GroupBotManager.set_group_permission(group_id, feature, PermissionStatus.DISABLED)
|
||
|
||
# 特殊处理ROBOT功能,从群组列表中移除
|
||
if group_id in GroupBotManager.local_cache["group_list"]:
|
||
GroupBotManager.local_cache["group_list"].remove(group_id)
|
||
|
||
# 从Redis中移除
|
||
r = server.db_manager.get_redis_connection()
|
||
r.srem("group:list", group_id)
|
||
|
||
return jsonify({
|
||
"success": True,
|
||
"message": f"群组 {group_id} 的所有功能已禁用"
|
||
})
|
||
elif status == 'enabled':
|
||
# 启用该群组的基本功能
|
||
logger.info(f"正在启用群组 {group_id} 的基本功能")
|
||
|
||
# 添加到群组列表
|
||
if group_id not in GroupBotManager.local_cache["group_list"]:
|
||
GroupBotManager.local_cache["group_list"].add(group_id)
|
||
|
||
# 添加到Redis
|
||
r = server.db_manager.get_redis_connection()
|
||
r.sadd("group:list", group_id)
|
||
|
||
# 启用ROBOT基本功能
|
||
GroupBotManager.set_group_permission(group_id, Feature.ROBOT, PermissionStatus.ENABLED)
|
||
|
||
return jsonify({
|
||
"success": True,
|
||
"message": f"群组 {group_id} 的基本功能已启用"
|
||
})
|
||
else:
|
||
return jsonify({
|
||
"success": False,
|
||
"error": "不支持的状态值,只接受 'enabled' 或 'disabled'"
|
||
}), 400
|
||
|
||
except Exception as e:
|
||
logger.error(f"更新群组状态失败: {e}")
|
||
return jsonify({"success": False, "error": str(e)}), 500 |