mirror of
https://github.com/hicccc77/WeFlow.git
synced 2026-03-24 23:06:51 +00:00
feat(stats): add transfer red-packet and call message counts in session details
This commit is contained in:
@@ -146,6 +146,9 @@ interface ExportSessionStats {
|
|||||||
imageMessages: number
|
imageMessages: number
|
||||||
videoMessages: number
|
videoMessages: number
|
||||||
emojiMessages: number
|
emojiMessages: number
|
||||||
|
transferMessages: number
|
||||||
|
redPacketMessages: number
|
||||||
|
callMessages: number
|
||||||
firstTimestamp?: number
|
firstTimestamp?: number
|
||||||
lastTimestamp?: number
|
lastTimestamp?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
@@ -2102,7 +2105,10 @@ class ChatService {
|
|||||||
voiceMessages: Number.isFinite(stats.voiceMessages) ? Math.max(0, Math.floor(stats.voiceMessages)) : 0,
|
voiceMessages: Number.isFinite(stats.voiceMessages) ? Math.max(0, Math.floor(stats.voiceMessages)) : 0,
|
||||||
imageMessages: Number.isFinite(stats.imageMessages) ? Math.max(0, Math.floor(stats.imageMessages)) : 0,
|
imageMessages: Number.isFinite(stats.imageMessages) ? Math.max(0, Math.floor(stats.imageMessages)) : 0,
|
||||||
videoMessages: Number.isFinite(stats.videoMessages) ? Math.max(0, Math.floor(stats.videoMessages)) : 0,
|
videoMessages: Number.isFinite(stats.videoMessages) ? Math.max(0, Math.floor(stats.videoMessages)) : 0,
|
||||||
emojiMessages: Number.isFinite(stats.emojiMessages) ? Math.max(0, Math.floor(stats.emojiMessages)) : 0
|
emojiMessages: Number.isFinite(stats.emojiMessages) ? Math.max(0, Math.floor(stats.emojiMessages)) : 0,
|
||||||
|
transferMessages: Number.isFinite(stats.transferMessages) ? Math.max(0, Math.floor(stats.transferMessages)) : 0,
|
||||||
|
redPacketMessages: Number.isFinite(stats.redPacketMessages) ? Math.max(0, Math.floor(stats.redPacketMessages)) : 0,
|
||||||
|
callMessages: Number.isFinite(stats.callMessages) ? Math.max(0, Math.floor(stats.callMessages)) : 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Number.isFinite(stats.firstTimestamp)) normalized.firstTimestamp = Math.max(0, Math.floor(stats.firstTimestamp as number))
|
if (Number.isFinite(stats.firstTimestamp)) normalized.firstTimestamp = Math.max(0, Math.floor(stats.firstTimestamp as number))
|
||||||
@@ -2123,6 +2129,9 @@ class ChatService {
|
|||||||
imageMessages: stats.imageMessages,
|
imageMessages: stats.imageMessages,
|
||||||
videoMessages: stats.videoMessages,
|
videoMessages: stats.videoMessages,
|
||||||
emojiMessages: stats.emojiMessages,
|
emojiMessages: stats.emojiMessages,
|
||||||
|
transferMessages: stats.transferMessages,
|
||||||
|
redPacketMessages: stats.redPacketMessages,
|
||||||
|
callMessages: stats.callMessages,
|
||||||
firstTimestamp: stats.firstTimestamp,
|
firstTimestamp: stats.firstTimestamp,
|
||||||
lastTimestamp: stats.lastTimestamp,
|
lastTimestamp: stats.lastTimestamp,
|
||||||
privateMutualGroups: stats.privateMutualGroups,
|
privateMutualGroups: stats.privateMutualGroups,
|
||||||
@@ -2341,6 +2350,26 @@ class ChatService {
|
|||||||
return String(value || '').replace(/'/g, "''")
|
return String(value || '').replace(/'/g, "''")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private extractType49XmlTypeForStats(content: string): string {
|
||||||
|
if (!content) return ''
|
||||||
|
|
||||||
|
const appmsgMatch = /<appmsg[\s\S]*?>([\s\S]*?)<\/appmsg>/i.exec(content)
|
||||||
|
if (appmsgMatch) {
|
||||||
|
const appmsgInner = appmsgMatch[1]
|
||||||
|
.replace(/<refermsg[\s\S]*?<\/refermsg>/gi, '')
|
||||||
|
.replace(/<patMsg[\s\S]*?<\/patMsg>/gi, '')
|
||||||
|
const typeMatch = /<type>([\s\S]*?)<\/type>/i.exec(appmsgInner)
|
||||||
|
if (typeMatch) return String(typeMatch[1] || '').trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.extractXmlValue(content, 'type')
|
||||||
|
}
|
||||||
|
|
||||||
|
private buildXmlTypeLikeExpr(columnName: string, xmlType: '2000' | '2001'): string {
|
||||||
|
const colExpr = `LOWER(CAST(COALESCE(${this.quoteSqlIdentifier(columnName)}, '') AS TEXT))`
|
||||||
|
return `${colExpr} LIKE '%<type>${xmlType}</type>%'`
|
||||||
|
}
|
||||||
|
|
||||||
private async collectSessionExportStatsByCursorScan(
|
private async collectSessionExportStatsByCursorScan(
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
selfIdentitySet: Set<string>
|
selfIdentitySet: Set<string>
|
||||||
@@ -2350,7 +2379,10 @@ class ChatService {
|
|||||||
voiceMessages: 0,
|
voiceMessages: 0,
|
||||||
imageMessages: 0,
|
imageMessages: 0,
|
||||||
videoMessages: 0,
|
videoMessages: 0,
|
||||||
emojiMessages: 0
|
emojiMessages: 0,
|
||||||
|
transferMessages: 0,
|
||||||
|
redPacketMessages: 0,
|
||||||
|
callMessages: 0
|
||||||
}
|
}
|
||||||
if (sessionId.endsWith('@chatroom')) {
|
if (sessionId.endsWith('@chatroom')) {
|
||||||
stats.groupMyMessages = 0
|
stats.groupMyMessages = 0
|
||||||
@@ -2380,6 +2412,17 @@ class ChatService {
|
|||||||
if (localType === 3) stats.imageMessages += 1
|
if (localType === 3) stats.imageMessages += 1
|
||||||
if (localType === 43) stats.videoMessages += 1
|
if (localType === 43) stats.videoMessages += 1
|
||||||
if (localType === 47) stats.emojiMessages += 1
|
if (localType === 47) stats.emojiMessages += 1
|
||||||
|
if (localType === 50) stats.callMessages += 1
|
||||||
|
if (localType === 8589934592049) stats.transferMessages += 1
|
||||||
|
if (localType === 8594229559345) stats.redPacketMessages += 1
|
||||||
|
if (localType === 49) {
|
||||||
|
const rawMessageContent = this.getRowField(row, ['message_content', 'messageContent', 'msg_content', 'msgContent', 'content', 'WCDB_CT_message_content'])
|
||||||
|
const rawCompressContent = this.getRowField(row, ['compress_content', 'compressContent', 'compressed_content', 'compressedContent', 'WCDB_CT_compress_content'])
|
||||||
|
const content = this.decodeMessageContent(rawMessageContent, rawCompressContent)
|
||||||
|
const xmlType = this.extractType49XmlTypeForStats(content)
|
||||||
|
if (xmlType === '2000') stats.transferMessages += 1
|
||||||
|
if (xmlType === '2001') stats.redPacketMessages += 1
|
||||||
|
}
|
||||||
|
|
||||||
const createTime = this.getRowInt(
|
const createTime = this.getRowInt(
|
||||||
row,
|
row,
|
||||||
@@ -2438,7 +2481,10 @@ class ChatService {
|
|||||||
voiceMessages: 0,
|
voiceMessages: 0,
|
||||||
imageMessages: 0,
|
imageMessages: 0,
|
||||||
videoMessages: 0,
|
videoMessages: 0,
|
||||||
emojiMessages: 0
|
emojiMessages: 0,
|
||||||
|
transferMessages: 0,
|
||||||
|
redPacketMessages: 0,
|
||||||
|
callMessages: 0
|
||||||
}
|
}
|
||||||
if (sessionId.endsWith('@chatroom')) {
|
if (sessionId.endsWith('@chatroom')) {
|
||||||
stats.groupMyMessages = 0
|
stats.groupMyMessages = 0
|
||||||
@@ -2465,6 +2511,18 @@ class ChatService {
|
|||||||
const timeCol = this.pickFirstColumn(columnSet, ['create_time', 'createtime', 'msg_create_time', 'time'])
|
const timeCol = this.pickFirstColumn(columnSet, ['create_time', 'createtime', 'msg_create_time', 'time'])
|
||||||
const senderCol = this.pickFirstColumn(columnSet, ['sender_username', 'senderusername', 'sender'])
|
const senderCol = this.pickFirstColumn(columnSet, ['sender_username', 'senderusername', 'sender'])
|
||||||
const isSendCol = this.pickFirstColumn(columnSet, ['computed_is_send', 'computedissend', 'is_send', 'issend'])
|
const isSendCol = this.pickFirstColumn(columnSet, ['computed_is_send', 'computedissend', 'is_send', 'issend'])
|
||||||
|
const messageContentCol = this.pickFirstColumn(columnSet, ['message_content', 'messagecontent', 'msg_content', 'msgcontent', 'content'])
|
||||||
|
const compressContentCol = this.pickFirstColumn(columnSet, ['compress_content', 'compresscontent', 'compressed_content', 'compressedcontent'])
|
||||||
|
|
||||||
|
const transferXmlConditions: string[] = []
|
||||||
|
if (messageContentCol) transferXmlConditions.push(this.buildXmlTypeLikeExpr(messageContentCol, '2000'))
|
||||||
|
if (compressContentCol) transferXmlConditions.push(this.buildXmlTypeLikeExpr(compressContentCol, '2000'))
|
||||||
|
const transferXmlCond = transferXmlConditions.length > 0 ? `(${transferXmlConditions.join(' OR ')})` : '0'
|
||||||
|
|
||||||
|
const redPacketXmlConditions: string[] = []
|
||||||
|
if (messageContentCol) redPacketXmlConditions.push(this.buildXmlTypeLikeExpr(messageContentCol, '2001'))
|
||||||
|
if (compressContentCol) redPacketXmlConditions.push(this.buildXmlTypeLikeExpr(compressContentCol, '2001'))
|
||||||
|
const redPacketXmlCond = redPacketXmlConditions.length > 0 ? `(${redPacketXmlConditions.join(' OR ')})` : '0'
|
||||||
|
|
||||||
const selectParts: string[] = [
|
const selectParts: string[] = [
|
||||||
'COUNT(*) AS total_messages',
|
'COUNT(*) AS total_messages',
|
||||||
@@ -2472,6 +2530,9 @@ class ChatService {
|
|||||||
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 3 THEN 1 ELSE 0 END) AS image_messages` : '0 AS image_messages',
|
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 3 THEN 1 ELSE 0 END) AS image_messages` : '0 AS image_messages',
|
||||||
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 43 THEN 1 ELSE 0 END) AS video_messages` : '0 AS video_messages',
|
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 43 THEN 1 ELSE 0 END) AS video_messages` : '0 AS video_messages',
|
||||||
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 47 THEN 1 ELSE 0 END) AS emoji_messages` : '0 AS emoji_messages',
|
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 47 THEN 1 ELSE 0 END) AS emoji_messages` : '0 AS emoji_messages',
|
||||||
|
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 50 THEN 1 ELSE 0 END) AS call_messages` : '0 AS call_messages',
|
||||||
|
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 8589934592049 THEN 1 WHEN ${this.quoteSqlIdentifier(typeCol)} = 49 AND ${transferXmlCond} THEN 1 ELSE 0 END) AS transfer_messages` : '0 AS transfer_messages',
|
||||||
|
typeCol ? `SUM(CASE WHEN ${this.quoteSqlIdentifier(typeCol)} = 8594229559345 THEN 1 WHEN ${this.quoteSqlIdentifier(typeCol)} = 49 AND ${redPacketXmlCond} THEN 1 ELSE 0 END) AS red_packet_messages` : '0 AS red_packet_messages',
|
||||||
timeCol ? `MIN(${this.quoteSqlIdentifier(timeCol)}) AS first_timestamp` : 'NULL AS first_timestamp',
|
timeCol ? `MIN(${this.quoteSqlIdentifier(timeCol)}) AS first_timestamp` : 'NULL AS first_timestamp',
|
||||||
timeCol ? `MAX(${this.quoteSqlIdentifier(timeCol)}) AS last_timestamp` : 'NULL AS last_timestamp'
|
timeCol ? `MAX(${this.quoteSqlIdentifier(timeCol)}) AS last_timestamp` : 'NULL AS last_timestamp'
|
||||||
]
|
]
|
||||||
@@ -2509,6 +2570,9 @@ class ChatService {
|
|||||||
stats.imageMessages += this.getRowInt(aggregateRow, ['image_messages', 'imageMessages'], 0)
|
stats.imageMessages += this.getRowInt(aggregateRow, ['image_messages', 'imageMessages'], 0)
|
||||||
stats.videoMessages += this.getRowInt(aggregateRow, ['video_messages', 'videoMessages'], 0)
|
stats.videoMessages += this.getRowInt(aggregateRow, ['video_messages', 'videoMessages'], 0)
|
||||||
stats.emojiMessages += this.getRowInt(aggregateRow, ['emoji_messages', 'emojiMessages'], 0)
|
stats.emojiMessages += this.getRowInt(aggregateRow, ['emoji_messages', 'emojiMessages'], 0)
|
||||||
|
stats.callMessages += this.getRowInt(aggregateRow, ['call_messages', 'callMessages'], 0)
|
||||||
|
stats.transferMessages += this.getRowInt(aggregateRow, ['transfer_messages', 'transferMessages'], 0)
|
||||||
|
stats.redPacketMessages += this.getRowInt(aggregateRow, ['red_packet_messages', 'redPacketMessages'], 0)
|
||||||
|
|
||||||
const firstTs = this.getRowInt(aggregateRow, ['first_timestamp', 'firstTimestamp'], 0)
|
const firstTs = this.getRowInt(aggregateRow, ['first_timestamp', 'firstTimestamp'], 0)
|
||||||
if (firstTs > 0 && (stats.firstTimestamp === undefined || firstTs < stats.firstTimestamp)) {
|
if (firstTs > 0 && (stats.firstTimestamp === undefined || firstTs < stats.firstTimestamp)) {
|
||||||
@@ -2545,6 +2609,9 @@ class ChatService {
|
|||||||
stats.imageMessages += this.getRowInt(aggregateRow, ['image_messages', 'imageMessages'], 0)
|
stats.imageMessages += this.getRowInt(aggregateRow, ['image_messages', 'imageMessages'], 0)
|
||||||
stats.videoMessages += this.getRowInt(aggregateRow, ['video_messages', 'videoMessages'], 0)
|
stats.videoMessages += this.getRowInt(aggregateRow, ['video_messages', 'videoMessages'], 0)
|
||||||
stats.emojiMessages += this.getRowInt(aggregateRow, ['emoji_messages', 'emojiMessages'], 0)
|
stats.emojiMessages += this.getRowInt(aggregateRow, ['emoji_messages', 'emojiMessages'], 0)
|
||||||
|
stats.callMessages += this.getRowInt(aggregateRow, ['call_messages', 'callMessages'], 0)
|
||||||
|
stats.transferMessages += this.getRowInt(aggregateRow, ['transfer_messages', 'transferMessages'], 0)
|
||||||
|
stats.redPacketMessages += this.getRowInt(aggregateRow, ['red_packet_messages', 'redPacketMessages'], 0)
|
||||||
|
|
||||||
const firstTs = this.getRowInt(aggregateRow, ['first_timestamp', 'firstTimestamp'], 0)
|
const firstTs = this.getRowInt(aggregateRow, ['first_timestamp', 'firstTimestamp'], 0)
|
||||||
if (firstTs > 0 && (stats.firstTimestamp === undefined || firstTs < stats.firstTimestamp)) {
|
if (firstTs > 0 && (stats.firstTimestamp === undefined || firstTs < stats.firstTimestamp)) {
|
||||||
@@ -2640,7 +2707,10 @@ class ChatService {
|
|||||||
voiceMessages: 0,
|
voiceMessages: 0,
|
||||||
imageMessages: 0,
|
imageMessages: 0,
|
||||||
videoMessages: 0,
|
videoMessages: 0,
|
||||||
emojiMessages: 0
|
emojiMessages: 0,
|
||||||
|
transferMessages: 0,
|
||||||
|
redPacketMessages: 0,
|
||||||
|
callMessages: 0
|
||||||
}
|
}
|
||||||
if (isGroup) {
|
if (isGroup) {
|
||||||
stats.groupMyMessages = 0
|
stats.groupMyMessages = 0
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ export interface SessionStatsCacheStats {
|
|||||||
imageMessages: number
|
imageMessages: number
|
||||||
videoMessages: number
|
videoMessages: number
|
||||||
emojiMessages: number
|
emojiMessages: number
|
||||||
|
transferMessages: number
|
||||||
|
redPacketMessages: number
|
||||||
|
callMessages: number
|
||||||
firstTimestamp?: number
|
firstTimestamp?: number
|
||||||
lastTimestamp?: number
|
lastTimestamp?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
@@ -50,6 +53,9 @@ function normalizeStats(raw: unknown): SessionStatsCacheStats | null {
|
|||||||
const imageMessages = toNonNegativeInt(source.imageMessages)
|
const imageMessages = toNonNegativeInt(source.imageMessages)
|
||||||
const videoMessages = toNonNegativeInt(source.videoMessages)
|
const videoMessages = toNonNegativeInt(source.videoMessages)
|
||||||
const emojiMessages = toNonNegativeInt(source.emojiMessages)
|
const emojiMessages = toNonNegativeInt(source.emojiMessages)
|
||||||
|
const transferMessages = toNonNegativeInt(source.transferMessages) ?? 0
|
||||||
|
const redPacketMessages = toNonNegativeInt(source.redPacketMessages) ?? 0
|
||||||
|
const callMessages = toNonNegativeInt(source.callMessages) ?? 0
|
||||||
|
|
||||||
if (
|
if (
|
||||||
totalMessages === undefined ||
|
totalMessages === undefined ||
|
||||||
@@ -66,7 +72,10 @@ function normalizeStats(raw: unknown): SessionStatsCacheStats | null {
|
|||||||
voiceMessages,
|
voiceMessages,
|
||||||
imageMessages,
|
imageMessages,
|
||||||
videoMessages,
|
videoMessages,
|
||||||
emojiMessages
|
emojiMessages,
|
||||||
|
transferMessages,
|
||||||
|
redPacketMessages,
|
||||||
|
callMessages
|
||||||
}
|
}
|
||||||
|
|
||||||
const firstTimestamp = toNonNegativeInt(source.firstTimestamp)
|
const firstTimestamp = toNonNegativeInt(source.firstTimestamp)
|
||||||
|
|||||||
@@ -215,6 +215,9 @@ interface SessionDetail {
|
|||||||
imageMessages?: number
|
imageMessages?: number
|
||||||
videoMessages?: number
|
videoMessages?: number
|
||||||
emojiMessages?: number
|
emojiMessages?: number
|
||||||
|
transferMessages?: number
|
||||||
|
redPacketMessages?: number
|
||||||
|
callMessages?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
groupMemberCount?: number
|
groupMemberCount?: number
|
||||||
groupMyMessages?: number
|
groupMyMessages?: number
|
||||||
@@ -234,6 +237,9 @@ interface SessionExportMetric {
|
|||||||
imageMessages: number
|
imageMessages: number
|
||||||
videoMessages: number
|
videoMessages: number
|
||||||
emojiMessages: number
|
emojiMessages: number
|
||||||
|
transferMessages: number
|
||||||
|
redPacketMessages: number
|
||||||
|
callMessages: number
|
||||||
firstTimestamp?: number
|
firstTimestamp?: number
|
||||||
lastTimestamp?: number
|
lastTimestamp?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
@@ -787,6 +793,9 @@ function ChatPage(_props: ChatPageProps) {
|
|||||||
imageMessages: Number.isFinite(metric.imageMessages) ? metric.imageMessages : prev.imageMessages,
|
imageMessages: Number.isFinite(metric.imageMessages) ? metric.imageMessages : prev.imageMessages,
|
||||||
videoMessages: Number.isFinite(metric.videoMessages) ? metric.videoMessages : prev.videoMessages,
|
videoMessages: Number.isFinite(metric.videoMessages) ? metric.videoMessages : prev.videoMessages,
|
||||||
emojiMessages: Number.isFinite(metric.emojiMessages) ? metric.emojiMessages : prev.emojiMessages,
|
emojiMessages: Number.isFinite(metric.emojiMessages) ? metric.emojiMessages : prev.emojiMessages,
|
||||||
|
transferMessages: Number.isFinite(metric.transferMessages) ? metric.transferMessages : prev.transferMessages,
|
||||||
|
redPacketMessages: Number.isFinite(metric.redPacketMessages) ? metric.redPacketMessages : prev.redPacketMessages,
|
||||||
|
callMessages: Number.isFinite(metric.callMessages) ? metric.callMessages : prev.callMessages,
|
||||||
groupMemberCount: Number.isFinite(metric.groupMemberCount) ? metric.groupMemberCount : prev.groupMemberCount,
|
groupMemberCount: Number.isFinite(metric.groupMemberCount) ? metric.groupMemberCount : prev.groupMemberCount,
|
||||||
groupMyMessages: Number.isFinite(metric.groupMyMessages) ? metric.groupMyMessages : prev.groupMyMessages,
|
groupMyMessages: Number.isFinite(metric.groupMyMessages) ? metric.groupMyMessages : prev.groupMyMessages,
|
||||||
groupActiveSpeakers: Number.isFinite(metric.groupActiveSpeakers) ? metric.groupActiveSpeakers : prev.groupActiveSpeakers,
|
groupActiveSpeakers: Number.isFinite(metric.groupActiveSpeakers) ? metric.groupActiveSpeakers : prev.groupActiveSpeakers,
|
||||||
@@ -832,6 +841,9 @@ function ChatPage(_props: ChatPageProps) {
|
|||||||
imageMessages: sameSession ? prev?.imageMessages : undefined,
|
imageMessages: sameSession ? prev?.imageMessages : undefined,
|
||||||
videoMessages: sameSession ? prev?.videoMessages : undefined,
|
videoMessages: sameSession ? prev?.videoMessages : undefined,
|
||||||
emojiMessages: sameSession ? prev?.emojiMessages : undefined,
|
emojiMessages: sameSession ? prev?.emojiMessages : undefined,
|
||||||
|
transferMessages: sameSession ? prev?.transferMessages : undefined,
|
||||||
|
redPacketMessages: sameSession ? prev?.redPacketMessages : undefined,
|
||||||
|
callMessages: sameSession ? prev?.callMessages : undefined,
|
||||||
privateMutualGroups: sameSession ? prev?.privateMutualGroups : undefined,
|
privateMutualGroups: sameSession ? prev?.privateMutualGroups : undefined,
|
||||||
groupMemberCount: sameSession ? prev?.groupMemberCount : undefined,
|
groupMemberCount: sameSession ? prev?.groupMemberCount : undefined,
|
||||||
groupMyMessages: sameSession ? prev?.groupMyMessages : undefined,
|
groupMyMessages: sameSession ? prev?.groupMyMessages : undefined,
|
||||||
@@ -884,6 +896,9 @@ function ChatPage(_props: ChatPageProps) {
|
|||||||
imageMessages: prev?.imageMessages,
|
imageMessages: prev?.imageMessages,
|
||||||
videoMessages: prev?.videoMessages,
|
videoMessages: prev?.videoMessages,
|
||||||
emojiMessages: prev?.emojiMessages,
|
emojiMessages: prev?.emojiMessages,
|
||||||
|
transferMessages: prev?.transferMessages,
|
||||||
|
redPacketMessages: prev?.redPacketMessages,
|
||||||
|
callMessages: prev?.callMessages,
|
||||||
privateMutualGroups: prev?.privateMutualGroups,
|
privateMutualGroups: prev?.privateMutualGroups,
|
||||||
groupMemberCount: prev?.groupMemberCount,
|
groupMemberCount: prev?.groupMemberCount,
|
||||||
groupMyMessages: prev?.groupMyMessages,
|
groupMyMessages: prev?.groupMyMessages,
|
||||||
@@ -3712,6 +3727,30 @@ function ChatPage(_props: ChatPageProps) {
|
|||||||
: (isLoadingDetailExtra ? '统计中...' : '—')}
|
: (isLoadingDetailExtra ? '统计中...' : '—')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="detail-item">
|
||||||
|
<span className="label">转账消息数</span>
|
||||||
|
<span className="value">
|
||||||
|
{Number.isFinite(sessionDetail.transferMessages)
|
||||||
|
? (sessionDetail.transferMessages as number).toLocaleString()
|
||||||
|
: (isLoadingDetailExtra ? '统计中...' : '—')}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="detail-item">
|
||||||
|
<span className="label">红包消息数</span>
|
||||||
|
<span className="value">
|
||||||
|
{Number.isFinite(sessionDetail.redPacketMessages)
|
||||||
|
? (sessionDetail.redPacketMessages as number).toLocaleString()
|
||||||
|
: (isLoadingDetailExtra ? '统计中...' : '—')}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="detail-item">
|
||||||
|
<span className="label">通话消息数</span>
|
||||||
|
<span className="value">
|
||||||
|
{Number.isFinite(sessionDetail.callMessages)
|
||||||
|
? (sessionDetail.callMessages as number).toLocaleString()
|
||||||
|
: (isLoadingDetailExtra ? '统计中...' : '—')}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
{sessionDetail.wxid.includes('@chatroom') ? (
|
{sessionDetail.wxid.includes('@chatroom') ? (
|
||||||
<>
|
<>
|
||||||
<div className="detail-item">
|
<div className="detail-item">
|
||||||
|
|||||||
@@ -506,6 +506,9 @@ interface SessionDetail {
|
|||||||
imageMessages?: number
|
imageMessages?: number
|
||||||
videoMessages?: number
|
videoMessages?: number
|
||||||
emojiMessages?: number
|
emojiMessages?: number
|
||||||
|
transferMessages?: number
|
||||||
|
redPacketMessages?: number
|
||||||
|
callMessages?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
groupMemberCount?: number
|
groupMemberCount?: number
|
||||||
groupMyMessages?: number
|
groupMyMessages?: number
|
||||||
@@ -525,6 +528,9 @@ interface SessionExportMetric {
|
|||||||
imageMessages: number
|
imageMessages: number
|
||||||
videoMessages: number
|
videoMessages: number
|
||||||
emojiMessages: number
|
emojiMessages: number
|
||||||
|
transferMessages: number
|
||||||
|
redPacketMessages: number
|
||||||
|
callMessages: number
|
||||||
firstTimestamp?: number
|
firstTimestamp?: number
|
||||||
lastTimestamp?: number
|
lastTimestamp?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
@@ -540,6 +546,9 @@ interface SessionContentMetric {
|
|||||||
imageMessages?: number
|
imageMessages?: number
|
||||||
videoMessages?: number
|
videoMessages?: number
|
||||||
emojiMessages?: number
|
emojiMessages?: number
|
||||||
|
transferMessages?: number
|
||||||
|
redPacketMessages?: number
|
||||||
|
callMessages?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SessionContentStatsProgress {
|
interface SessionContentStatsProgress {
|
||||||
@@ -1458,13 +1467,19 @@ function ExportPage() {
|
|||||||
const imageMessages = normalizeMessageCount(metricRaw.imageMessages)
|
const imageMessages = normalizeMessageCount(metricRaw.imageMessages)
|
||||||
const videoMessages = normalizeMessageCount(metricRaw.videoMessages)
|
const videoMessages = normalizeMessageCount(metricRaw.videoMessages)
|
||||||
const emojiMessages = normalizeMessageCount(metricRaw.emojiMessages)
|
const emojiMessages = normalizeMessageCount(metricRaw.emojiMessages)
|
||||||
|
const transferMessages = normalizeMessageCount(metricRaw.transferMessages)
|
||||||
|
const redPacketMessages = normalizeMessageCount(metricRaw.redPacketMessages)
|
||||||
|
const callMessages = normalizeMessageCount(metricRaw.callMessages)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
typeof totalMessages !== 'number' &&
|
typeof totalMessages !== 'number' &&
|
||||||
typeof voiceMessages !== 'number' &&
|
typeof voiceMessages !== 'number' &&
|
||||||
typeof imageMessages !== 'number' &&
|
typeof imageMessages !== 'number' &&
|
||||||
typeof videoMessages !== 'number' &&
|
typeof videoMessages !== 'number' &&
|
||||||
typeof emojiMessages !== 'number'
|
typeof emojiMessages !== 'number' &&
|
||||||
|
typeof transferMessages !== 'number' &&
|
||||||
|
typeof redPacketMessages !== 'number' &&
|
||||||
|
typeof callMessages !== 'number'
|
||||||
) {
|
) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -1474,7 +1489,10 @@ function ExportPage() {
|
|||||||
voiceMessages,
|
voiceMessages,
|
||||||
imageMessages,
|
imageMessages,
|
||||||
videoMessages,
|
videoMessages,
|
||||||
emojiMessages
|
emojiMessages,
|
||||||
|
transferMessages,
|
||||||
|
redPacketMessages,
|
||||||
|
callMessages
|
||||||
}
|
}
|
||||||
if (typeof totalMessages === 'number') {
|
if (typeof totalMessages === 'number') {
|
||||||
nextMessageCounts[sessionId] = totalMessages
|
nextMessageCounts[sessionId] = totalMessages
|
||||||
@@ -1505,14 +1523,20 @@ function ExportPage() {
|
|||||||
voiceMessages: typeof metric.voiceMessages === 'number' ? metric.voiceMessages : previous.voiceMessages,
|
voiceMessages: typeof metric.voiceMessages === 'number' ? metric.voiceMessages : previous.voiceMessages,
|
||||||
imageMessages: typeof metric.imageMessages === 'number' ? metric.imageMessages : previous.imageMessages,
|
imageMessages: typeof metric.imageMessages === 'number' ? metric.imageMessages : previous.imageMessages,
|
||||||
videoMessages: typeof metric.videoMessages === 'number' ? metric.videoMessages : previous.videoMessages,
|
videoMessages: typeof metric.videoMessages === 'number' ? metric.videoMessages : previous.videoMessages,
|
||||||
emojiMessages: typeof metric.emojiMessages === 'number' ? metric.emojiMessages : previous.emojiMessages
|
emojiMessages: typeof metric.emojiMessages === 'number' ? metric.emojiMessages : previous.emojiMessages,
|
||||||
|
transferMessages: typeof metric.transferMessages === 'number' ? metric.transferMessages : previous.transferMessages,
|
||||||
|
redPacketMessages: typeof metric.redPacketMessages === 'number' ? metric.redPacketMessages : previous.redPacketMessages,
|
||||||
|
callMessages: typeof metric.callMessages === 'number' ? metric.callMessages : previous.callMessages
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
previous.totalMessages === nextMetric.totalMessages &&
|
previous.totalMessages === nextMetric.totalMessages &&
|
||||||
previous.voiceMessages === nextMetric.voiceMessages &&
|
previous.voiceMessages === nextMetric.voiceMessages &&
|
||||||
previous.imageMessages === nextMetric.imageMessages &&
|
previous.imageMessages === nextMetric.imageMessages &&
|
||||||
previous.videoMessages === nextMetric.videoMessages &&
|
previous.videoMessages === nextMetric.videoMessages &&
|
||||||
previous.emojiMessages === nextMetric.emojiMessages
|
previous.emojiMessages === nextMetric.emojiMessages &&
|
||||||
|
previous.transferMessages === nextMetric.transferMessages &&
|
||||||
|
previous.redPacketMessages === nextMetric.redPacketMessages &&
|
||||||
|
previous.callMessages === nextMetric.callMessages
|
||||||
) {
|
) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -3150,6 +3174,9 @@ function ExportPage() {
|
|||||||
imageMessages: Number.isFinite(metric.imageMessages) ? metric.imageMessages : prev.imageMessages,
|
imageMessages: Number.isFinite(metric.imageMessages) ? metric.imageMessages : prev.imageMessages,
|
||||||
videoMessages: Number.isFinite(metric.videoMessages) ? metric.videoMessages : prev.videoMessages,
|
videoMessages: Number.isFinite(metric.videoMessages) ? metric.videoMessages : prev.videoMessages,
|
||||||
emojiMessages: Number.isFinite(metric.emojiMessages) ? metric.emojiMessages : prev.emojiMessages,
|
emojiMessages: Number.isFinite(metric.emojiMessages) ? metric.emojiMessages : prev.emojiMessages,
|
||||||
|
transferMessages: Number.isFinite(metric.transferMessages) ? metric.transferMessages : prev.transferMessages,
|
||||||
|
redPacketMessages: Number.isFinite(metric.redPacketMessages) ? metric.redPacketMessages : prev.redPacketMessages,
|
||||||
|
callMessages: Number.isFinite(metric.callMessages) ? metric.callMessages : prev.callMessages,
|
||||||
groupMemberCount: Number.isFinite(metric.groupMemberCount) ? metric.groupMemberCount : prev.groupMemberCount,
|
groupMemberCount: Number.isFinite(metric.groupMemberCount) ? metric.groupMemberCount : prev.groupMemberCount,
|
||||||
groupMyMessages: Number.isFinite(metric.groupMyMessages) ? metric.groupMyMessages : prev.groupMyMessages,
|
groupMyMessages: Number.isFinite(metric.groupMyMessages) ? metric.groupMyMessages : prev.groupMyMessages,
|
||||||
groupActiveSpeakers: Number.isFinite(metric.groupActiveSpeakers) ? metric.groupActiveSpeakers : prev.groupActiveSpeakers,
|
groupActiveSpeakers: Number.isFinite(metric.groupActiveSpeakers) ? metric.groupActiveSpeakers : prev.groupActiveSpeakers,
|
||||||
@@ -3182,6 +3209,9 @@ function ExportPage() {
|
|||||||
const metricImage = normalizeMessageCount(cachedMetric?.imageMessages)
|
const metricImage = normalizeMessageCount(cachedMetric?.imageMessages)
|
||||||
const metricVideo = normalizeMessageCount(cachedMetric?.videoMessages)
|
const metricVideo = normalizeMessageCount(cachedMetric?.videoMessages)
|
||||||
const metricEmoji = normalizeMessageCount(cachedMetric?.emojiMessages)
|
const metricEmoji = normalizeMessageCount(cachedMetric?.emojiMessages)
|
||||||
|
const metricTransfer = normalizeMessageCount(cachedMetric?.transferMessages)
|
||||||
|
const metricRedPacket = normalizeMessageCount(cachedMetric?.redPacketMessages)
|
||||||
|
const metricCall = normalizeMessageCount(cachedMetric?.callMessages)
|
||||||
const hintedCount = typeof mappedSession?.messageCountHint === 'number' && Number.isFinite(mappedSession.messageCountHint) && mappedSession.messageCountHint >= 0
|
const hintedCount = typeof mappedSession?.messageCountHint === 'number' && Number.isFinite(mappedSession.messageCountHint) && mappedSession.messageCountHint >= 0
|
||||||
? Math.floor(mappedSession.messageCountHint)
|
? Math.floor(mappedSession.messageCountHint)
|
||||||
: undefined
|
: undefined
|
||||||
@@ -3204,6 +3234,9 @@ function ExportPage() {
|
|||||||
imageMessages: metricImage ?? (sameSession ? prev?.imageMessages : undefined),
|
imageMessages: metricImage ?? (sameSession ? prev?.imageMessages : undefined),
|
||||||
videoMessages: metricVideo ?? (sameSession ? prev?.videoMessages : undefined),
|
videoMessages: metricVideo ?? (sameSession ? prev?.videoMessages : undefined),
|
||||||
emojiMessages: metricEmoji ?? (sameSession ? prev?.emojiMessages : undefined),
|
emojiMessages: metricEmoji ?? (sameSession ? prev?.emojiMessages : undefined),
|
||||||
|
transferMessages: metricTransfer ?? (sameSession ? prev?.transferMessages : undefined),
|
||||||
|
redPacketMessages: metricRedPacket ?? (sameSession ? prev?.redPacketMessages : undefined),
|
||||||
|
callMessages: metricCall ?? (sameSession ? prev?.callMessages : undefined),
|
||||||
privateMutualGroups: sameSession ? prev?.privateMutualGroups : undefined,
|
privateMutualGroups: sameSession ? prev?.privateMutualGroups : undefined,
|
||||||
groupMemberCount: sameSession ? prev?.groupMemberCount : undefined,
|
groupMemberCount: sameSession ? prev?.groupMemberCount : undefined,
|
||||||
groupMyMessages: sameSession ? prev?.groupMyMessages : undefined,
|
groupMyMessages: sameSession ? prev?.groupMyMessages : undefined,
|
||||||
@@ -3236,6 +3269,9 @@ function ExportPage() {
|
|||||||
imageMessages: prev?.imageMessages,
|
imageMessages: prev?.imageMessages,
|
||||||
videoMessages: prev?.videoMessages,
|
videoMessages: prev?.videoMessages,
|
||||||
emojiMessages: prev?.emojiMessages,
|
emojiMessages: prev?.emojiMessages,
|
||||||
|
transferMessages: prev?.transferMessages,
|
||||||
|
redPacketMessages: prev?.redPacketMessages,
|
||||||
|
callMessages: prev?.callMessages,
|
||||||
privateMutualGroups: prev?.privateMutualGroups,
|
privateMutualGroups: prev?.privateMutualGroups,
|
||||||
groupMemberCount: prev?.groupMemberCount,
|
groupMemberCount: prev?.groupMemberCount,
|
||||||
groupMyMessages: prev?.groupMyMessages,
|
groupMyMessages: prev?.groupMyMessages,
|
||||||
@@ -4546,6 +4582,30 @@ function ExportPage() {
|
|||||||
: (isLoadingSessionDetailExtra ? '统计中...' : '—')}
|
: (isLoadingSessionDetailExtra ? '统计中...' : '—')}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="detail-item">
|
||||||
|
<span className="label">转账消息数</span>
|
||||||
|
<span className="value">
|
||||||
|
{Number.isFinite(sessionDetail.transferMessages)
|
||||||
|
? (sessionDetail.transferMessages as number).toLocaleString()
|
||||||
|
: (isLoadingSessionDetailExtra ? '统计中...' : '—')}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="detail-item">
|
||||||
|
<span className="label">红包消息数</span>
|
||||||
|
<span className="value">
|
||||||
|
{Number.isFinite(sessionDetail.redPacketMessages)
|
||||||
|
? (sessionDetail.redPacketMessages as number).toLocaleString()
|
||||||
|
: (isLoadingSessionDetailExtra ? '统计中...' : '—')}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="detail-item">
|
||||||
|
<span className="label">通话消息数</span>
|
||||||
|
<span className="value">
|
||||||
|
{Number.isFinite(sessionDetail.callMessages)
|
||||||
|
? (sessionDetail.callMessages as number).toLocaleString()
|
||||||
|
: (isLoadingSessionDetailExtra ? '统计中...' : '—')}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
{sessionDetail.wxid.includes('@chatroom') ? (
|
{sessionDetail.wxid.includes('@chatroom') ? (
|
||||||
<>
|
<>
|
||||||
<div className="detail-item">
|
<div className="detail-item">
|
||||||
|
|||||||
3
src/types/electron.d.ts
vendored
3
src/types/electron.d.ts
vendored
@@ -251,6 +251,9 @@ export interface ElectronAPI {
|
|||||||
imageMessages: number
|
imageMessages: number
|
||||||
videoMessages: number
|
videoMessages: number
|
||||||
emojiMessages: number
|
emojiMessages: number
|
||||||
|
transferMessages: number
|
||||||
|
redPacketMessages: number
|
||||||
|
callMessages: number
|
||||||
firstTimestamp?: number
|
firstTimestamp?: number
|
||||||
lastTimestamp?: number
|
lastTimestamp?: number
|
||||||
privateMutualGroups?: number
|
privateMutualGroups?: number
|
||||||
|
|||||||
Reference in New Issue
Block a user