feat: improve system message display in dashboard
This commit is contained in:
@@ -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', ''))
|
||||
|
||||
Reference in New Issue
Block a user