@zhin.js/adapter-kook 5.0.2 → 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 (88) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +58 -452
  3. package/adapters/kook.ts +46 -0
  4. package/agent/tools/blacklist.ts +2 -2
  5. package/agent/tools/create_role.ts +2 -2
  6. package/agent/tools/delete_role.ts +2 -2
  7. package/agent/tools/grant_role.ts +2 -2
  8. package/agent/tools/list_roles.ts +2 -2
  9. package/agent/tools/revoke_role.ts +2 -2
  10. package/lib/endpoint.d.ts +84 -0
  11. package/lib/endpoint.js +299 -0
  12. package/lib/index.d.ts +6 -0
  13. package/lib/index.js +6 -0
  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 +23 -0
  17. package/lib/{src/platform-permit.js → platform-permit.js} +2 -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 +44 -40
  25. package/plugin.ts +13 -0
  26. package/schema.json +55 -0
  27. package/src/endpoint.ts +287 -879
  28. package/src/index.ts +55 -177
  29. package/src/kook-agent-deps.ts +44 -11
  30. package/src/platform-permit.ts +13 -3
  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/agent/tools/blacklist.js +0 -33
  40. package/lib/agent/tools/blacklist.js.map +0 -1
  41. package/lib/agent/tools/create_role.js +0 -25
  42. package/lib/agent/tools/create_role.js.map +0 -1
  43. package/lib/agent/tools/delete_role.js +0 -21
  44. package/lib/agent/tools/delete_role.js.map +0 -1
  45. package/lib/agent/tools/grant_role.js +0 -22
  46. package/lib/agent/tools/grant_role.js.map +0 -1
  47. package/lib/agent/tools/list_roles.js +0 -27
  48. package/lib/agent/tools/list_roles.js.map +0 -1
  49. package/lib/agent/tools/revoke_role.js +0 -22
  50. package/lib/agent/tools/revoke_role.js.map +0 -1
  51. package/lib/src/adapter.js +0 -67
  52. package/lib/src/adapter.js.map +0 -1
  53. package/lib/src/endpoint.js +0 -796
  54. package/lib/src/endpoint.js.map +0 -1
  55. package/lib/src/index.js +0 -197
  56. package/lib/src/index.js.map +0 -1
  57. package/lib/src/kook-agent-deps.js +0 -10
  58. package/lib/src/kook-agent-deps.js.map +0 -1
  59. package/lib/src/kook-asset-upload.js +0 -46
  60. package/lib/src/kook-asset-upload.js.map +0 -1
  61. package/lib/src/kook-inbound.js +0 -22
  62. package/lib/src/kook-inbound.js.map +0 -1
  63. package/lib/src/kook-msg-route.js +0 -106
  64. package/lib/src/kook-msg-route.js.map +0 -1
  65. package/lib/src/kook-side-events.js +0 -166
  66. package/lib/src/kook-side-events.js.map +0 -1
  67. package/lib/src/outbound-keyboard.js +0 -66
  68. package/lib/src/outbound-keyboard.js.map +0 -1
  69. package/lib/src/outbound-media.js +0 -45
  70. package/lib/src/outbound-media.js.map +0 -1
  71. package/lib/src/outbound-sendable.js +0 -64
  72. package/lib/src/outbound-sendable.js.map +0 -1
  73. package/lib/src/platform-permit.js.map +0 -1
  74. package/lib/src/segment-mapper.js +0 -2
  75. package/lib/src/segment-mapper.js.map +0 -1
  76. package/lib/src/types.js +0 -8
  77. package/lib/src/types.js.map +0 -1
  78. package/plugin.yml +0 -3
  79. package/src/adapter.ts +0 -75
  80. package/src/kook-asset-upload.ts +0 -55
  81. package/src/kook-inbound.ts +0 -22
  82. package/src/kook-msg-route.ts +0 -122
  83. package/src/kook-side-events.ts +0 -230
  84. package/src/outbound-keyboard.ts +0 -77
  85. package/src/outbound-media.ts +0 -60
  86. package/src/outbound-sendable.ts +0 -73
  87. package/src/segment-mapper.ts +0 -1
  88. package/src/types.ts +0 -58
@@ -1 +0,0 @@
1
- {"version":3,"file":"kook-side-events.js","sourceRoot":"","sources":["../../src/kook-side-events.ts"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- /**
2
- * core keyboard 段 → KOOK 卡片消息(action-group + button)
3
- */
4
- import { KeyboardSegment, isKeyboardSegment } from 'zhin.js';
5
- function asKeyboardElement(el) {
6
- if (el instanceof KeyboardSegment) {
7
- return { type: "keyboard", data: el.data };
8
- }
9
- if (isKeyboardSegment(el))
10
- return el;
11
- return null;
12
- }
13
- function textFromElements(elements) {
14
- return elements
15
- .filter((el) => el.type === "text" && typeof el.data.text === "string")
16
- .map((el) => el.data.text)
17
- .join("\n")
18
- .trim();
19
- }
20
- /** core keyboard 布局 → KOOK card[](可直接传给 sendChannelMsg / sendPrivateMsg) */
21
- export function coreKeyboardToKookCard(data, prefixElements = []) {
22
- const modules = [];
23
- const prefixText = textFromElements(prefixElements);
24
- if (prefixText) {
25
- modules.push({
26
- type: "section",
27
- text: { type: "plain-text", content: prefixText },
28
- });
29
- }
30
- for (const row of data.rows ?? []) {
31
- modules.push({
32
- type: "action-group",
33
- elements: row.map((btn) => ({
34
- type: "button",
35
- theme: btn.disabled ? "secondary" : "primary",
36
- value: btn.payload,
37
- click: "return-val",
38
- text: { type: "plain-text", content: btn.label },
39
- })),
40
- });
41
- }
42
- return [{
43
- type: "card",
44
- theme: "secondary",
45
- size: "sm",
46
- modules,
47
- }];
48
- }
49
- export function findKeyboardSegment(elements) {
50
- let keyboard;
51
- const rest = [];
52
- for (const el of elements) {
53
- const kb = asKeyboardElement(el);
54
- if (kb) {
55
- if (keyboard)
56
- return null;
57
- keyboard = kb;
58
- continue;
59
- }
60
- rest.push(el);
61
- }
62
- if (!keyboard)
63
- return null;
64
- return { keyboard, rest };
65
- }
66
- //# sourceMappingURL=outbound-keyboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outbound-keyboard.js","sourceRoot":"","sources":["../../src/outbound-keyboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAiD,MAAM,SAAS,CAAC;AAE5G,SAAS,iBAAiB,CACxB,EAAkB;IAElB,IAAI,EAAE,YAAY,eAAe,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,iBAAiB,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA0B;IAClD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;SACtE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAc,CAAC;SACnC,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB,CACpC,IAAyB,EACzB,iBAAmC,EAAE;IAErC,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE;SAClD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;gBAC7C,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,KAAK,EAAE,YAAY;gBACnB,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;aACjD,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC;YACN,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,IAAI;YACV,OAAO;SACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAA0B;IAE1B,IAAI,QAAsE,CAAC;IAC3E,MAAM,IAAI,GAAqB,EAAE,CAAC;IAElC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC1B,QAAQ,GAAG,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -1,45 +0,0 @@
1
- /**
2
- * KOOK 出站 media:base64 / 本地文件须先走 /v3/asset/create 上传,再嵌入 KMarkdown。
3
- */
4
- import { asMessageElements, extractBase64Buffer, isMediaSegmentType, isRemoteUrl, resolveLocalMediaPath } from 'zhin.js';
5
- function isMessageSegment(seg) {
6
- return typeof seg.type === "string";
7
- }
8
- function withUploadedUrl(seg, uploadedUrl) {
9
- const data = { ...seg.data };
10
- data.url = uploadedUrl;
11
- data.file = uploadedUrl;
12
- delete data.base64;
13
- return { type: seg.type, data };
14
- }
15
- async function resolveMediaSegment(uploader, seg) {
16
- if (!isMediaSegmentType(seg.type))
17
- return seg;
18
- const data = seg.data;
19
- const url = typeof data.url === "string" ? data.url : undefined;
20
- const file = typeof data.file === "string" ? data.file : undefined;
21
- if ((url && isRemoteUrl(url)) || (file && isRemoteUrl(file))) {
22
- return seg;
23
- }
24
- const buffer = extractBase64Buffer(data);
25
- if (buffer) {
26
- const uploaded = await uploader.uploadMedia(buffer);
27
- return withUploadedUrl(seg, uploaded);
28
- }
29
- const local = resolveLocalMediaPath(data);
30
- if (local) {
31
- const uploaded = await uploader.uploadMedia(local);
32
- return withUploadedUrl(seg, uploaded);
33
- }
34
- return seg;
35
- }
36
- /** 将 base64 / 本地媒体上传为 KOOK 可访问 URL */
37
- export async function materializeOutboundMedia(uploader, content) {
38
- const segments = asMessageElements(content);
39
- return Promise.all(segments.map(async (item) => {
40
- if (!isMessageSegment(item))
41
- return item;
42
- return resolveMediaSegment(uploader, item);
43
- }));
44
- }
45
- //# sourceMappingURL=outbound-media.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outbound-media.js","sourceRoot":"","sources":["../../src/outbound-media.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,WAAW,EAAE,qBAAqB,EAA8D,MAAM,SAAS,CAAC;AAMrL,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,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.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.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/src/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
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAOA,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,75 +0,0 @@
1
- /**
2
- * KOOK 适配器
3
- */
4
- import { formatCompact, Adapter, Plugin, type OutboundRichSegmentPolicy } from 'zhin.js';
5
- import { KookEndpoint } from "./endpoint.js";
6
- import type { KookEndpointConfig } from "./types.js";
7
-
8
- export class KookAdapter extends Adapter<KookEndpoint> {
9
- static override readonly capabilities = ['inbound', 'outbound'] as const;
10
- static override outboundRichSegmentPolicy: OutboundRichSegmentPolicy = {
11
- qrcode: 'image',
12
- html: 'image',
13
- markdown: 'origin',
14
- };
15
- static override interactivePolicy = 'native' as const;
16
-
17
- constructor(plugin: Plugin) {
18
- super(plugin, "kook", []);
19
- }
20
-
21
- createEndpoint(config: KookEndpointConfig): KookEndpoint {
22
- return new KookEndpoint(this, config);
23
- }
24
-
25
- // ── ISceneManagement 标准群管方法 ──────────────────────────────────
26
-
27
- async removeMember(endpointId: string, sceneId: string, userId: string) {
28
- const endpoint = this.endpoints.get(endpointId);
29
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
30
- return endpoint.kickUser(sceneId, userId);
31
- }
32
-
33
- async banMember(endpointId: string, sceneId: string, userId: string, reason?: string) {
34
- const endpoint = this.endpoints.get(endpointId);
35
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
36
- return endpoint.addToBlacklist(sceneId, userId, reason);
37
- }
38
-
39
- async unbanMember(endpointId: string, sceneId: string, userId: string) {
40
- const endpoint = this.endpoints.get(endpointId);
41
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
42
- return endpoint.removeFromBlacklist(sceneId, userId);
43
- }
44
-
45
- async setMemberNickname(endpointId: string, sceneId: string, userId: string, nickname: string) {
46
- const endpoint = this.endpoints.get(endpointId);
47
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
48
- return endpoint.setNickname(sceneId, userId, nickname);
49
- }
50
-
51
- async listMembers(endpointId: string, sceneId: string) {
52
- const endpoint = this.endpoints.get(endpointId);
53
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
54
- const members = await endpoint.getGuildMembers(sceneId);
55
- return {
56
- members: members.map(m => ({
57
- id: m.id, username: m.username,
58
- nickname: m.nickname, roles: m.roles,
59
- })),
60
- count: members.length,
61
- };
62
- }
63
-
64
- // ── 生命周期 ───────────────────────────────────────────────────────
65
-
66
- async start(): Promise<void> {
67
- await super.start();
68
- }
69
-
70
- async stop(): Promise<void> {
71
- await super.stop();
72
- this.plugin.logger.debug(formatCompact( { op: "stop" }));
73
- }
74
- }
75
-
@@ -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
- }