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 def _is_emoji_message(msg: dict) -> bool: message_type = str(msg.get('message_type', '')) content = msg.get('content') or '' xml_markers = ('', '' 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