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