from flask import Blueprint, render_template, jsonify, request, current_app from .auth import login_required from loguru import logger import xml.etree.ElementTree as ET from datetime import datetime from utils.message_formatter import format_quote_message # 创建消息管理蓝图 messages_bp = Blueprint('messages', __name__) logger = logger # 消息列表页面 @messages_bp.route('/messages') @login_required def message_list_page(): """消息列表页面""" return render_template('message_list.html') # API路由 @messages_bp.route('/api/messages', methods=['GET']) @login_required def get_messages(): """获取消息列表API""" try: server = current_app.dashboard_server # 获取查询参数 group_id = request.args.get('group_id') start_date = request.args.get('start_date', datetime.now().strftime('%Y-%m-%d')) end_date = request.args.get('end_date', datetime.now().strftime('%Y-%m-%d')) search_text = request.args.get('search_text') page = int(request.args.get('page', 1)) page_size = int(request.args.get('page_size', 20)) # 调用数据库方法获取消息 result = server.message_storage.get_messages_by_filter( group_id=group_id, start_date=start_date, end_date=end_date, search_text=search_text, page=page, page_size=page_size ) # 处理消息数据,添加群组名称和发送者昵称,并格式化引用消息 for msg in result['messages']: # 获取群组名称 msg['group_name'] = server.contact_manager.get_nickname(msg['group_id']) or msg['group_id'] # 获取发送者昵称 msg['sender_name'] = server.contact_manager.get_group_name(msg['group_id'], msg['sender']) or msg['sender'] # 处理消息内容,格式化引用消息 if msg['message_type'] == "49" and msg['content']: # 应用消息类型 try: # 检查是否为引用消息 if '' in msg['content']: # 使用格式化工具处理引用消息 msg['content'] = format_quote_message(msg['content']) else: # 其他类型的应用消息,解析 XML 提取标题 root = ET.fromstring(msg['content']) title_elem = root.find('.//title') if title_elem is not None: msg['content'] = title_elem.text except Exception as e: logger.error(f"解析消息类型49出错: {e}") return jsonify(result) except Exception as e: logger.error(f"获取消息列表失败: {e}") return jsonify({'error': str(e)}), 500 @messages_bp.route('/api/groups', methods=['GET']) @login_required def get_groups(): """获取群组列表API""" try: server = current_app.dashboard_server # 获取机器人管理的群组列表 groups = [] for group_id in server.contact_manager.get_contacts(): if '@chatroom' in group_id: groups.append({ 'group_id': group_id, 'group_name': server.contact_manager.get_nickname(group_id) or group_id }) return jsonify({'groups': groups}) except Exception as e: logger.error(f"获取群组列表失败: {e}") return jsonify({'error': str(e)}), 500 @messages_bp.route('/api/hourly_message_trend', methods=['GET']) @login_required def get_hourly_message_trend(): """获取按小时聊天趋势数据API""" try: server = current_app.dashboard_server # 获取查询参数 group_id = request.args.get('group_id') days = int(request.args.get('days', 1)) # 调用数据库方法获取按小时消息趋势数据 trend_data = server.message_storage.get_hourly_message_trend(group_id=group_id, days=days) # 格式化数据为前端需要的格式 hours = [] counts = [] for item in trend_data: hours.append(item['hour_slot']) counts.append(item['message_count']) # 获取群组名称 group_name = server.contact_manager.get_nickname(group_id) if group_id else "所有群组" return jsonify({ 'success': True, 'data': { 'hours': hours, 'counts': counts, 'group_name': group_name } }) except Exception as e: logger.error(f"获取按小时聊天趋势数据失败: {e}") return jsonify({'success': False, 'error': str(e)}), 500