Files
abot/admin/dashboard/blueprints/messages.py
2025-04-30 13:22:33 +08:00

91 lines
3.5 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_nickname(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