131 lines
4.7 KiB
Python
131 lines
4.7 KiB
Python
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 '<refermsg>' 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
|