@zhin.js/adapter-kook 5.0.1 → 5.0.3

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.
Files changed (97) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +58 -451
  3. package/adapters/kook.ts +46 -0
  4. package/agent/tools/blacklist.ts +33 -0
  5. package/agent/tools/create_role.ts +25 -0
  6. package/agent/tools/delete_role.ts +21 -0
  7. package/agent/tools/grant_role.ts +22 -0
  8. package/agent/tools/list_roles.ts +27 -0
  9. package/agent/tools/revoke_role.ts +22 -0
  10. package/lib/endpoint.d.ts +80 -151
  11. package/lib/endpoint.js +260 -736
  12. package/lib/index.d.ts +6 -18
  13. package/lib/index.js +6 -350
  14. package/lib/kook-agent-deps.d.ts +29 -0
  15. package/lib/kook-agent-deps.js +30 -0
  16. package/lib/platform-permit.d.ts +12 -3
  17. package/lib/platform-permit.js +5 -3
  18. package/lib/protocol.d.ts +147 -0
  19. package/lib/protocol.js +279 -0
  20. package/lib/webhook.d.ts +15 -0
  21. package/lib/webhook.js +76 -0
  22. package/lib/ws.d.ts +42 -0
  23. package/lib/ws.js +63 -0
  24. package/package.json +47 -33
  25. package/plugin.ts +13 -0
  26. package/schema.json +55 -0
  27. package/src/endpoint.ts +287 -866
  28. package/src/index.ts +55 -331
  29. package/src/kook-agent-deps.ts +55 -0
  30. package/src/platform-permit.ts +13 -4
  31. package/src/protocol.ts +429 -0
  32. package/src/webhook.ts +116 -0
  33. package/src/ws.ts +120 -0
  34. package/client/Dashboard.tsx +0 -255
  35. package/client/index.tsx +0 -11
  36. package/client/tsconfig.json +0 -7
  37. package/client/utils/api.ts +0 -30
  38. package/dist/index.js +0 -31
  39. package/lib/adapter.d.ts +0 -30
  40. package/lib/adapter.d.ts.map +0 -1
  41. package/lib/adapter.js +0 -67
  42. package/lib/adapter.js.map +0 -1
  43. package/lib/endpoint.d.ts.map +0 -1
  44. package/lib/endpoint.js.map +0 -1
  45. package/lib/index.d.ts.map +0 -1
  46. package/lib/index.js.map +0 -1
  47. package/lib/kook-asset-upload.d.ts +0 -12
  48. package/lib/kook-asset-upload.d.ts.map +0 -1
  49. package/lib/kook-asset-upload.js +0 -46
  50. package/lib/kook-asset-upload.js.map +0 -1
  51. package/lib/kook-inbound.d.ts +0 -6
  52. package/lib/kook-inbound.d.ts.map +0 -1
  53. package/lib/kook-inbound.js +0 -22
  54. package/lib/kook-inbound.js.map +0 -1
  55. package/lib/kook-msg-route.d.ts +0 -34
  56. package/lib/kook-msg-route.d.ts.map +0 -1
  57. package/lib/kook-msg-route.js +0 -106
  58. package/lib/kook-msg-route.js.map +0 -1
  59. package/lib/kook-side-events.d.ts +0 -46
  60. package/lib/kook-side-events.d.ts.map +0 -1
  61. package/lib/kook-side-events.js +0 -189
  62. package/lib/kook-side-events.js.map +0 -1
  63. package/lib/outbound-keyboard.d.ts +0 -13
  64. package/lib/outbound-keyboard.d.ts.map +0 -1
  65. package/lib/outbound-keyboard.js +0 -63
  66. package/lib/outbound-keyboard.js.map +0 -1
  67. package/lib/outbound-media.d.ts +0 -10
  68. package/lib/outbound-media.d.ts.map +0 -1
  69. package/lib/outbound-media.js +0 -42
  70. package/lib/outbound-media.js.map +0 -1
  71. package/lib/outbound-sendable.d.ts +0 -12
  72. package/lib/outbound-sendable.d.ts.map +0 -1
  73. package/lib/outbound-sendable.js +0 -64
  74. package/lib/outbound-sendable.js.map +0 -1
  75. package/lib/platform-permit.d.ts.map +0 -1
  76. package/lib/platform-permit.js.map +0 -1
  77. package/lib/segment-mapper.d.ts +0 -2
  78. package/lib/segment-mapper.d.ts.map +0 -1
  79. package/lib/segment-mapper.js +0 -2
  80. package/lib/segment-mapper.js.map +0 -1
  81. package/lib/types.d.ts +0 -54
  82. package/lib/types.d.ts.map +0 -1
  83. package/lib/types.js +0 -8
  84. package/lib/types.js.map +0 -1
  85. package/plugin.yml +0 -3
  86. package/src/adapter.ts +0 -76
  87. package/src/kook-asset-upload.ts +0 -55
  88. package/src/kook-inbound.ts +0 -22
  89. package/src/kook-msg-route.ts +0 -122
  90. package/src/kook-side-events.ts +0 -250
  91. package/src/outbound-keyboard.ts +0 -78
  92. package/src/outbound-media.ts +0 -67
  93. package/src/outbound-sendable.ts +0 -73
  94. package/src/segment-mapper.ts +0 -1
  95. package/src/types.ts +0 -59
  96. /package/{skills/kook → agent}/PERMITS.md +0 -0
  97. /package/{skills/kook/SKILL.md → agent/skills/kook.md} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"outbound-media.js","sourceRoot":"","sources":["../src/outbound-media.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,qBAAqB,GACtB,MAAM,SAAS,CAAC;AAMjB,SAAS,gBAAgB,CAAC,GAAmB;IAC3C,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;AACtC,CAAC;AAED,SAAS,eAAe,CAAC,GAAmB,EAAE,WAAmB;IAC/D,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAA6B,CAAC;IACxD,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC;IACvB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IACxB,OAAO,IAAI,CAAC,MAAM,CAAC;IACnB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAoB,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAA2B,EAC3B,GAAmB;IAEnB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAE9C,MAAM,IAAI,GAAG,GAAG,CAAC,IAA+B,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,QAA2B,EAC3B,OAAoB;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Zhin 消息段 → kook-client Sendable。
3
- * 图片/音视频须用 segment 发送对应 msg_type,不能写成 Markdown ![alt](url)。
4
- */
5
- import { type MessageSegment as KookMessageSegment } from "kook-client";
6
- import type { MessageElement } from "zhin.js";
7
- export type KookSendable = string | KookMessageSegment[] | Array<Record<string, unknown>>;
8
- /**
9
- * 单张图片(可带 reply)→ kook image 消息段(type=2)
10
- */
11
- export declare function convertToKookSendable(elements: MessageElement[], formatText: (content: MessageElement[]) => string): KookSendable;
12
- //# sourceMappingURL=outbound-sendable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outbound-sendable.d.ts","sourceRoot":"","sources":["../src/outbound-sendable.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAW,KAAK,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAM1F;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,EAAE,EAC1B,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,MAAM,GAChD,YAAY,CAoDd"}
@@ -1,64 +0,0 @@
1
- /**
2
- * Zhin 消息段 → kook-client Sendable。
3
- * 图片/音视频须用 segment 发送对应 msg_type,不能写成 Markdown ![alt](url)。
4
- */
5
- import { segment } from "kook-client";
6
- import { coreKeyboardToKookCard, findKeyboardSegment } from "./outbound-keyboard.js";
7
- function mediaUrl(data) {
8
- return String(data.url ?? data.file ?? "");
9
- }
10
- /**
11
- * 单张图片(可带 reply)→ kook image 消息段(type=2)
12
- */
13
- export function convertToKookSendable(elements, formatText) {
14
- const keyboardBundle = findKeyboardSegment(elements);
15
- if (keyboardBundle) {
16
- const { keyboard, rest } = keyboardBundle;
17
- const nonReplyRest = rest.filter((el) => el.type !== "reply");
18
- if (nonReplyRest.every((el) => el.type === "text" || el.type === "reply")) {
19
- return coreKeyboardToKookCard(keyboard.data, nonReplyRest.filter((el) => el.type === "text"));
20
- }
21
- }
22
- const replies = [];
23
- const images = [];
24
- const videos = [];
25
- const audios = [];
26
- const rest = [];
27
- for (const el of elements) {
28
- if (el.type === "reply" && el.data.id) {
29
- replies.push(String(el.data.id));
30
- continue;
31
- }
32
- if (el.type === "image") {
33
- const url = mediaUrl(el.data);
34
- if (url)
35
- images.push(url);
36
- continue;
37
- }
38
- if (el.type === "video") {
39
- const url = mediaUrl(el.data);
40
- if (url)
41
- videos.push(url);
42
- continue;
43
- }
44
- if (el.type === "audio") {
45
- const url = mediaUrl(el.data);
46
- if (url)
47
- audios.push(url);
48
- continue;
49
- }
50
- rest.push(el);
51
- }
52
- const replySegs = replies.map((id) => segment.reply(id));
53
- if (images.length === 1 && videos.length === 0 && audios.length === 0 && rest.length === 0) {
54
- return [...replySegs, segment.image(images[0])];
55
- }
56
- if (videos.length === 1 && images.length === 0 && audios.length === 0 && rest.length === 0) {
57
- return [...replySegs, segment.video(videos[0])];
58
- }
59
- if (audios.length === 1 && images.length === 0 && videos.length === 0 && rest.length === 0) {
60
- return [...replySegs, segment.audio(audios[0])];
61
- }
62
- return formatText(elements);
63
- }
64
- //# sourceMappingURL=outbound-sendable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outbound-sendable.js","sourceRoot":"","sources":["../src/outbound-sendable.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"platform-permit.d.ts","sourceRoot":"","sources":["../src/platform-permit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAOD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,OAAO,GACjB;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAmB3C;AAWD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAgBpF;AAED,wBAAgB,iCAAiC,IAAI,MAAM,IAAI,CAE9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"platform-permit.js","sourceRoot":"","sources":["../src/platform-permit.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export { toCanonicalSegments, fromCanonicalSegments } from 'zhin.js';
2
- //# sourceMappingURL=segment-mapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"segment-mapper.d.ts","sourceRoot":"","sources":["../src/segment-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
@@ -1,2 +0,0 @@
1
- export { toCanonicalSegments, fromCanonicalSegments } from 'zhin.js';
2
- //# sourceMappingURL=segment-mapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"segment-mapper.js","sourceRoot":"","sources":["../src/segment-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
package/lib/types.d.ts DELETED
@@ -1,54 +0,0 @@
1
- /**
2
- * KOOK 适配器类型与配置
3
- */
4
- import type { PrivateMessageEvent, ChannelMessageEvent } from "kook-client";
5
- import type { LogLevel } from "kook-client";
6
- export type { LogLevel };
7
- export declare enum KookPermission {
8
- Normal = 1,
9
- Admin = 2,
10
- Owner = 4,
11
- ChannelAdmin = 5
12
- }
13
- export interface KookSenderInfo {
14
- id: string;
15
- name: string;
16
- permission?: KookPermission;
17
- roles?: number[];
18
- isGuildOwner?: boolean;
19
- isAdmin?: boolean;
20
- /** 归一化平台身份(供 platform checker) */
21
- role?: string;
22
- permissions?: string[];
23
- }
24
- export interface KookTypingIndicatorConfig {
25
- enabled?: boolean;
26
- defaultEmoji?: string;
27
- autoRemove?: boolean;
28
- removeDelay?: number;
29
- privateConfig?: {
30
- type?: 'reaction' | 'message' | 'typing' | 'none';
31
- emoji?: string;
32
- message?: string;
33
- };
34
- /** 频道/群聊(KOOK channel 走 groupConfig 合并逻辑) */
35
- groupConfig?: {
36
- type?: 'reaction' | 'message' | 'typing' | 'none';
37
- emoji?: string;
38
- message?: string;
39
- };
40
- }
41
- export interface KookEndpointConfig {
42
- context: "kook";
43
- name: string;
44
- token: string;
45
- data_dir?: string;
46
- timeout?: number;
47
- max_retry?: number;
48
- ignore?: "bot" | "self";
49
- logLevel?: LogLevel;
50
- /** AI 处理中提示(reaction 推荐:不打断会话) */
51
- typingIndicator?: KookTypingIndicatorConfig;
52
- }
53
- export type KookRawMessage = PrivateMessageEvent | ChannelMessageEvent;
54
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,oBAAY,cAAc;IACxB,MAAM,IAAI;IACV,KAAK,IAAI;IACT,KAAK,IAAI;IACT,YAAY,IAAI;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,6CAA6C;IAC7C,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kCAAkC;IAClC,eAAe,CAAC,EAAE,yBAAyB,CAAC;CAC7C;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,mBAAmB,CAAC"}
package/lib/types.js DELETED
@@ -1,8 +0,0 @@
1
- export var KookPermission;
2
- (function (KookPermission) {
3
- KookPermission[KookPermission["Normal"] = 1] = "Normal";
4
- KookPermission[KookPermission["Admin"] = 2] = "Admin";
5
- KookPermission[KookPermission["Owner"] = 4] = "Owner";
6
- KookPermission[KookPermission["ChannelAdmin"] = 5] = "ChannelAdmin";
7
- })(KookPermission || (KookPermission = {}));
8
- //# sourceMappingURL=types.js.map
package/lib/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAQA,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,uDAAU,CAAA;IACV,qDAAS,CAAA;IACT,qDAAS,CAAA;IACT,mEAAgB,CAAA;AAClB,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB"}
package/plugin.yml DELETED
@@ -1,3 +0,0 @@
1
- name: adapter-kook
2
- description: KOOK 适配器:服务器管理、角色管理、黑名单
3
- version: 1.0.59
package/src/adapter.ts DELETED
@@ -1,76 +0,0 @@
1
- /**
2
- * KOOK 适配器
3
- */
4
- import { formatCompact, Adapter, Plugin } from 'zhin.js';
5
- import { KookEndpoint } from "./endpoint.js";
6
- import type { KookEndpointConfig } from "./types.js";
7
- import type { OutboundRichSegmentPolicy } from "zhin.js";
8
-
9
- export class KookAdapter extends Adapter<KookEndpoint> {
10
- static override readonly capabilities = ['inbound', 'outbound'] as const;
11
- static override outboundRichSegmentPolicy: OutboundRichSegmentPolicy = {
12
- qrcode: 'image',
13
- html: 'image',
14
- markdown: 'origin',
15
- };
16
- static override interactivePolicy = 'native' as const;
17
-
18
- constructor(plugin: Plugin) {
19
- super(plugin, "kook", []);
20
- }
21
-
22
- createEndpoint(config: KookEndpointConfig): KookEndpoint {
23
- return new KookEndpoint(this, config);
24
- }
25
-
26
- // ── ISceneManagement 标准群管方法 ──────────────────────────────────
27
-
28
- async removeMember(endpointId: string, sceneId: string, userId: string) {
29
- const endpoint = this.endpoints.get(endpointId);
30
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
31
- return endpoint.kickUser(sceneId, userId);
32
- }
33
-
34
- async banMember(endpointId: string, sceneId: string, userId: string, reason?: string) {
35
- const endpoint = this.endpoints.get(endpointId);
36
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
37
- return endpoint.addToBlacklist(sceneId, userId, reason);
38
- }
39
-
40
- async unbanMember(endpointId: string, sceneId: string, userId: string) {
41
- const endpoint = this.endpoints.get(endpointId);
42
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
43
- return endpoint.removeFromBlacklist(sceneId, userId);
44
- }
45
-
46
- async setMemberNickname(endpointId: string, sceneId: string, userId: string, nickname: string) {
47
- const endpoint = this.endpoints.get(endpointId);
48
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
49
- return endpoint.setNickname(sceneId, userId, nickname);
50
- }
51
-
52
- async listMembers(endpointId: string, sceneId: string) {
53
- const endpoint = this.endpoints.get(endpointId);
54
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
55
- const members = await endpoint.getGuildMembers(sceneId);
56
- return {
57
- members: members.map(m => ({
58
- id: m.id, username: m.username,
59
- nickname: m.nickname, roles: m.roles,
60
- })),
61
- count: members.length,
62
- };
63
- }
64
-
65
- // ── 生命周期 ───────────────────────────────────────────────────────
66
-
67
- async start(): Promise<void> {
68
- await super.start();
69
- }
70
-
71
- async stop(): Promise<void> {
72
- await super.stop();
73
- this.plugin.logger.info(formatCompact( { op: "stop" }));
74
- }
75
- }
76
-
@@ -1,55 +0,0 @@
1
- /**
2
- * KOOK /v3/asset/create 上传(formdata-node 要求 Blob,不能直传 Node Buffer)。
3
- */
4
- import { readFile } from "node:fs/promises";
5
-
6
- export interface KookAssetRequest {
7
- post(
8
- url: string,
9
- data: FormData,
10
- config?: { headers?: Record<string, string> },
11
- ): Promise<{ data?: { url?: string }; message?: string }>;
12
- }
13
-
14
- function guessFilename(data: string | Buffer): string {
15
- if (Buffer.isBuffer(data)) return "upload.png";
16
- if (/^data:image\/png/i.test(data)) return "upload.png";
17
- if (/^data:image\/jpe?g/i.test(data)) return "upload.jpg";
18
- if (/^data:image\/gif/i.test(data)) return "upload.gif";
19
- if (/^data:image\/webp/i.test(data)) return "upload.webp";
20
- const base = data.replace(/^file:\/\//, "").split("/").pop();
21
- return base?.includes(".") ? base : "upload.png";
22
- }
23
-
24
- async function toBuffer(data: string | Buffer): Promise<Buffer> {
25
- if (Buffer.isBuffer(data)) return data;
26
- if (data.startsWith("base64://")) {
27
- return Buffer.from(data.slice(9), "base64");
28
- }
29
- if (/^data:[^/]+\/[^;]+;base64,/i.test(data)) {
30
- return Buffer.from(data.replace(/^data:[^/]+\/[^;]+;base64,/, ""), "base64");
31
- }
32
- return readFile(data.replace(/^file:\/\//, ""));
33
- }
34
-
35
- export async function uploadKookAsset(
36
- request: KookAssetRequest,
37
- data: string | Buffer,
38
- ): Promise<string> {
39
- if (typeof data === "string" && /^https?:\/\//i.test(data)) {
40
- return data;
41
- }
42
- const buffer = await toBuffer(data);
43
- const form = new globalThis.FormData();
44
- form.append("file", new globalThis.Blob([new Uint8Array(buffer)]), guessFilename(data));
45
-
46
- const response = await request.post("/v3/asset/create", form, {
47
- headers: { Accept: "application/json" },
48
- });
49
-
50
- const url = response.data?.url;
51
- if (!url) {
52
- throw new Error(`KOOK asset upload failed: ${response.message ?? "missing url"}`);
53
- }
54
- return url;
55
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * KOOK 入站侧事件去重(gateway notice / 系统消息)
3
- */
4
- const DEDUPE_TTL_MS = 120_000;
5
-
6
- export class InboundMessageDeduper {
7
- private readonly seen = new Map<string, number>();
8
-
9
- shouldProcess(key: string): boolean {
10
- const now = Date.now();
11
- for (const [id, t] of this.seen) {
12
- if (now - t > DEDUPE_TTL_MS) this.seen.delete(id);
13
- }
14
- if (this.seen.has(key)) return false;
15
- this.seen.set(key, now);
16
- return true;
17
- }
18
-
19
- clear(): void {
20
- this.seen.clear();
21
- }
22
- }
@@ -1,122 +0,0 @@
1
- /**
2
- * KOOK msg_id 路由:频道 / 私聊 API 路径不同,出站编码路由、入站/删除按路由命中。
3
- */
4
-
5
- export type KookMsgRoute = 'channel' | 'direct';
6
-
7
- export function routeFromSceneType(
8
- sceneType?: 'private' | 'group' | 'channel',
9
- ): KookMsgRoute | undefined {
10
- if (sceneType === 'private') return 'direct';
11
- if (sceneType === 'group' || sceneType === 'channel') return 'channel';
12
- return undefined;
13
- }
14
-
15
- export function routeFromSendType(type: 'private' | 'group' | 'channel'): KookMsgRoute {
16
- return type === 'private' ? 'direct' : 'channel';
17
- }
18
-
19
- /** 出站 send 返回值,供 recall / typing 删除时走路由 */
20
- export function encodeKookMsgRef(route: KookMsgRoute, msgId: string): string {
21
- return `kook:${route}:${msgId}`;
22
- }
23
-
24
- export function parseKookMsgRef(ref: string): { route?: KookMsgRoute; msgId: string } {
25
- const parts = ref.split(':');
26
- if (parts[0] === 'kook' && (parts[1] === 'channel' || parts[1] === 'direct') && parts.length >= 3) {
27
- return { route: parts[1], msgId: parts.slice(2).join(':') };
28
- }
29
- return { msgId: ref };
30
- }
31
-
32
- export function plainKookMsgId(ref: string): string {
33
- return parseKookMsgRef(ref).msgId;
34
- }
35
-
36
- export function resolveKookRoutes(
37
- action: 'add' | 'delete',
38
- routeHint?: KookMsgRoute,
39
- ): KookMsgRoute[] {
40
- if (action === 'delete' && routeHint) return [routeHint];
41
- if (routeHint) return [routeHint, routeHint === 'channel' ? 'direct' : 'channel'];
42
- return ['channel', 'direct'];
43
- }
44
-
45
- function isKookGoneText(text: string): boolean {
46
- return text.includes('404')
47
- || text.includes('该数据不存在')
48
- || text.includes('没有权限操作')
49
- || text.toLowerCase().includes('not found');
50
- }
51
-
52
- export function isKookMsgGoneError(err: unknown): boolean {
53
- return isKookGoneText(err instanceof Error ? err.message : String(err));
54
- }
55
-
56
- /** KOOK 标准成功:code=0;少数接口 HTTP 200 省略 code */
57
- export function isKookApiSuccess(result: unknown): boolean {
58
- if (result == null || typeof result !== 'object') return false;
59
- const { code } = result as { code?: number };
60
- if (code === 0) return true;
61
- if (code === undefined) return true;
62
- return false;
63
- }
64
-
65
- /** 明确的业务失败(可尝试另一路由) */
66
- export function isKookExplicitError(result: unknown): boolean {
67
- if (result == null || typeof result !== 'object') return false;
68
- const { code } = result as { code?: number };
69
- return typeof code === 'number' && code !== 0;
70
- }
71
-
72
- /**
73
- * delete 请求已返回且未抛错:是否停止(不再打第二条路由)。
74
- * 仅当双路由且响应为明确错误码时,才继续尝试下一路由。
75
- */
76
- export function shouldStopDeleteAfterResponse(
77
- result: unknown,
78
- routeCount: number,
79
- ): boolean {
80
- if (isKookApiSuccess(result) || isKookApiGoneResult(result)) return true;
81
- if (routeCount === 1) return true;
82
- return !isKookExplicitError(result);
83
- }
84
-
85
- /** KOOK 有时用 HTTP 200 + 非 0 code 表示目标已不存在 */
86
- export function isKookApiGoneResult(result: unknown): boolean {
87
- if (!result || typeof result !== 'object') return false;
88
- const { code, message } = result as { code?: number; message?: string };
89
- if (code === 404) return true;
90
- return isKookGoneText(message ?? '');
91
- }
92
-
93
- export function kookDeleteApiPath(route: KookMsgRoute): string {
94
- return route === 'channel' ? '/v3/message/delete' : '/v3/direct-message/delete';
95
- }
96
-
97
- export function kookReactionApiPath(route: KookMsgRoute, action: 'add' | 'delete'): string {
98
- const prefix = route === 'channel' ? '/v3/message' : '/v3/direct-message';
99
- const suffix = action === 'add' ? 'add-reaction' : 'delete-reaction';
100
- return `${prefix}/${suffix}`;
101
- }
102
-
103
- export function encodeKookReactionId(route: KookMsgRoute, msgId: string, emoji: string): string {
104
- return `reaction:${route}:${msgId}:${emoji}`;
105
- }
106
-
107
- export function parseKookReactionId(reactionId: string): {
108
- route?: KookMsgRoute;
109
- emoji: string;
110
- } {
111
- const parts = reactionId.split(':');
112
- if (parts[0] === 'reaction' && (parts[1] === 'channel' || parts[1] === 'direct')) {
113
- return {
114
- route: parts[1],
115
- emoji: parts.slice(3).join(':') || '⏳',
116
- };
117
- }
118
- if (parts[0] === 'reaction' && parts.length >= 3) {
119
- return { emoji: parts.slice(2).join(':') || '⏳' };
120
- }
121
- return { emoji: parts[parts.length - 1] ?? '⏳' };
122
- }