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

@@ -95,6 +95,50 @@ def _parse_app_message_payload(content: str):
return payload
def _parse_sys_message_payload(content: str):
payload = {
"sysmsg_type": "",
"summary": "",
"replace_msg": "",
"session": "",
"msgid": "",
"newmsgid": ""
}
text = _safe_text(content).strip()
if not text.startswith("<sysmsg"):
payload["summary"] = text
return payload
try:
root = ET.fromstring(text)
except Exception:
payload["summary"] = text
return payload
payload["sysmsg_type"] = _safe_text(root.attrib.get("type")).strip()
if payload["sysmsg_type"] == "revokemsg":
revoke_node = root.find("revokemsg")
if revoke_node is not None:
payload["session"] = _safe_text(revoke_node.findtext("session")).strip()
payload["msgid"] = _safe_text(revoke_node.findtext("msgid")).strip()
payload["newmsgid"] = _safe_text(revoke_node.findtext("newmsgid")).strip()
payload["replace_msg"] = _safe_text(revoke_node.findtext("replacemsg")).strip()
payload["summary"] = payload["replace_msg"] or "撤回了一条消息"
return payload
payload["summary"] = _safe_text(root.findtext(".//content")).strip() or text
return payload
def _compact_media_caption(content: str, fallback: str) -> str:
text = _safe_text(content).strip()
if not text:
return fallback
if text.startswith("<"):
return fallback
return text
def _normalize_recent_message(server, raw_message: dict, chat_type: str, target_wxid: str):
sender = _safe_text(raw_message.get("sender")).strip()
message_type = str(raw_message.get("message_type", ""))
@@ -117,16 +161,16 @@ def _normalize_recent_message(server, raw_message: dict, chat_type: str, target_
if message_type == "3":
display_type = "image"
display_content = content or "[图片]"
display_content = _compact_media_caption(content, "[图片]")
elif message_type in {"47", "1048625", "1090519089"}:
display_type = "image" if media_url else "text"
display_content = content or "[表情]"
display_content = _compact_media_caption(content, "[表情]")
elif message_type == "34":
display_type = "voice"
display_content = content or "[语音]"
display_content = _compact_media_caption(content, "[语音]")
elif message_type == "43":
display_type = "video"
display_content = content or "[视频]"
display_content = _compact_media_caption(content, "[视频]")
elif message_type == "49":
app_payload = _parse_app_message_payload(content)
if app_payload.get("url") or app_payload.get("title"):
@@ -138,7 +182,9 @@ def _normalize_recent_message(server, raw_message: dict, chat_type: str, target_
display_content = app_payload.get("description") or content or "[应用消息]"
elif message_type in {"10000", "10002"}:
display_type = "system"
display_content = content or "[系统消息]"
sys_payload = _parse_sys_message_payload(content)
display_content = sys_payload.get("summary") or content or "[系统消息]"
link_payload = sys_payload
return {
"timestamp": _safe_text(raw_message.get("timestamp")),
@@ -154,7 +200,8 @@ def _normalize_recent_message(server, raw_message: dict, chat_type: str, target_
"message_thumb": message_thumb,
"message_id": raw_message.get("message_id"),
"link_payload": link_payload,
"is_self": bool(self_wxid and sender == self_wxid)
"is_self": bool(self_wxid and sender == self_wxid),
"sysmsg_type": (link_payload or {}).get("sysmsg_type", "") if display_type == "system" else "",
}