@sfmc-bds/qq-bridge 0.2.0-beta.8 → 0.2.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.
Files changed (70) hide show
  1. package/README.md +69 -2
  2. package/deploy/install-nginx-webhook.sh +34 -0
  3. package/deploy/nginx-webhook-location.conf +10 -0
  4. package/deploy/qq-bridge.service +23 -0
  5. package/deploy/qq-config-sync.ps1 +106 -0
  6. package/deploy/qq-tunnel.ps1 +15 -0
  7. package/deploy/sync-qq-config.mjs +229 -0
  8. package/dist/commands/account-format.js +41 -0
  9. package/dist/commands/account-format.js.map +7 -0
  10. package/dist/commands/content-format.js +114 -0
  11. package/dist/commands/content-format.js.map +7 -0
  12. package/dist/commands/db-api.js +21 -6
  13. package/dist/commands/db-api.js.map +2 -2
  14. package/dist/commands/handlers.js +392 -524
  15. package/dist/commands/handlers.js.map +2 -2
  16. package/dist/commands/index.js +5 -5
  17. package/dist/commands/index.js.map +3 -3
  18. package/dist/commands/interaction-router.js +38 -133
  19. package/dist/commands/interaction-router.js.map +2 -2
  20. package/dist/commands/join-settings-ui.js +1 -24
  21. package/dist/commands/join-settings-ui.js.map +2 -2
  22. package/dist/commands/menu-format.js +36 -33
  23. package/dist/commands/menu-format.js.map +2 -2
  24. package/dist/commands/menu-panel-sync.js +39 -13
  25. package/dist/commands/menu-panel-sync.js.map +2 -2
  26. package/dist/commands/message-text.js +91 -0
  27. package/dist/commands/message-text.js.map +7 -0
  28. package/dist/commands/pending.js +23 -16
  29. package/dist/commands/pending.js.map +2 -2
  30. package/dist/commands/permissions.js +17 -0
  31. package/dist/commands/permissions.js.map +7 -0
  32. package/dist/commands/registry.js +1 -1
  33. package/dist/commands/registry.js.map +2 -2
  34. package/dist/commands/render.js +7 -16
  35. package/dist/commands/render.js.map +2 -2
  36. package/dist/commands/reply-llbot.js +18 -7
  37. package/dist/commands/reply-llbot.js.map +2 -2
  38. package/dist/commands/reply-official.js +55 -39
  39. package/dist/commands/reply-official.js.map +3 -3
  40. package/dist/commands/router.js +116 -23
  41. package/dist/commands/router.js.map +2 -2
  42. package/dist/config.js +35 -27
  43. package/dist/config.js.map +2 -2
  44. package/dist/console.js +3 -3
  45. package/dist/console.js.map +2 -2
  46. package/dist/index.js +30 -16
  47. package/dist/index.js.map +2 -2
  48. package/dist/llbot-ws-api.js +2 -2
  49. package/dist/llbot-ws-api.js.map +2 -2
  50. package/dist/official/events.js +32 -7
  51. package/dist/official/events.js.map +2 -2
  52. package/dist/official/gateway.js +10 -1
  53. package/dist/official/gateway.js.map +2 -2
  54. package/dist/official/webhook.js +165 -0
  55. package/dist/official/webhook.js.map +7 -0
  56. package/dist/onebot.js +0 -4
  57. package/dist/onebot.js.map +2 -2
  58. package/package.json +4 -4
  59. package/dist/commands/join-settings-ui.test.js +0 -43
  60. package/dist/commands/join-settings-ui.test.js.map +0 -7
  61. package/dist/commands/menu-panel-sync.test.js +0 -27
  62. package/dist/commands/menu-panel-sync.test.js.map +0 -7
  63. package/dist/commands/render.test.js +0 -44
  64. package/dist/commands/render.test.js.map +0 -7
  65. package/dist/commands/router.test.js +0 -92
  66. package/dist/commands/router.test.js.map +0 -7
  67. package/dist/llbot-ws-api.test.js +0 -32
  68. package/dist/llbot-ws-api.test.js.map +0 -7
  69. package/dist/official/events.test.js +0 -123
  70. package/dist/official/events.test.js.map +0 -7
@@ -1,123 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
- import {
4
- OfficialAtMessageDispatcher,
5
- attachmentsPlaceholder,
6
- extractOfficialText
7
- } from "./events.js";
8
- test("extractOfficialText \u53BB @ \u5E76\u62FC\u9644\u4EF6\u5360\u4F4D", () => {
9
- assert.equal(
10
- extractOfficialText({
11
- content: "<@!botid> hello",
12
- attachments: [{ content_type: "image/png" }]
13
- }),
14
- "hello [\u56FE\u7247]"
15
- );
16
- });
17
- test("attachmentsPlaceholder \u6309\u7C7B\u578B\u5206\u7C7B", () => {
18
- assert.equal(
19
- attachmentsPlaceholder([
20
- { content_type: "image/jpeg" },
21
- { content_type: "video/mp4" },
22
- { filename: "a.mp3" },
23
- { filename: "doc.pdf" }
24
- ]),
25
- "[\u56FE\u7247][\u89C6\u9891][\u8BED\u97F3][\u6587\u4EF6]"
26
- );
27
- });
28
- test("OfficialAtMessageDispatcher \u8FC7\u6EE4\u4E0E\u8F6C\u53D1\u8F7D\u8377", async () => {
29
- const forwarded = [];
30
- const forward = async (_db, fromId, fromName, content) => {
31
- forwarded.push({ fromId, fromName, content });
32
- };
33
- const db = { host: "127.0.0.1", port: 3001, channelId: "bridge" };
34
- const missingOpenid = new OfficialAtMessageDispatcher({
35
- groupOpenid: "",
36
- db,
37
- forward
38
- });
39
- await missingOpenid.handleGroupAtMessage({
40
- id: "1",
41
- group_openid: "G1",
42
- content: "hi",
43
- author: { member_openid: "M1", username: "U", bot: false }
44
- });
45
- assert.equal(forwarded.length, 0);
46
- const d = new OfficialAtMessageDispatcher({
47
- groupOpenid: "G1",
48
- db,
49
- forward
50
- });
51
- await d.handleGroupAtMessage({
52
- id: "2",
53
- group_openid: "G1",
54
- content: "bot echo",
55
- author: { member_openid: "BOT", bot: true }
56
- });
57
- assert.equal(forwarded.length, 0);
58
- await d.handleGroupAtMessage({
59
- id: "3",
60
- group_openid: "OTHER",
61
- content: "wrong",
62
- author: { member_openid: "M2", username: "Bob", bot: false }
63
- });
64
- assert.equal(forwarded.length, 0);
65
- await d.handleGroupAtMessage({
66
- id: "4",
67
- group_openid: "G1",
68
- content: "<@!x> hello world",
69
- author: { member_openid: "M3", username: "Alice", bot: false }
70
- });
71
- assert.equal(forwarded.length, 1);
72
- assert.deepEqual(forwarded[0], {
73
- fromId: "qq_M3",
74
- fromName: "Alice",
75
- content: "hello world"
76
- });
77
- await d.handleGroupAtMessage({
78
- id: "4",
79
- group_openid: "G1",
80
- content: "dup",
81
- author: { member_openid: "M3", username: "Alice", bot: false }
82
- });
83
- assert.equal(forwarded.length, 1);
84
- });
85
- test("OfficialAtMessageDispatcher \u6307\u4EE4\u547D\u4E2D\u4E0D\u8F6C\u53D1", async () => {
86
- const forwarded = [];
87
- const handled = [];
88
- const forward = async (_db, _a, _b, content) => {
89
- forwarded.push(content);
90
- };
91
- const commandRouter = {
92
- async handle(inbound) {
93
- if (inbound.text === "ping" || inbound.text === "/ping") {
94
- handled.push(inbound.text);
95
- return true;
96
- }
97
- return false;
98
- }
99
- };
100
- const d = new OfficialAtMessageDispatcher({
101
- groupOpenid: "G1",
102
- db: { host: "127.0.0.1", port: 3001, channelId: "bridge" },
103
- forward,
104
- commandRouter
105
- });
106
- await d.handleGroupAtMessage({
107
- id: "c1",
108
- group_openid: "G1",
109
- content: "<@!x> /ping",
110
- author: { member_openid: "M9", username: "Op", bot: false }
111
- });
112
- assert.deepEqual(handled, ["/ping"]);
113
- assert.equal(forwarded.length, 0);
114
- await d.handleGroupAtMessage({
115
- id: "c2",
116
- group_openid: "G1",
117
- content: "<@!x> chat",
118
- author: { member_openid: "M9", username: "Op", bot: false }
119
- });
120
- assert.equal(forwarded.length, 1);
121
- assert.equal(forwarded[0], "chat");
122
- });
123
- //# sourceMappingURL=events.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/official/events.test.ts"],
4
- "sourcesContent": ["import assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport {\n OfficialAtMessageDispatcher,\n attachmentsPlaceholder,\n extractOfficialText,\n} from \"./events.js\";\n\ntest(\"extractOfficialText \u53BB @ \u5E76\u62FC\u9644\u4EF6\u5360\u4F4D\", () => {\n assert.equal(\n extractOfficialText({\n content: \"<@!botid> hello\",\n attachments: [{ content_type: \"image/png\" }],\n }),\n \"hello [\u56FE\u7247]\"\n );\n});\n\ntest(\"attachmentsPlaceholder \u6309\u7C7B\u578B\u5206\u7C7B\", () => {\n assert.equal(\n attachmentsPlaceholder([\n { content_type: \"image/jpeg\" },\n { content_type: \"video/mp4\" },\n { filename: \"a.mp3\" },\n { filename: \"doc.pdf\" },\n ]),\n \"[\u56FE\u7247][\u89C6\u9891][\u8BED\u97F3][\u6587\u4EF6]\"\n );\n});\n\ntest(\"OfficialAtMessageDispatcher \u8FC7\u6EE4\u4E0E\u8F6C\u53D1\u8F7D\u8377\", async () => {\n const forwarded: Array<{ fromId: string; fromName: string; content: string }> = [];\n const forward = async (\n _db: unknown,\n fromId: string,\n fromName: string,\n content: string\n ): Promise<void> => {\n forwarded.push({ fromId, fromName, content });\n };\n\n const db = { host: \"127.0.0.1\", port: 3001, channelId: \"bridge\" };\n\n const missingOpenid = new OfficialAtMessageDispatcher({\n groupOpenid: \"\",\n db,\n forward,\n });\n await missingOpenid.handleGroupAtMessage({\n id: \"1\",\n group_openid: \"G1\",\n content: \"hi\",\n author: { member_openid: \"M1\", username: \"U\", bot: false },\n });\n assert.equal(forwarded.length, 0);\n\n const d = new OfficialAtMessageDispatcher({\n groupOpenid: \"G1\",\n db,\n forward,\n });\n\n await d.handleGroupAtMessage({\n id: \"2\",\n group_openid: \"G1\",\n content: \"bot echo\",\n author: { member_openid: \"BOT\", bot: true },\n });\n assert.equal(forwarded.length, 0);\n\n await d.handleGroupAtMessage({\n id: \"3\",\n group_openid: \"OTHER\",\n content: \"wrong\",\n author: { member_openid: \"M2\", username: \"Bob\", bot: false },\n });\n assert.equal(forwarded.length, 0);\n\n await d.handleGroupAtMessage({\n id: \"4\",\n group_openid: \"G1\",\n content: \"<@!x> hello world\",\n author: { member_openid: \"M3\", username: \"Alice\", bot: false },\n });\n assert.equal(forwarded.length, 1);\n assert.deepEqual(forwarded[0], {\n fromId: \"qq_M3\",\n fromName: \"Alice\",\n content: \"hello world\",\n });\n\n // \u53BB\u91CD\n await d.handleGroupAtMessage({\n id: \"4\",\n group_openid: \"G1\",\n content: \"dup\",\n author: { member_openid: \"M3\", username: \"Alice\", bot: false },\n });\n assert.equal(forwarded.length, 1);\n});\n\ntest(\"OfficialAtMessageDispatcher \u6307\u4EE4\u547D\u4E2D\u4E0D\u8F6C\u53D1\", async () => {\n const forwarded: string[] = [];\n const handled: string[] = [];\n const forward = async (_db: unknown, _a: string, _b: string, content: string): Promise<void> => {\n forwarded.push(content);\n };\n const commandRouter = {\n async handle(inbound: { text: string }): Promise<boolean> {\n if (inbound.text === \"ping\" || inbound.text === \"/ping\") {\n handled.push(inbound.text);\n return true;\n }\n return false;\n },\n };\n\n const d = new OfficialAtMessageDispatcher({\n groupOpenid: \"G1\",\n db: { host: \"127.0.0.1\", port: 3001, channelId: \"bridge\" },\n forward,\n commandRouter: commandRouter as never,\n });\n\n await d.handleGroupAtMessage({\n id: \"c1\",\n group_openid: \"G1\",\n content: \"<@!x> /ping\",\n author: { member_openid: \"M9\", username: \"Op\", bot: false },\n });\n assert.deepEqual(handled, [\"/ping\"]);\n assert.equal(forwarded.length, 0);\n\n await d.handleGroupAtMessage({\n id: \"c2\",\n group_openid: \"G1\",\n content: \"<@!x> chat\",\n author: { member_openid: \"M9\", username: \"Op\", bot: false },\n });\n assert.equal(forwarded.length, 1);\n assert.equal(forwarded[0], \"chat\");\n});\n\n"],
5
- "mappings": "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",
6
- "names": []
7
- }