mioki 0.14.0 → 0.15.0

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/dist/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const require_package = require('./package-xEK88jTG.cjs');
2
+ const require_package = require('./package-49Rgph2M.cjs');
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_package.__toESM(node_fs);
5
5
  let node_path = require("node:path");
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as version } from "./package-DFYh9fsp.mjs";
2
+ import { t as version } from "./package-B4h-fhCq.mjs";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import mri from "mri";
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_package = require('./package-xEK88jTG.cjs');
1
+ const require_package = require('./package-49Rgph2M.cjs');
2
2
  let node_fs = require("node:fs");
3
3
  node_fs = require_package.__toESM(node_fs);
4
4
  let node_util = require("node:util");
@@ -1224,36 +1224,92 @@ function bindBot(bot, func) {
1224
1224
  return (...args) => func(bot, ...args);
1225
1225
  }
1226
1226
  /**
1227
- * 消息去重器
1228
- * 处理多个 bot 在同一个群时,同一消息只处理一次
1227
+ * 去重器
1228
+ * 处理多个 bot 在相同场景下,同一事件只处理一次
1229
1229
  */
1230
- var MessageDeduplicator = class {
1231
- processedMessages = /* @__PURE__ */ new Set();
1230
+ var Deduplicator = class {
1231
+ processedEvents = /* @__PURE__ */ new Set();
1232
1232
  maxSize = 1e3;
1233
1233
  /**
1234
- * 生成消息唯一键
1235
- * 对于群消息:使用 group_id:user_id:time
1236
- * 对于私聊消息:使用 private:user_id:time
1234
+ * 获取事件类型键
1237
1235
  */
1238
- getKey(event) {
1239
- if (event.message_type === "group") return `group:${event.group_id}:${event.user_id}:${event.time}`;
1240
- else return `private:${event.user_id}:${event.time}`;
1236
+ getEventTypeKey(e) {
1237
+ const { post_type } = e;
1238
+ if (post_type === "message") return `msg:${e.message_type}`;
1239
+ if (post_type === "request") {
1240
+ if (e.request_type === "friend") return "req:friend";
1241
+ return `req:group:${e.sub_type ?? "unknown"}`;
1242
+ }
1243
+ if (post_type === "notice") {
1244
+ if (e.notice_type === "group") return `notice:group:${e.sub_type}`;
1245
+ return `notice:${e.notice_type}:${e.sub_type}`;
1246
+ }
1247
+ return "unknown";
1241
1248
  }
1242
- isProcessed(event) {
1243
- return this.processedMessages.has(this.getKey(event));
1249
+ getGroupMessageKey(e) {
1250
+ const groupId = e.group_id ?? "_";
1251
+ const userId = e.user_id ?? "_";
1252
+ const time = e.time ?? "_";
1253
+ const raw = e.raw_message ?? "_";
1254
+ return `msg:group:${groupId}:${userId}:${time}:${node_crypto.default.createHash("md5").update(raw).digest("hex")}`;
1244
1255
  }
1245
- markProcessed(event) {
1246
- if (this.processedMessages.size >= this.maxSize) {
1247
- const first = this.processedMessages.values().next();
1248
- if (!first.done) this.processedMessages.delete(first.value);
1256
+ getNoticeGroupKey(e) {
1257
+ return `${this.getEventTypeKey(e)}:${e.group_id ?? "_"}:${e.user_id ?? "_"}:${"operator_id" in e ? e.operator_id ?? "_" : "_"}:${"target_id" in e ? e.target_id ?? "_" : "_"}:${e.sub_type ?? "_"}:${"action_type" in e ? e.action_type ?? "_" : "_"}:${"duration" in e ? e.duration ?? "_" : "_"}:${e.time ?? "_"}`;
1258
+ }
1259
+ getRequestKey(e) {
1260
+ const typeKey = this.getEventTypeKey(e);
1261
+ const userId = e.user_id ?? "_";
1262
+ const groupId = "group_id" in e ? e.group_id ?? "_" : "_";
1263
+ const time = e.time ?? "_";
1264
+ const comment = e.comment ?? "_";
1265
+ return `${typeKey}:${userId}:${groupId}:${time}:${comment ? node_crypto.default.createHash("md5").update(comment).digest("hex") : "_"}`;
1266
+ }
1267
+ /**
1268
+ * 生成事件唯一键
1269
+ */
1270
+ getKey(e) {
1271
+ const typeKey = this.getEventTypeKey(e);
1272
+ if (typeKey === "msg:group") return this.getGroupMessageKey(e);
1273
+ if (typeKey.startsWith("notice:group:")) return this.getNoticeGroupKey(e);
1274
+ if (typeKey.startsWith("req:")) return this.getRequestKey(e);
1275
+ return "";
1276
+ }
1277
+ /**
1278
+ * 检查事件是否已处理过
1279
+ * @param event
1280
+ * @param scope
1281
+ */
1282
+ isProcessed(event, scope) {
1283
+ const key = scope ? `${this.getKey(event)}:${scope}` : this.getKey(event);
1284
+ return this.processedEvents.has(key);
1285
+ }
1286
+ /**
1287
+ * 标记事件为已处理
1288
+ * @param event
1289
+ * @param scope 需与 isProcessed 一致
1290
+ */
1291
+ markProcessed(event, scope) {
1292
+ const key = scope ? `${this.getKey(event)}:${scope}` : this.getKey(event);
1293
+ if (this.processedEvents.size >= this.maxSize) {
1294
+ const first = this.processedEvents.values().next();
1295
+ if (!first.done) this.processedEvents.delete(first.value);
1249
1296
  }
1250
- this.processedMessages.add(this.getKey(event));
1297
+ this.processedEvents.add(key);
1298
+ }
1299
+ };
1300
+ /**
1301
+ * 消息去重器
1302
+ * @deprecated 请使用 Deduplicator,它支持更多事件类型
1303
+ */
1304
+ var MessageDeduplicator = class extends Deduplicator {
1305
+ isProcessed(event) {
1306
+ return super.isProcessed(event);
1251
1307
  }
1252
- clear() {
1253
- this.processedMessages.clear();
1308
+ markProcessed(event) {
1309
+ super.markProcessed(event);
1254
1310
  }
1255
1311
  };
1256
- const deduplicator = new MessageDeduplicator();
1312
+ const deduplicator = new Deduplicator();
1257
1313
  const runtimePlugins = /* @__PURE__ */ new Map();
1258
1314
  const buildRemovedActions = (bot) => Object.fromEntries(Object.entries(actions_exports).map(([k, v]) => [k, bindBot(bot, v)]));
1259
1315
  /**
@@ -1275,6 +1331,24 @@ function isMessageEvent(event) {
1275
1331
  return isGroupMessageEvent(event) || isPrivateMessageEvent(event);
1276
1332
  }
1277
1333
  /**
1334
+ * 检查事件是否是请求事件
1335
+ */
1336
+ function isRequestEvent(event) {
1337
+ return event?.post_type === "request";
1338
+ }
1339
+ /**
1340
+ * 检查事件是否是群通知事件
1341
+ */
1342
+ function isGroupNoticeEvent(event) {
1343
+ return event?.post_type === "notice" && event?.notice_type === "group";
1344
+ }
1345
+ /**
1346
+ * 检查事件是否需要去重
1347
+ */
1348
+ function isDeduplicableEvent(event) {
1349
+ return isMessageEvent(event) || isRequestEvent(event) || isGroupNoticeEvent(event);
1350
+ }
1351
+ /**
1278
1352
  * 定义一个 Mioki 插件
1279
1353
  * @param plugin Mioki 插件对象
1280
1354
  * @returns Mioki 插件对象
@@ -1325,22 +1399,26 @@ async function enablePlugin(bots, plugin, type = "external") {
1325
1399
  clears.add(remove);
1326
1400
  return remove;
1327
1401
  },
1328
- handle: (eventName, handler) => {
1402
+ handle: (eventName, handler, options = {}) => {
1329
1403
  logger$1.debug(`Registering event handler for event: ${String(eventName)}`);
1404
+ const { deduplicate = true } = options;
1405
+ const dedupeScope = `${name}:${String(eventName)}:${node_crypto.default.randomUUID()}`;
1330
1406
  const unsubscribes = [];
1331
1407
  for (const bot$1 of bots) {
1332
- const wrappedHandler = (event) => {
1333
- if (isMessageEvent(event)) {
1334
- const messageEvent = event;
1335
- if (isPrivateMessageEvent(messageEvent)) {
1336
- if (messageEvent.self_id !== bot$1.bot_id) return;
1337
- }
1338
- if (isGroupMessageEvent(messageEvent)) {
1339
- if (deduplicator.isProcessed(messageEvent)) return;
1340
- deduplicator.markProcessed(messageEvent);
1341
- }
1408
+ const wrappedHandler = (e) => {
1409
+ if (isPrivateMessageEvent(e)) {
1410
+ if (e.self_id !== bot$1.bot_id) return;
1411
+ }
1412
+ const senderUserId = e.user_id;
1413
+ const senderOperatorId = e.operator_id;
1414
+ const isFromConnectedBot = senderUserId && bots.some((b) => b.bot_id === senderUserId);
1415
+ const isFromConnectedBotOperator = senderOperatorId && bots.some((b) => b.bot_id === senderOperatorId);
1416
+ if (isFromConnectedBot || isFromConnectedBotOperator) return;
1417
+ if (deduplicate && isDeduplicableEvent(e)) {
1418
+ if (deduplicator.isProcessed(e, dedupeScope)) return;
1419
+ deduplicator.markProcessed(e, dedupeScope);
1342
1420
  }
1343
- handler(event);
1421
+ handler(e);
1344
1422
  };
1345
1423
  bot$1.on(eventName, wrappedHandler);
1346
1424
  const unsubscribe = () => {
@@ -2061,6 +2139,7 @@ exports.BOT_CWD = BOT_CWD;
2061
2139
  exports.BUILTIN_PLUGINS = BUILTIN_PLUGINS;
2062
2140
  exports.CORE_PLUGINS = CORE_PLUGINS;
2063
2141
  exports.ChromeUA = ChromeUA;
2142
+ exports.Deduplicator = Deduplicator;
2064
2143
  exports.MessageDeduplicator = MessageDeduplicator;
2065
2144
  exports.START_TIME = START_TIME;
2066
2145
  exports.SystemMap = SystemMap;