koishi-plugin-chat-analyse 0.4.8 → 0.4.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.
- package/lib/Collector.d.ts +0 -11
- package/lib/index.js +25 -48
- package/package.json +1 -1
package/lib/Collector.d.ts
CHANGED
|
@@ -91,17 +91,6 @@ export declare class Collector {
|
|
|
91
91
|
* @returns {Promise<UserCache | null>} 返回用户的缓存对象,如果操作失败则返回 `null`。
|
|
92
92
|
*/
|
|
93
93
|
private getOrCreateCachedUser;
|
|
94
|
-
/**
|
|
95
|
-
* @private
|
|
96
|
-
* @async
|
|
97
|
-
* @method fetchApiNames
|
|
98
|
-
* @description 并发调用机器人API以获取用户和频道名称,作为备用数据源。
|
|
99
|
-
* @param bot - The bot instance.
|
|
100
|
-
* @param guildId - The guild ID.
|
|
101
|
-
* @param userId - The user ID.
|
|
102
|
-
* @returns {Promise<{userName: string, channelName: string}>} - 包含名称的对象。
|
|
103
|
-
*/
|
|
104
|
-
private fetchApiNames;
|
|
105
94
|
/**
|
|
106
95
|
* @private
|
|
107
96
|
* @method sanitizeContent
|
package/lib/index.js
CHANGED
|
@@ -202,39 +202,40 @@ var Collector = class _Collector {
|
|
|
202
202
|
* @returns {Promise<UserCache | null>} 返回用户的缓存对象,如果操作失败则返回 `null`。
|
|
203
203
|
*/
|
|
204
204
|
async getOrCreateCachedUser(session, channelId) {
|
|
205
|
-
const { userId, bot } = session;
|
|
206
|
-
const
|
|
205
|
+
const { userId, guildId, bot } = session;
|
|
206
|
+
const effectiveId = guildId || channelId;
|
|
207
|
+
const cacheKey = `${effectiveId}:${userId}`;
|
|
207
208
|
if (this.userCache.has(cacheKey)) return this.userCache.get(cacheKey);
|
|
208
209
|
if (this.pendingUserRequests.has(cacheKey)) return this.pendingUserRequests.get(cacheKey);
|
|
209
210
|
const promise = (async () => {
|
|
210
211
|
try {
|
|
211
|
-
const
|
|
212
|
-
const
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
|
|
212
|
+
const dbUsers = await this.ctx.database.get("analyse_user", { channelId: effectiveId, userId });
|
|
213
|
+
const dbUser = dbUsers[0];
|
|
214
|
+
const currentUserName = session.username || "";
|
|
215
|
+
let currentChannelName = "";
|
|
216
|
+
if (effectiveId && bot.getGuild) {
|
|
217
|
+
const guild = await bot.getGuild(effectiveId);
|
|
218
|
+
currentChannelName = guild?.name || "";
|
|
219
|
+
}
|
|
220
|
+
if (dbUser) {
|
|
221
|
+
const nameChanged = currentUserName && dbUser.userName !== currentUserName;
|
|
222
|
+
const channelNameChanged = currentChannelName && dbUser.channelName !== currentChannelName;
|
|
218
223
|
if (nameChanged || channelNameChanged) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
await this.ctx.database.set("analyse_user", { uid:
|
|
224
|
+
dbUser.userName = nameChanged ? currentUserName : dbUser.userName;
|
|
225
|
+
dbUser.channelName = channelNameChanged ? currentChannelName : dbUser.channelName;
|
|
226
|
+
await this.ctx.database.set("analyse_user", { uid: dbUser.uid }, {
|
|
227
|
+
userName: dbUser.userName,
|
|
228
|
+
channelName: dbUser.channelName
|
|
229
|
+
});
|
|
222
230
|
}
|
|
223
|
-
this.userCache.set(cacheKey,
|
|
224
|
-
return
|
|
225
|
-
}
|
|
226
|
-
let finalUserName = sessionUserName;
|
|
227
|
-
let finalChannelName = sessionChannelName;
|
|
228
|
-
if (!finalUserName || !finalChannelName) {
|
|
229
|
-
const apiData = await this.fetchApiNames(bot, session.guildId || channelId, userId);
|
|
230
|
-
finalUserName = finalUserName || apiData.userName;
|
|
231
|
-
finalChannelName = finalChannelName || apiData.channelName;
|
|
231
|
+
this.userCache.set(cacheKey, dbUser);
|
|
232
|
+
return dbUser;
|
|
232
233
|
}
|
|
233
234
|
const createdUser = await this.ctx.database.create("analyse_user", {
|
|
234
|
-
channelId,
|
|
235
|
+
channelId: effectiveId,
|
|
235
236
|
userId,
|
|
236
|
-
userName:
|
|
237
|
-
channelName:
|
|
237
|
+
userName: currentUserName,
|
|
238
|
+
channelName: currentChannelName
|
|
238
239
|
});
|
|
239
240
|
this.userCache.set(cacheKey, createdUser);
|
|
240
241
|
return createdUser;
|
|
@@ -248,30 +249,6 @@ var Collector = class _Collector {
|
|
|
248
249
|
this.pendingUserRequests.set(cacheKey, promise);
|
|
249
250
|
return promise;
|
|
250
251
|
}
|
|
251
|
-
/**
|
|
252
|
-
* @private
|
|
253
|
-
* @async
|
|
254
|
-
* @method fetchApiNames
|
|
255
|
-
* @description 并发调用机器人API以获取用户和频道名称,作为备用数据源。
|
|
256
|
-
* @param bot - The bot instance.
|
|
257
|
-
* @param guildId - The guild ID.
|
|
258
|
-
* @param userId - The user ID.
|
|
259
|
-
* @returns {Promise<{userName: string, channelName: string}>} - 包含名称的对象。
|
|
260
|
-
*/
|
|
261
|
-
async fetchApiNames(bot, guildId, userId) {
|
|
262
|
-
const results = await Promise.allSettled([
|
|
263
|
-
guildId && bot.getGuildMember ? bot.getGuildMember(guildId, userId) : Promise.resolve(null),
|
|
264
|
-
bot.getUser ? bot.getUser(userId) : Promise.resolve(null),
|
|
265
|
-
guildId && bot.getGuild ? bot.getGuild(guildId) : Promise.resolve(null)
|
|
266
|
-
]);
|
|
267
|
-
const member = results[0].status === "fulfilled" ? results[0].value : null;
|
|
268
|
-
const user = results[1].status === "fulfilled" ? results[1].value : null;
|
|
269
|
-
const guild = results[2].status === "fulfilled" ? results[2].value : null;
|
|
270
|
-
return {
|
|
271
|
-
userName: member?.username || member?.nick || member?.name || user?.name || "",
|
|
272
|
-
channelName: guild?.name || ""
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
252
|
/**
|
|
276
253
|
* @private
|
|
277
254
|
* @method sanitizeContent
|