diff --git a/src/daemon/query.rs b/src/daemon/query.rs index 0904a85..30bcc81 100644 --- a/src/daemon/query.rs +++ b/src/daemon/query.rs @@ -647,8 +647,12 @@ fn fmt_content(local_id: i64, local_type: i64, content: &str, is_group: bool) -> let base = (local_type as u64 & 0xFFFFFFFF) as i64; match base { 3 => return format!("[图片] local_id={}", local_id), + 34 => return "[语音]".into(), + 43 => return "[视频]".into(), 47 => return "[表情]".into(), 50 => return "[通话]".into(), + 10000 => return parse_sysmsg(content).unwrap_or_else(|| "[系统消息]".into()), + 10002 => return parse_revoke(content).unwrap_or_else(|| "[撤回了一条消息]".into()), _ => {} } @@ -666,6 +670,37 @@ fn fmt_content(local_id: i64, local_type: i64, content: &str, is_group: bool) -> text.to_string() } +/// 解析撤回消息 XML,提取被撤回的内容摘要 +/// `...` +fn parse_revoke(xml: &str) -> Option { + let inner = extract_xml_text(xml, "content")?; + // 有时 content 是 "xxx recalled a message" 英文,有时是中文 + if inner.is_empty() { + return Some("[撤回了一条消息]".into()); + } + // 尝试简化:如果是 XML 格式的撤回内容,直接显示摘要 + Some(format!("[撤回] {}", inner + .chars() + .take(30) + .collect::())) +} + +/// 解析系统消息 XML(群通知等) +fn parse_sysmsg(xml: &str) -> Option { + // 常见格式:... + // 尝试提取 content 标签 + if let Some(s) = extract_xml_text(xml, "content") { + if !s.is_empty() { + return Some(format!("[系统] {}", s.chars().take(50).collect::())); + } + } + // 纯文本系统消息(无 XML) + if !xml.starts_with('<') { + return Some(format!("[系统] {}", xml.chars().take(50).collect::())); + } + Some("[系统消息]".into()) +} + fn parse_appmsg(text: &str) -> Option { // 简单 XML 解析,避免引入重量级 XML 库(或直接用 minidom) // 这里用基本字符串搜索实现