koishi-plugin-echo-cave 1.32.3 → 1.34.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.
@@ -4,6 +4,8 @@ export type OversizedMediaCleanupMode = 'delete-cave' | 'keep-cave';
4
4
  export type ForwardSpecialUserHandlingMode = 'ignore' | 'reject' | 'confirm';
5
5
  export type S3UploadFailureFallbackMode = 'local' | 'original-link';
6
6
  export interface Config {
7
+ enableChannelWhitelist?: boolean;
8
+ channelWhitelist?: string[];
7
9
  adminMessageProtection?: boolean;
8
10
  adminIds?: string[];
9
11
  allowContributorDelete?: boolean;
@@ -21,6 +23,7 @@ export interface Config {
21
23
  enableForwardUserSelection?: boolean;
22
24
  autoBindSingleForwardUser?: boolean;
23
25
  forwardSpecialUserHandlingMode?: ForwardSpecialUserHandlingMode;
26
+ enablePokeTrigger?: boolean;
24
27
  alpha?: number;
25
28
  mediaStorage?: 'local' | 's3';
26
29
  s3UploadFailureFallbackMode?: S3UploadFailureFallbackMode;
package/lib/index.cjs CHANGED
@@ -4083,6 +4083,8 @@ var zh_CN_default = {
4083
4083
 
4084
4084
  // src/config/locales/zh-CN.json
4085
4085
  var zh_CN_default2 = {
4086
+ enableChannelWhitelist: "\u662F\u5426\u542F\u7528\u7FA4\u804A\u767D\u540D\u5355\u6A21\u5F0F\uFF0C\u5F00\u542F\u540E\u4EC5\u5728\u767D\u540D\u5355\u4E2D\u7684\u7FA4\u804A\u53EF\u4EE5\u4F7F\u7528\u56DE\u58F0\u6D1E\u529F\u80FD\uFF1B\u5173\u95ED\u5219\u9ED8\u8BA4\u5168\u90E8\u7FA4\u804A\u5747\u53EF\u7528",
4087
+ channelWhitelist: "\u7FA4\u804A\u767D\u540D\u5355 (channel ID \u5217\u8868)\uFF0C\u4EC5\u5728\u542F\u7528\u767D\u540D\u5355\u6A21\u5F0F\u65F6\u751F\u6548",
4086
4088
  adminMessageProtection: "\u5F00\u542F\u7BA1\u7406\u5458\u6D88\u606F\u4FDD\u62A4\uFF0C\u5F00\u542F\u540E\u7BA1\u7406\u5458\u53D1\u5E03\u7684\u6D88\u606F\u53EA\u80FD\u7531\u7BA1\u7406\u5458\u5220\u9664",
4087
4089
  adminIds: "\u7BA1\u7406\u5458 ID \u5217\u8868\uFF0C\u4EC5\u8FD9\u4E9B\u7528\u6237\u53EF\u5728\u79C1\u804A\u4F7F\u7528\u7BA1\u7406\u8FC1\u79FB\u547D\u4EE4",
4088
4090
  allowContributorDelete: "\u5141\u8BB8\u6295\u7A3F\u8005\u5220\u9664\u81EA\u5DF1\u6295\u7A3F\u7684\u56DE\u58F0\u6D1E",
@@ -4101,6 +4103,7 @@ var zh_CN_default2 = {
4101
4103
  enableForwardUserSelection: "\u662F\u5426\u542F\u7528\u5408\u5E76\u8F6C\u53D1\u6D88\u606F\u7684\u5173\u8054\u7528\u6237\u9009\u62E9\u529F\u80FD",
4102
4104
  autoBindSingleForwardUser: "\u5408\u5E76\u8F6C\u53D1\u6D88\u606F\u4EC5\u8BC6\u522B\u5230\u4E00\u4E2A\u7528\u6237\u65F6\uFF0C\u662F\u5426\u9ED8\u8BA4\u81EA\u52A8\u7ED1\u5B9A\u8BE5\u7528\u6237",
4103
4105
  forwardSpecialUserHandlingMode: "\u68C0\u6D4B\u5230\u7279\u6B8A\u7528\u6237 1094950020 \u65F6\u7684\u5904\u7406\u65B9\u5F0F\uFF1Aignore \u4E3A\u5FFD\u7565\uFF0Creject \u4E3A\u63D0\u9192\u5E76\u62D2\u7EDD\u5B58\u50A8\uFF0Cconfirm \u4E3A\u63D0\u9192\u3001\u5C55\u793A\u8F6C\u53D1\u5185\u5BB9\u5E76\u8981\u6C42\u786E\u8BA4\u540E\u518D\u5B58\u50A8",
4106
+ enablePokeTrigger: "\u5728\u7FA4\u804A\u4E2D\u62CD\u4E00\u62CD\u673A\u5668\u4EBA\u65F6\uFF0C\u662F\u5426\u89E6\u53D1\u4E0E cave \u6307\u4EE4\u76F8\u540C\u7684\u968F\u673A\u62BD\u53D6\u6548\u679C\uFF08\u4EC5 OneBot/NapCat \u7B49\u652F\u6301 notify.poke \u4E8B\u4EF6\u7684\u9002\u914D\u5668\u6709\u6548\uFF09",
4104
4107
  alpha: "\u52A0\u6743\u968F\u673A\u62BD\u53D6\u7684\u8C03\u6574\u56E0\u5B50\uFF0C\u63A7\u5236\u62BD\u53D6\u6B21\u6570\u5BF9\u6982\u7387\u7684\u5F71\u54CD\u7A0B\u5EA6\uFF0C\u503C\u8D8A\u5927\u5F71\u54CD\u8D8A\u660E\u663E",
4105
4108
  mediaStorage: "\u5A92\u4F53\u5B58\u50A8\u65B9\u5F0F\uFF1Alocal \u4E3A\u672C\u5730\uFF0Cs3 \u4E3A\u5BF9\u8C61\u5B58\u50A8",
4106
4109
  s3UploadFailureFallbackMode: "\u4EC5\u5728\u5A92\u4F53\u5B58\u50A8\u65B9\u5F0F\u4E3A s3 \u65F6\u751F\u6548\uFF1AS3 \u4E0A\u4F20\u5931\u8D25\u540E\u56DE\u9000\u5230\u672C\u5730\u5B58\u50A8\uFF0C\u6216\u4FDD\u7559\u539F\u59CB\u94FE\u63A5",
@@ -4122,6 +4125,10 @@ var zh_CN_default2 = {
4122
4125
  // src/config/config.ts
4123
4126
  var import_koishi2 = require("koishi");
4124
4127
  var Config = import_koishi2.Schema.intersect([
4128
+ import_koishi2.Schema.object({
4129
+ enableChannelWhitelist: import_koishi2.Schema.boolean().default(false),
4130
+ channelWhitelist: import_koishi2.Schema.array(String).role("table").default([])
4131
+ }).description("\u7FA4\u804A\u767D\u540D\u5355"),
4125
4132
  import_koishi2.Schema.object({
4126
4133
  adminMessageProtection: import_koishi2.Schema.boolean().default(false),
4127
4134
  adminIds: import_koishi2.Schema.array(String).role("table").default([]),
@@ -4135,7 +4142,8 @@ var Config = import_koishi2.Schema.intersect([
4135
4142
  enableForwardUserSelection: import_koishi2.Schema.boolean().default(true),
4136
4143
  forwardSelectTimeout: import_koishi2.Schema.number().default(20),
4137
4144
  autoBindSingleForwardUser: import_koishi2.Schema.boolean().default(false),
4138
- forwardSpecialUserHandlingMode: import_koishi2.Schema.union(["ignore", "reject", "confirm"]).default("ignore")
4145
+ forwardSpecialUserHandlingMode: import_koishi2.Schema.union(["ignore", "reject", "confirm"]).default("ignore"),
4146
+ enablePokeTrigger: import_koishi2.Schema.boolean().default(true)
4139
4147
  }).description("\u6D88\u606F\u884C\u4E3A"),
4140
4148
  import_koishi2.Schema.object({
4141
4149
  deleteMediaWhenDeletingMsg: import_koishi2.Schema.boolean().default(true),
@@ -4266,6 +4274,24 @@ function apply(ctx, cfg) {
4266
4274
  primary: "userId"
4267
4275
  }
4268
4276
  );
4277
+ const isCaveCommandWord = (word) => word === "cave" || word.startsWith("cave.");
4278
+ const isChannelAllowed = (channelId) => {
4279
+ if (!cfg.enableChannelWhitelist) return true;
4280
+ if (!channelId) return true;
4281
+ return (cfg.channelWhitelist ?? []).includes(channelId);
4282
+ };
4283
+ ctx.middleware(async (session, next) => {
4284
+ if (!cfg.enableChannelWhitelist) return next();
4285
+ if (!session.guildId) return next();
4286
+ if (isChannelAllowed(session.channelId)) return next();
4287
+ const parsedContent = session.parsed?.content;
4288
+ const content = (parsedContent ?? session.content ?? "").trim();
4289
+ const firstWord = content.split(/\s+/)[0] ?? "";
4290
+ if (isCaveCommandWord(firstWord)) {
4291
+ return;
4292
+ }
4293
+ return next();
4294
+ }, true);
4269
4295
  ctx.model.migrate("echo_cave_v2", {}, async (database) => {
4270
4296
  const existing = await database.get(ACTIVE_CAVE_TABLE, {});
4271
4297
  if (existing.length > 0) {
@@ -4277,6 +4303,26 @@ function apply(ctx, cfg) {
4277
4303
  }
4278
4304
  });
4279
4305
  ctx.command("cave [target:text]").action(async ({ session }, target) => await getCave(ctx, session, cfg, target));
4306
+ const pokeCooldown = /* @__PURE__ */ new Map();
4307
+ const POKE_COOLDOWN_MS = 5e3;
4308
+ ctx.on("notice", async (session) => {
4309
+ if (session.platform !== "onebot") return;
4310
+ if (session.subtype !== "poke") return;
4311
+ if (!session.guildId) return;
4312
+ if (session["targetId"] !== session.selfId) return;
4313
+ if (cfg.enablePokeTrigger === false) return;
4314
+ if (!isChannelAllowed(session.channelId)) return;
4315
+ const key = `${session.channelId}:${session.userId}`;
4316
+ const now = Date.now();
4317
+ if (now - (pokeCooldown.get(key) ?? 0) < POKE_COOLDOWN_MS) return;
4318
+ if (pokeCooldown.size >= 256) {
4319
+ for (const [k, t] of pokeCooldown) {
4320
+ if (now - t > POKE_COOLDOWN_MS) pokeCooldown.delete(k);
4321
+ }
4322
+ }
4323
+ pokeCooldown.set(key, now);
4324
+ await session.execute("cave");
4325
+ });
4280
4326
  ctx.command("cave.pic").action(async ({ session }) => await getCave(ctx, session, cfg, void 0, true));
4281
4327
  ctx.command("cave.listen").action(async ({ session }) => await getCaveListByUser(ctx, session));
4282
4328
  ctx.command("cave.trace").action(async ({ session }) => await getCaveListByOriginUser(ctx, session));
package/lib/index.d.ts CHANGED
@@ -42,5 +42,8 @@ declare module 'koishi' {
42
42
  echo_cave_send_failure: EchoCaveSendFailure;
43
43
  echo_cave_user_state: EchoCaveUserState;
44
44
  }
45
+ interface Events {
46
+ notice(session: Session): void;
47
+ }
45
48
  }
46
49
  export declare function apply(ctx: Context, cfg: Config): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-echo-cave",
3
3
  "description": "Group echo cave",
4
- "version": "1.32.3",
4
+ "version": "1.34.0",
5
5
  "main": "lib/index.cjs",
6
6
  "typings": "lib/index.d.ts",
7
7
  "type": "module",