@zhin.js/adapter-satori 1.0.0 → 1.1.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/CHANGELOG.md +828 -0
  2. package/README.md +60 -38
  3. package/adapters/satori.js +38 -0
  4. package/adapters/satori.ts +49 -0
  5. package/commands/endpoint/add/[id].js +3 -0
  6. package/commands/endpoint/add/[id].ts +3 -0
  7. package/commands/endpoint/list.js +3 -0
  8. package/commands/endpoint/list.ts +3 -0
  9. package/commands/endpoint/remove/[id].js +3 -0
  10. package/commands/endpoint/remove/[id].ts +3 -0
  11. package/lib/client.d.ts +18 -0
  12. package/lib/client.js +21 -0
  13. package/lib/endpoint.d.ts +56 -0
  14. package/lib/endpoint.js +472 -0
  15. package/lib/index.d.ts +8 -18
  16. package/lib/index.js +6 -25
  17. package/lib/protocol.d.ts +158 -0
  18. package/lib/protocol.js +242 -0
  19. package/lib/satori-endpoint-commands.d.ts +1 -0
  20. package/lib/satori-endpoint-commands.js +18 -0
  21. package/lib/satori-runtime-state.d.ts +1 -0
  22. package/lib/satori-runtime-state.js +6 -0
  23. package/lib/webhook.d.ts +12 -0
  24. package/lib/webhook.js +60 -0
  25. package/lib/ws.d.ts +13 -0
  26. package/lib/ws.js +5 -0
  27. package/package.json +64 -17
  28. package/plugin.js +14 -0
  29. package/schema.json +95 -0
  30. package/src/client.ts +57 -0
  31. package/src/endpoint.ts +580 -0
  32. package/src/index.ts +61 -35
  33. package/src/protocol.ts +370 -0
  34. package/src/satori-endpoint-commands.ts +19 -0
  35. package/src/satori-runtime-state.ts +7 -0
  36. package/src/webhook.ts +79 -0
  37. package/src/ws.ts +22 -0
  38. package/lib/adapter.d.ts +0 -16
  39. package/lib/adapter.d.ts.map +0 -1
  40. package/lib/adapter.js +0 -34
  41. package/lib/adapter.js.map +0 -1
  42. package/lib/api.d.ts +0 -15
  43. package/lib/api.d.ts.map +0 -1
  44. package/lib/api.js +0 -37
  45. package/lib/api.js.map +0 -1
  46. package/lib/bot-webhook.d.ts +0 -27
  47. package/lib/bot-webhook.d.ts.map +0 -1
  48. package/lib/bot-webhook.js +0 -99
  49. package/lib/bot-webhook.js.map +0 -1
  50. package/lib/bot-ws.d.ts +0 -30
  51. package/lib/bot-ws.d.ts.map +0 -1
  52. package/lib/bot-ws.js +0 -195
  53. package/lib/bot-ws.js.map +0 -1
  54. package/lib/index.d.ts.map +0 -1
  55. package/lib/index.js.map +0 -1
  56. package/lib/types.d.ts +0 -91
  57. package/lib/types.d.ts.map +0 -1
  58. package/lib/types.js +0 -13
  59. package/lib/types.js.map +0 -1
  60. package/lib/utils.d.ts +0 -40
  61. package/lib/utils.d.ts.map +0 -1
  62. package/lib/utils.js +0 -33
  63. package/lib/utils.js.map +0 -1
  64. package/src/adapter.ts +0 -46
  65. package/src/api.ts +0 -48
  66. package/src/bot-webhook.ts +0 -117
  67. package/src/bot-ws.ts +0 -214
  68. package/src/types.ts +0 -91
  69. package/src/utils.ts +0 -64
  70. /package/{skills/satori/SKILL.md → agent/skills/satori.md} +0 -0
@@ -1,99 +0,0 @@
1
- /**
2
- * Satori WebHook Bot:应用提供 POST path,SDK 推送 EVENT(Satori-Opcode: 0)
3
- */
4
- import { EventEmitter } from 'events';
5
- import { formatCompact, Message, segment } from 'zhin.js';
6
- import { registerFetchRoute } from '@zhin.js/host-router/router';
7
- import { callSatoriApi } from './api.js';
8
- import { SatoriOpcode } from './types.js';
9
- import { formatSatoriMessagePayload, isMessageEvent } from './utils.js';
10
- export class SatoriWebhookBot extends EventEmitter {
11
- adapter;
12
- router;
13
- $config;
14
- $connected = true;
15
- /** 从首个事件的 login 得到,用于 API 的 platform / userId */
16
- login;
17
- get logger() {
18
- return this.adapter.plugin.logger;
19
- }
20
- constructor(adapter, router, $config) {
21
- super();
22
- this.adapter = adapter;
23
- this.router = router;
24
- this.$config = $config;
25
- }
26
- get $id() {
27
- return this.$config.name;
28
- }
29
- apiOptions() {
30
- const platform = this.login?.platform ?? '';
31
- const userId = this.login?.user?.id ?? '';
32
- return { baseUrl: this.$config.baseUrl, platform, userId, token: this.$config.token };
33
- }
34
- async $connect() {
35
- const path = this.$config.path.startsWith('/') ? this.$config.path : `/${this.$config.path}`;
36
- registerFetchRoute(this.router, 'POST', path, async (ctx) => {
37
- const opcode = parseInt(ctx.get('satori-opcode') ?? '', 10);
38
- const body = ctx.request.body;
39
- if (opcode === SatoriOpcode.EVENT && body) {
40
- if (body.login && !this.login)
41
- this.login = body.login;
42
- this.handleEvent(body);
43
- }
44
- ctx.status = 200;
45
- ctx.body = {};
46
- });
47
- this.logger.info(formatCompact({ op: 'webhook', path }));
48
- }
49
- async $disconnect() {
50
- this.$connected = false;
51
- }
52
- handleEvent(body) {
53
- if (isMessageEvent(body)) {
54
- const message = this.$formatMessage(body);
55
- this.adapter.emit('message.receive', message);
56
- this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
57
- }
58
- }
59
- $formatMessage(body) {
60
- if (!isMessageEvent(body)) {
61
- return Message.from(body, {
62
- $id: '',
63
- $adapter: 'satori',
64
- $bot: this.$config.name,
65
- $channel: { id: '', type: 'private' },
66
- $sender: { id: '', name: '' },
67
- $content: [],
68
- $raw: '',
69
- $timestamp: body.timestamp ?? 0,
70
- $recall: async () => { },
71
- $reply: async () => '',
72
- });
73
- }
74
- const payload = formatSatoriMessagePayload(body, 'satori', this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
75
- ...channel,
76
- context: 'satori',
77
- bot: this.$config.name,
78
- content: content,
79
- }));
80
- return Message.from(body, payload);
81
- }
82
- async $sendMessage(options) {
83
- const channelId = options.id;
84
- const contentRaw = segment.raw(options.content);
85
- const result = await callSatoriApi(this.apiOptions(), 'message', 'create', {
86
- channel_id: channelId,
87
- content: contentRaw,
88
- });
89
- const list = Array.isArray(result) ? result : result?.data;
90
- const msg = list?.[0];
91
- const msgId = msg?.id ?? '';
92
- return msgId ? `${channelId}:${msgId}` : '';
93
- }
94
- async $recallMessage(id) {
95
- const [channelId, messageId] = id.includes(':') ? id.split(':') : ['', id];
96
- await callSatoriApi(this.apiOptions(), 'message', 'delete', { channel_id: channelId, message_id: messageId });
97
- }
98
- }
99
- //# sourceMappingURL=bot-webhook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot-webhook.js","sourceRoot":"","sources":["../src/bot-webhook.ts"],"names":[],"mappings":"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"}
package/lib/bot-ws.d.ts DELETED
@@ -1,30 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { Bot, Message, SendOptions } from 'zhin.js';
3
- import type { SatoriWsConfig, SatoriEventBody } from './types.js';
4
- import type { SatoriAdapter } from './adapter.js';
5
- export declare class SatoriWsClient extends EventEmitter implements Bot<SatoriWsConfig, SatoriEventBody> {
6
- adapter: SatoriAdapter;
7
- $config: SatoriWsConfig;
8
- $connected: boolean;
9
- private ws?;
10
- private reconnectTimer?;
11
- private heartbeatTimer?;
12
- /** READY 后得到的当前登录,用于 API 的 platform / userId */
13
- private login?;
14
- private lastSn?;
15
- get logger(): import("zhin.js").Logger;
16
- constructor(adapter: SatoriAdapter, $config: SatoriWsConfig);
17
- get $id(): string;
18
- private get wsUrl();
19
- private apiOptions;
20
- private sendSignal;
21
- private startHeartbeat;
22
- private scheduleReconnect;
23
- $connect(): Promise<void>;
24
- $disconnect(): Promise<void>;
25
- private handleEvent;
26
- $formatMessage(body: SatoriEventBody): Message<SatoriEventBody>;
27
- $sendMessage(options: SendOptions): Promise<string>;
28
- $recallMessage(id: string): Promise<void>;
29
- }
30
- //# sourceMappingURL=bot-ws.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot-ws.d.ts","sourceRoot":"","sources":["../src/bot-ws.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAiB,GAAG,EAAE,OAAO,EAAW,WAAW,EAAE,MAAM,SAAS,CAAC;AAE5E,OAAO,KAAK,EAAE,cAAc,EAAgB,eAAe,EAAe,MAAM,YAAY,CAAC;AAE7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,qBAAa,cAAe,SAAQ,YAAa,YAAW,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC;IAa3E,OAAO,EAAE,aAAa;IAAS,OAAO,EAAE,cAAc;IAZzE,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,gDAAgD;IAChD,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB,IAAI,MAAM,6BAET;gBAEkB,OAAO,EAAE,aAAa,EAAS,OAAO,EAAE,cAAc;IAKzE,IAAI,GAAG,WAEN;IAED,OAAO,KAAK,KAAK,GAOhB;IAED,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IAcnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8DzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBlC,OAAO,CAAC,WAAW;IAUnB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IA+BzD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhD"}
package/lib/bot-ws.js DELETED
@@ -1,195 +0,0 @@
1
- /**
2
- * Satori WebSocket Bot:应用连 SDK /v1/events,IDENTIFY 认证,收 EVENT 转 Message
3
- */
4
- import WebSocket from 'ws';
5
- import { EventEmitter } from 'events';
6
- import { clearInterval } from 'node:timers';
7
- import { formatCompact, Message, segment } from 'zhin.js';
8
- import { callSatoriApi } from './api.js';
9
- import { SatoriOpcode } from './types.js';
10
- import { formatSatoriMessagePayload, isMessageEvent } from './utils.js';
11
- export class SatoriWsClient extends EventEmitter {
12
- adapter;
13
- $config;
14
- $connected;
15
- ws;
16
- reconnectTimer;
17
- heartbeatTimer;
18
- /** READY 后得到的当前登录,用于 API 的 platform / userId */
19
- login;
20
- lastSn;
21
- get logger() {
22
- return this.adapter.plugin.logger;
23
- }
24
- constructor(adapter, $config) {
25
- super();
26
- this.adapter = adapter;
27
- this.$config = $config;
28
- this.$connected = false;
29
- }
30
- get $id() {
31
- return this.$config.name;
32
- }
33
- get wsUrl() {
34
- const base = this.$config.baseUrl.replace(/\/$/, '');
35
- const url = new URL(base);
36
- if (this.$config.token) {
37
- url.searchParams.set('access_token', this.$config.token);
38
- }
39
- return url.toString();
40
- }
41
- apiOptions() {
42
- const platform = this.login?.platform ?? '';
43
- const userId = this.login?.user?.id ?? '';
44
- return { baseUrl: this.$config.baseUrl, platform, userId, token: this.$config.token };
45
- }
46
- sendSignal(op, body) {
47
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
48
- return;
49
- this.ws.send(JSON.stringify({ op, body: body ?? {} }));
50
- }
51
- startHeartbeat() {
52
- const interval = this.$config.heartbeat_interval ?? 10000;
53
- this.heartbeatTimer = setInterval(() => {
54
- this.sendSignal(SatoriOpcode.PING);
55
- }, interval);
56
- }
57
- scheduleReconnect() {
58
- if (this.reconnectTimer)
59
- return;
60
- const delay = 5000;
61
- this.reconnectTimer = setTimeout(() => {
62
- this.reconnectTimer = undefined;
63
- this.$connect().catch((err) => this.logger.warn(formatCompact({
64
- op: 'reconnect',
65
- bot: this.$id,
66
- ok: false,
67
- error: err instanceof Error ? err.message : String(err),
68
- })));
69
- }, delay);
70
- }
71
- async $connect() {
72
- return new Promise((resolve, reject) => {
73
- const headers = {};
74
- if (this.$config.token)
75
- headers['Authorization'] = `Bearer ${this.$config.token}`;
76
- this.ws = new WebSocket(this.wsUrl, { headers });
77
- this.ws.on('open', () => {
78
- this.$connected = true;
79
- this.logger.info(formatCompact({ bot: this.$id, mode: 'ws' }));
80
- this.sendSignal(SatoriOpcode.IDENTIFY, {
81
- token: this.$config.token,
82
- sn: this.lastSn,
83
- });
84
- this.startHeartbeat();
85
- resolve();
86
- });
87
- this.ws.on('message', (data) => {
88
- try {
89
- const signal = JSON.parse(data.toString());
90
- if (signal.op === SatoriOpcode.READY && signal.body?.logins) {
91
- const logins = signal.body.logins;
92
- this.login = logins[0];
93
- if (!this.login?.platform || !this.login?.user?.id) {
94
- this.logger.warn(formatCompact({ op: 'ready', ok: false, error: 'missing platform/user' }));
95
- }
96
- }
97
- else if (signal.op === SatoriOpcode.EVENT && signal.body) {
98
- if (signal.body.sn != null)
99
- this.lastSn = signal.body.sn;
100
- this.handleEvent(signal.body);
101
- }
102
- }
103
- catch (error) {
104
- this.emit('error', error);
105
- }
106
- });
107
- this.ws.on('close', (code, reason) => {
108
- this.$connected = false;
109
- const reasonStr = reason?.toString?.() || String(reason);
110
- const codeHint = code === 1005 ? ' [无状态,多为服务端/代理未发 close 帧即断开]' : code === 1006 ? ' [异常关闭]' : '';
111
- this.logger.warn(formatCompact({
112
- op: 'disconnect',
113
- bot: this.$config.name,
114
- code,
115
- error: `${reasonStr || 'closed'}${codeHint}`,
116
- reconnect_ms: 5000,
117
- }));
118
- reject(new Error(`Satori WS closed: ${code} ${reasonStr}`));
119
- this.scheduleReconnect();
120
- });
121
- this.ws.on('error', (error) => {
122
- this.logger.warn(formatCompact({
123
- op: 'ws_error',
124
- bot: this.$config.name,
125
- ok: false,
126
- error: error instanceof Error ? error.message : String(error),
127
- }));
128
- reject(error);
129
- });
130
- });
131
- }
132
- async $disconnect() {
133
- if (this.reconnectTimer) {
134
- clearTimeout(this.reconnectTimer);
135
- this.reconnectTimer = undefined;
136
- }
137
- if (this.heartbeatTimer) {
138
- clearInterval(this.heartbeatTimer);
139
- this.heartbeatTimer = undefined;
140
- }
141
- if (this.ws) {
142
- this.ws.close();
143
- this.ws = undefined;
144
- }
145
- this.$connected = false;
146
- }
147
- handleEvent(body) {
148
- if (isMessageEvent(body)) {
149
- const message = this.$formatMessage(body);
150
- this.adapter.emit('message.receive', message);
151
- this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
152
- }
153
- }
154
- $formatMessage(body) {
155
- if (!isMessageEvent(body)) {
156
- return Message.from(body, {
157
- $id: '',
158
- $adapter: 'satori',
159
- $bot: this.$config.name,
160
- $channel: { id: '', type: 'private' },
161
- $sender: { id: '', name: '' },
162
- $content: [],
163
- $raw: '',
164
- $timestamp: body.timestamp ?? 0,
165
- $recall: async () => { },
166
- $reply: async () => '',
167
- });
168
- }
169
- const payload = formatSatoriMessagePayload(body, 'satori', this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
170
- ...channel,
171
- context: 'satori',
172
- bot: this.$config.name,
173
- content: content,
174
- }));
175
- return Message.from(body, payload);
176
- }
177
- async $sendMessage(options) {
178
- const channelId = options.id;
179
- const contentRaw = segment.raw(options.content);
180
- const result = await callSatoriApi(this.apiOptions(), 'message', 'create', {
181
- channel_id: channelId,
182
- content: contentRaw,
183
- });
184
- const list = Array.isArray(result) ? result : result?.data;
185
- const msg = list?.[0];
186
- const msgId = msg?.id ?? '';
187
- this.logger.debug(`${this.$config.name} send ${options.type}(${channelId}):${contentRaw}`);
188
- return msgId ? `${channelId}:${msgId}` : '';
189
- }
190
- async $recallMessage(id) {
191
- const [channelId, messageId] = id.includes(':') ? id.split(':') : ['', id];
192
- await callSatoriApi(this.apiOptions(), 'message', 'delete', { channel_id: channelId, message_id: messageId });
193
- }
194
- }
195
- //# sourceMappingURL=bot-ws.js.map
package/lib/bot-ws.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot-ws.js","sourceRoot":"","sources":["../src/bot-ws.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,MAAM,EAAE,OAAO,sBAAsB,EAAE,MAAM,CAAC;SAC/C;KACF;IACD,UAAU,QAAQ;QAChB,MAAM,EAAE,aAAa,CAAC;KACvB;CACF"}
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAA6B,MAAM,SAAS,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAkB,MAAM,cAAc,CAAC;AAa7D,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;AAChC,OAAO,CAAC;IACN,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;QACxC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;CAC8B,CAAC,CAAC"}
package/lib/types.d.ts DELETED
@@ -1,91 +0,0 @@
1
- /**
2
- * Satori 适配器类型(参考 https://satori.chat 协议)
3
- */
4
- /** 配置公共字段;单一适配器 context 均为 'satori',连接方式由 connection 区分 */
5
- export interface SatoriConfigBase {
6
- context: 'satori';
7
- name: string;
8
- baseUrl: string;
9
- /** 认证 token,API 用 Authorization: Bearer,WebSocket IDENTIFY 用 token 字段 */
10
- token?: string;
11
- }
12
- /** WebSocket 连接(应用连 SDK /v1/events) */
13
- export interface SatoriWsConfig extends SatoriConfigBase {
14
- connection: 'ws';
15
- /** 心跳间隔(毫秒),默认 10000 */
16
- heartbeat_interval?: number;
17
- }
18
- /** WebHook(SDK POST 到应用提供的 path) */
19
- export interface SatoriWebhookConfig extends SatoriConfigBase {
20
- connection: 'webhook';
21
- path: string;
22
- }
23
- export type SatoriBotConfig = SatoriWsConfig | SatoriWebhookConfig;
24
- /** WebSocket/API 信号:op + body */
25
- export interface SatoriSignal {
26
- op: number;
27
- body?: Record<string, unknown>;
28
- }
29
- /** Opcode:EVENT=0, PING=1, PONG=2, IDENTIFY=3, READY=4, META=5 */
30
- export declare const SatoriOpcode: {
31
- readonly EVENT: 0;
32
- readonly PING: 1;
33
- readonly PONG: 2;
34
- readonly IDENTIFY: 3;
35
- readonly READY: 4;
36
- readonly META: 5;
37
- };
38
- /** 事件体(EVENT 的 body):type、sn、timestamp、login、message、channel、user 等 */
39
- export interface SatoriEventBody {
40
- type?: string;
41
- sn?: number;
42
- timestamp?: number;
43
- login?: SatoriLogin;
44
- message?: SatoriMessage;
45
- channel?: SatoriChannel;
46
- user?: SatoriUser;
47
- guild?: {
48
- id: string;
49
- name?: string;
50
- };
51
- member?: {
52
- user?: SatoriUser;
53
- nick?: string;
54
- roles?: string[];
55
- };
56
- [key: string]: unknown;
57
- }
58
- /** Login 资源(READY 与事件中) */
59
- export interface SatoriLogin {
60
- platform?: string;
61
- user?: SatoriUser;
62
- status?: number;
63
- sn?: number;
64
- }
65
- /** Channel 资源:id, type (0=TEXT,1=DIRECT,2=CATEGORY,3=VOICE) */
66
- export interface SatoriChannel {
67
- id: string;
68
- type?: number;
69
- name?: string;
70
- parent_id?: string;
71
- }
72
- /** User 资源 */
73
- export interface SatoriUser {
74
- id: string;
75
- name?: string;
76
- avatar?: string;
77
- }
78
- /** Message 资源:id, content(元素字符串), channel, user 等 */
79
- export interface SatoriMessage {
80
- id: string;
81
- content?: string;
82
- channel?: SatoriChannel;
83
- user?: SatoriUser;
84
- member?: {
85
- user?: SatoriUser;
86
- nick?: string;
87
- };
88
- created_at?: number;
89
- updated_at?: number;
90
- }
91
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,2DAA2D;AAC3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,UAAU,EAAE,IAAI,CAAC;IACjB,wBAAwB;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,oCAAoC;AACpC,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,UAAU,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEnE,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,kEAAkE;AAClE,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,UAAU,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAChE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,2BAA2B;AAC3B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,UAAU,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
package/lib/types.js DELETED
@@ -1,13 +0,0 @@
1
- /**
2
- * Satori 适配器类型(参考 https://satori.chat 协议)
3
- */
4
- /** Opcode:EVENT=0, PING=1, PONG=2, IDENTIFY=3, READY=4, META=5 */
5
- export const SatoriOpcode = {
6
- EVENT: 0,
7
- PING: 1,
8
- PONG: 2,
9
- IDENTIFY: 3,
10
- READY: 4,
11
- META: 5,
12
- };
13
- //# 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":"AAAA;;GAEG;AAgCH,kEAAkE;AAClE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;CACC,CAAC"}
package/lib/utils.d.ts DELETED
@@ -1,40 +0,0 @@
1
- /**
2
- * Satori 事件与 zhin Message 的转换
3
- */
4
- import type { SendContent } from 'zhin.js';
5
- import type { SatoriEventBody, SatoriMessage, SatoriChannel } from './types.js';
6
- /** Satori Channel.type: 0=TEXT, 1=DIRECT, 2=CATEGORY, 3=VOICE */
7
- export declare function isPrivateChannel(channel?: SatoriChannel): boolean;
8
- /** 将 Satori 事件体转为 zhin Message 的 MessageBase(仅 message-created/updated,供 $formatMessage 使用) */
9
- export declare function formatSatoriMessagePayload(body: SatoriEventBody, adapterName: 'satori', botName: string, recallFn: (msgId: string) => Promise<void>, replyFn: (channel: {
10
- id: string;
11
- type: 'group' | 'private';
12
- }, content: (string | {
13
- type: string;
14
- data?: Record<string, unknown>;
15
- })[], quote?: boolean | string) => Promise<string>): {
16
- $id: string;
17
- $adapter: 'satori';
18
- $bot: string;
19
- $channel: {
20
- id: string;
21
- type: 'group' | 'private';
22
- };
23
- $sender: {
24
- id: string;
25
- name: string;
26
- };
27
- $content: Array<{
28
- type: string;
29
- data: Record<string, unknown>;
30
- }>;
31
- $raw: string;
32
- $timestamp: number;
33
- $recall: () => Promise<void>;
34
- $reply: (content: SendContent, quote?: boolean | string) => Promise<string>;
35
- };
36
- /** 判断是否为消息相关事件(message-created / message-updated) */
37
- export declare function isMessageEvent(body: SatoriEventBody): body is SatoriEventBody & {
38
- message: SatoriMessage;
39
- };
40
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhF,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAEjE;AAED,+FAA+F;AAC/F,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,eAAe,EACrB,WAAW,EAAE,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,OAAO,EAAE,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,EAAE,OAAO,EAAE,CAAC,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GACjL;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7E,CA4BA;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,IAAI,eAAe,GAAG;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,CAE1G"}
package/lib/utils.js DELETED
@@ -1,33 +0,0 @@
1
- /** Satori Channel.type: 0=TEXT, 1=DIRECT, 2=CATEGORY, 3=VOICE */
2
- export function isPrivateChannel(channel) {
3
- return channel?.type === 1;
4
- }
5
- /** 将 Satori 事件体转为 zhin Message 的 MessageBase(仅 message-created/updated,供 $formatMessage 使用) */
6
- export function formatSatoriMessagePayload(body, adapterName, botName, recallFn, replyFn) {
7
- const msg = body.message;
8
- const channel = body.channel ?? msg.channel;
9
- const user = body.user ?? msg.user ?? msg.member?.user;
10
- const channelId = channel?.id ?? '';
11
- const isPrivate = isPrivateChannel(channel);
12
- const content = msg.content ?? '';
13
- const raw = typeof content === 'string' ? content : String(content);
14
- const senderId = user?.id ?? '';
15
- const senderName = user?.name ?? msg.member?.nick ?? senderId;
16
- return {
17
- $id: `${channelId}:${msg.id}`,
18
- $adapter: 'satori',
19
- $bot: botName,
20
- $channel: { id: channelId, type: isPrivate ? 'private' : 'group' },
21
- $sender: { id: senderId, name: senderName },
22
- $content: [{ type: 'text', data: { text: raw } }],
23
- $raw: raw,
24
- $timestamp: body.timestamp ?? msg.created_at ?? Math.floor(Date.now() / 1000),
25
- $recall: () => recallFn(`${channelId}:${msg.id}`),
26
- $reply: (cnt, quote) => replyFn({ id: channelId, type: isPrivate ? 'private' : 'group' }, (Array.isArray(cnt) ? cnt : [cnt]), quote),
27
- };
28
- }
29
- /** 判断是否为消息相关事件(message-created / message-updated) */
30
- export function isMessageEvent(body) {
31
- return (body.type === 'message-created' || body.type === 'message-updated') && !!body.message?.id;
32
- }
33
- //# sourceMappingURL=utils.js.map
package/lib/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAOA,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,OAAO,OAAO,EAAE,IAAI,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,0BAA0B,CACxC,IAAqB,EACrB,WAAqB,EACrB,OAAe,EACf,QAA0C,EAC1C,OAAkL;IAalL,MAAM,GAAG,GAAG,IAAI,CAAC,OAAQ,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;IACvD,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;IAChC,MAAM,UAAU,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ,CAAC;IAE9D,OAAO;QACL,GAAG,EAAE,GAAG,SAAS,IAAI,GAAG,CAAC,EAAE,EAAE;QAC7B,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE;QAClE,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;QAC3C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;QACjD,IAAI,EAAE,GAAG;QACT,UAAU,EAAE,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC7E,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,SAAS,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,EAAE,CAAC,GAAgB,EAAE,KAAwB,EAAE,EAAE,CACrD,OAAO,CACL,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,EACxD,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAkE,EACnG,KAAK,CACN;KACJ,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAAC,IAAqB;IAClD,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;AACpG,CAAC"}
package/src/adapter.ts DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * Satori 适配器:单一适配器支持 WS 正向 / Webhook,由 config.connection 区分
3
- * 协议文档:https://satori.chat/zh-CN/introduction.html
4
- */
5
- import { formatCompact, Adapter, Plugin } from 'zhin.js';
6
- import type { Router } from '@zhin.js/host-router';
7
- import { SatoriWsClient } from './bot-ws.js';
8
- import { SatoriWebhookBot } from './bot-webhook.js';
9
- import type {
10
- SatoriBotConfig,
11
- SatoriWsConfig,
12
- SatoriWebhookConfig,
13
- } from './types.js';
14
- import type { SatoriEventBody } from './types.js';
15
-
16
- export type SatoriBot = SatoriWsClient | SatoriWebhookBot;
17
-
18
- export class SatoriAdapter extends Adapter<SatoriBot> {
19
- #router?: Router;
20
-
21
- constructor(plugin: Plugin) {
22
- super(plugin, 'satori', []);
23
- }
24
-
25
- createBot(config: SatoriBotConfig): SatoriBot {
26
- switch (config.connection) {
27
- case 'ws':
28
- return new SatoriWsClient(this, config as SatoriWsConfig);
29
- case 'webhook':
30
- if (!this.#router) {
31
- throw new Error('Satori connection: webhook 需要 router,请安装并在配置中启用 @zhin.js/host-router');
32
- }
33
- return new SatoriWebhookBot(this, this.#router, config as SatoriWebhookConfig);
34
- default:
35
- throw new Error(`Unknown Satori connection: ${(config as SatoriBotConfig).connection}`);
36
- }
37
- }
38
-
39
- async start(): Promise<void> {
40
- this.#router = (this.plugin.inject as (key: string) => Router | undefined)('router');
41
- (this.plugin.useContext as (key: string, fn: (router: Router) => void) => void)('router', (router: Router) => {
42
- this.#router = router;
43
- });
44
- await super.start();
45
- }
46
- }