导出chatlab的时候有引用消息

This commit is contained in:
xuncha
2026-03-20 16:42:01 +08:00
parent 80786c572a
commit 8e8c14a51f

View File

@@ -46,6 +46,8 @@ interface ChatLabMessage {
timestamp: number timestamp: number
type: number type: number
content: string | null content: string | null
platformMessageId?: string
replyToMessageId?: string
chatRecords?: any[] // 嵌套的聊天记录 chatRecords?: any[] // 嵌套的聊天记录
} }
@@ -952,6 +954,18 @@ class ExportService {
return fallback return fallback
} }
private getRowField(row: Record<string, any>, keys: string[]): any {
for (const key of keys) {
if (row && Object.prototype.hasOwnProperty.call(row, key)) {
const value = row[key]
if (value !== undefined && value !== null && value !== '') {
return value
}
}
}
return undefined
}
private normalizeUnsignedIntToken(value: unknown): string { private normalizeUnsignedIntToken(value: unknown): string {
const raw = String(value ?? '').trim() const raw = String(value ?? '').trim()
if (!raw) return '0' if (!raw) return '0'
@@ -963,14 +977,14 @@ class ExportService {
return String(Math.floor(num)) return String(Math.floor(num))
} }
private getStableMessageKey(msg: { localId?: unknown; createTime?: unknown; serverId?: unknown }): string { private getStableMessageKey(msg: { localId?: unknown; createTime?: unknown; serverId?: unknown; serverIdRaw?: unknown }): string {
const localId = this.normalizeUnsignedIntToken(msg?.localId) const localId = this.normalizeUnsignedIntToken(msg?.localId)
const createTime = this.normalizeUnsignedIntToken(msg?.createTime) const createTime = this.normalizeUnsignedIntToken(msg?.createTime)
const serverId = this.normalizeUnsignedIntToken(msg?.serverId) const serverId = this.normalizeUnsignedIntToken(msg?.serverIdRaw ?? msg?.serverId)
return `${localId}:${createTime}:${serverId}` return `${localId}:${createTime}:${serverId}`
} }
private getMediaCacheKey(msg: { localType?: unknown; localId?: unknown; createTime?: unknown; serverId?: unknown }): string { private getMediaCacheKey(msg: { localType?: unknown; localId?: unknown; createTime?: unknown; serverId?: unknown; serverIdRaw?: unknown }): string {
const localType = this.normalizeUnsignedIntToken(msg?.localType) const localType = this.normalizeUnsignedIntToken(msg?.localType)
return `${localType}_${this.getStableMessageKey(msg)}` return `${localType}_${this.getStableMessageKey(msg)}`
} }
@@ -2462,6 +2476,23 @@ class ExportService {
} }
} }
private extractChatLabReplyToMessageId(content: string): string | undefined {
try {
const normalized = this.normalizeAppMessageContent(content || '')
const referMsgStart = normalized.indexOf('<refermsg>')
const referMsgEnd = normalized.indexOf('</refermsg>')
if (referMsgStart === -1 || referMsgEnd === -1) {
return undefined
}
const referMsgXml = normalized.substring(referMsgStart, referMsgEnd + 11)
const replyToMessageIdRaw = this.normalizeUnsignedIntToken(this.extractXmlValue(referMsgXml, 'svrid'))
return replyToMessageIdRaw !== '0' ? replyToMessageIdRaw : undefined
} catch {
return undefined
}
}
private extractArkmeAppMessageMeta(content: string, localType: number): Record<string, any> | null { private extractArkmeAppMessageMeta(content: string, localType: number): Record<string, any> | null {
if (!content) return null if (!content) return null
@@ -3507,6 +3538,13 @@ class ExportService {
'msg_id', 'msgId', 'MsgId', 'id', 'msg_id', 'msgId', 'MsgId', 'id',
'WCDB_CT_local_id' 'WCDB_CT_local_id'
], 0) ], 0)
const rawServerIdValue = this.getRowField(row, [
'server_id', 'serverId', 'ServerId',
'msg_server_id', 'msgServerId', 'MsgServerId',
'svr_id', 'svrId', 'msg_svr_id', 'msgSvrId', 'MsgSvrId',
'WCDB_CT_server_id'
])
const serverIdRaw = this.normalizeUnsignedIntToken(rawServerIdValue)
const serverId = this.getIntFromRow(row, [ const serverId = this.getIntFromRow(row, [
'server_id', 'serverId', 'ServerId', 'server_id', 'serverId', 'ServerId',
'msg_server_id', 'msgServerId', 'MsgServerId', 'msg_server_id', 'msgServerId', 'MsgServerId',
@@ -3598,6 +3636,7 @@ class ExportService {
rows.push({ rows.push({
localId, localId,
serverId, serverId,
serverIdRaw: serverIdRaw !== '0' ? serverIdRaw : undefined,
createTime, createTime,
localType, localType,
content, content,
@@ -4440,6 +4479,16 @@ class ExportService {
content: content content: content
} }
const platformMessageId = this.normalizeUnsignedIntToken(msg.serverIdRaw ?? msg.serverId)
if (platformMessageId !== '0') {
message.platformMessageId = platformMessageId
}
const replyToMessageId = this.extractChatLabReplyToMessageId(msg.content)
if (replyToMessageId) {
message.replyToMessageId = replyToMessageId
}
// 如果有聊天记录,添加为嵌套字段 // 如果有聊天记录,添加为嵌套字段
if (msg.chatRecordList && msg.chatRecordList.length > 0) { if (msg.chatRecordList && msg.chatRecordList.length > 0) {
const chatRecords: any[] = [] const chatRecords: any[] = []