koishi-plugin-chat-patch 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,11 +3,13 @@ import fs from 'node:fs'
3
3
  import { Context, Logger } from 'koishi'
4
4
  import { ChatData, MessageInfo } from './types'
5
5
  import { Config } from './config'
6
+ import { Utils } from './utils'
6
7
 
7
8
  export class FileManager {
8
9
  private dataFilePath: string
9
10
  private fileOperationLock = Promise.resolve()
10
11
  private logger: Logger
12
+ private utils: Utils
11
13
 
12
14
  constructor(
13
15
  private ctx: Context,
@@ -15,6 +17,7 @@ export class FileManager {
15
17
  ) {
16
18
  this.dataFilePath = path.resolve(ctx.baseDir, 'data', 'chat-patch', 'chat-data.json')
17
19
  this.logger = ctx.logger('chat-patch')
20
+ this.utils = new Utils(config)
18
21
  }
19
22
 
20
23
  // 确保目录存在
@@ -119,8 +122,11 @@ export class FileManager {
119
122
  messageInfo.timestamp = Date.now()
120
123
  }
121
124
 
125
+ // 清理消息中的base64内容
126
+ const cleanedMessageInfo = this.utils.cleanBase64Content(messageInfo) as MessageInfo
127
+
122
128
  const beforeCount = data.messages[channelKey].length
123
- data.messages[channelKey].push(messageInfo)
129
+ data.messages[channelKey].push(cleanedMessageInfo)
124
130
  const afterCount = data.messages[channelKey].length
125
131
 
126
132
  // 限制消息数量 - 保留最新的消息
@@ -127,12 +127,12 @@ export class MessageHandler {
127
127
  timestamp: timestamp,
128
128
  channelId: session.channelId,
129
129
  selfId: session.selfId,
130
- elements: elements,
130
+ elements: this.utils.cleanBase64Content(elements),
131
131
  type: 'user',
132
132
  guildId: session.guildId,
133
133
  guildName: guildName,
134
134
  platform: session.platform || 'unknown',
135
- quote: quoteInfo
135
+ quote: quoteInfo ? this.utils.cleanBase64Content(quoteInfo) : undefined
136
136
  }
137
137
 
138
138
  await this.fileManager.addMessageToFile(messageInfo)
@@ -151,8 +151,8 @@ export class MessageHandler {
151
151
  guildId: session.guildId,
152
152
  guildName: guildName,
153
153
  channelType: session.type || 0,
154
- elements: elements,
155
- quote: quoteInfo,
154
+ elements: this.utils.cleanBase64Content(elements),
155
+ quote: quoteInfo ? this.utils.cleanBase64Content(quoteInfo) : undefined,
156
156
  bot: {
157
157
  avatar: session.bot.user?.avatar,
158
158
  name: session.bot.user?.name,
@@ -189,7 +189,7 @@ export class MessageHandler {
189
189
  timestamp: timestamp,
190
190
  channelId: session.event?.channel?.id || session.channelId,
191
191
  selfId: session.selfId,
192
- elements: session.event?.message?.elements,
192
+ elements: this.utils.cleanBase64Content(session.event?.message?.elements),
193
193
  type: 'bot',
194
194
  guildId: session.event?.guild?.id || session.guildId,
195
195
  guildName: guildName,
@@ -212,7 +212,7 @@ export class MessageHandler {
212
212
  guildId: session.event?.guild?.id || session.guildId,
213
213
  guildName: guildName,
214
214
  channelType: session.event?.channel?.type || session.type || 0,
215
- elements: session.event?.message?.elements,
215
+ elements: this.utils.cleanBase64Content(session.event?.message?.elements),
216
216
  bot: {
217
217
  avatar: session.bot.user?.avatar,
218
218
  name: session.bot.user?.name,
package/src/utils.ts CHANGED
@@ -40,4 +40,61 @@ export class Utils {
40
40
  }
41
41
  return text
42
42
  }
43
+
44
+ // 检查字符串是否为base64格式
45
+ private isBase64(str: string): boolean {
46
+ if (!str || typeof str !== 'string') return false
47
+
48
+ // 检查是否以data:开头的base64格式
49
+ if (str.startsWith('data:')) {
50
+ return str.includes('base64,')
51
+ }
52
+
53
+ // 检查纯base64字符串(长度大于100且符合base64格式)
54
+ if (str.length > 100) {
55
+ const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/
56
+ return base64Regex.test(str)
57
+ }
58
+
59
+ return false
60
+ }
61
+
62
+ // 清理对象中的base64内容
63
+ cleanBase64Content(obj: any): any {
64
+ if (obj === null || obj === undefined) {
65
+ return obj
66
+ }
67
+
68
+ if (typeof obj === 'string') {
69
+ if (this.isBase64(obj)) {
70
+ return '暂不支持记录base64内容'
71
+ }
72
+ return obj
73
+ }
74
+
75
+ if (Array.isArray(obj)) {
76
+ return obj.map(item => this.cleanBase64Content(item))
77
+ }
78
+
79
+ if (typeof obj === 'object') {
80
+ const cleaned: any = {}
81
+ for (const [key, value] of Object.entries(obj)) {
82
+ // 特别处理常见的base64字段
83
+ if (typeof value === 'string' && (
84
+ key === 'src' ||
85
+ key === 'url' ||
86
+ key === 'file' ||
87
+ key === 'data' ||
88
+ key === 'content'
89
+ ) && this.isBase64(value)) {
90
+ cleaned[key] = '暂不支持记录base64内容'
91
+ } else {
92
+ cleaned[key] = this.cleanBase64Content(value)
93
+ }
94
+ }
95
+ return cleaned
96
+ }
97
+
98
+ return obj
99
+ }
43
100
  }