feat: improve system message display in dashboard

This commit is contained in:
liuwei
2026-04-13 15:30:33 +08:00
parent fc43321f94
commit d581b9650e
4 changed files with 179 additions and 8 deletions

View File

@@ -48,6 +48,40 @@ def _extract_emoji_preview_url(xml_text: str) -> str:
return ''
def _parse_sysmsg_payload(content: str) -> dict:
payload = {
"sysmsg_type": "",
"summary": "",
"replace_msg": "",
"session": "",
"msgid": "",
"newmsgid": "",
}
text = str(content or "").strip()
if not text.startswith("<sysmsg"):
return payload
try:
root = ET.fromstring(text)
except Exception:
payload["summary"] = text
return payload
payload["sysmsg_type"] = str(root.attrib.get("type", "")).strip()
if payload["sysmsg_type"] == "revokemsg":
revoke_node = root.find("revokemsg")
if revoke_node is not None:
payload["session"] = str(revoke_node.findtext("session", "") or "").strip()
payload["msgid"] = str(revoke_node.findtext("msgid", "") or "").strip()
payload["newmsgid"] = str(revoke_node.findtext("newmsgid", "") or "").strip()
payload["replace_msg"] = str(revoke_node.findtext("replacemsg", "") or "").strip()
payload["summary"] = payload["replace_msg"] or "撤回了一条消息"
return payload
payload["summary"] = str(root.findtext(".//content", "") or "").strip() or text
return payload
def _proxy_remote_media(target_url: str) -> Response:
if not target_url:
return Response("missing url", status=400)
@@ -118,12 +152,25 @@ def get_messages():
# 处理消息数据,添加群组名称和发送者昵称,并格式化引用消息
for msg in result['messages']:
raw_content = str(msg.get('content') or '')
# 获取群组名称
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 raw_content.startswith("<sysmsg"):
sysmsg_payload = _parse_sysmsg_payload(raw_content)
msg['content'] = sysmsg_payload.get('summary') or '[系统消息]'
msg['message_xml'] = raw_content
msg['sysmsg_type'] = sysmsg_payload.get('sysmsg_type', '')
msg['sysmsg_summary'] = sysmsg_payload.get('summary', '')
msg['sysmsg_replace_msg'] = sysmsg_payload.get('replace_msg', '')
msg['sysmsg_session'] = sysmsg_payload.get('session', '')
msg['sysmsg_msgid'] = sysmsg_payload.get('msgid', '')
msg['sysmsg_newmsgid'] = sysmsg_payload.get('newmsgid', '')
continue
if _is_emoji_message(msg):
msg['content'] = '[表情]'
msg['emoji_preview_url'] = msg.get('image_path') or _extract_emoji_preview_url(msg.get('attachment_url', ''))