@zhin.js/adapter-discord 6.0.5 → 6.0.6
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.
- package/CHANGELOG.md +19 -0
- package/lib/endpoint.d.ts +2 -0
- package/lib/endpoint.js +36 -2
- package/lib/gateway.d.ts +1 -0
- package/package.json +1 -1
- package/src/endpoint.ts +33 -2
- package/src/gateway.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @zhin.js/adapter-discord
|
|
2
2
|
|
|
3
|
+
## 6.0.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d52f3c5: fix: QQ 适配器群聊误识别为私聊、game-kit 启动崩溃、全面补齐 recallMessage
|
|
8
|
+
|
|
9
|
+
- fix(cli): `resolveChannelType` 增加 `metadata.channelKind` 检查,修复 QQ/Discord/KOOK 群聊消息被误分类为私聊
|
|
10
|
+
- fix(game-kit): `createHostGameDb` 改用延迟代理模型,避免数据库启动前解析模型导致崩溃
|
|
11
|
+
- feat(qq): 实现 `recallMessage`,解析复合 messageId 路由到对应 SDK 撤回方法;`normalizeQqMessage` 增加 `message_type` 缺失时的回退检测
|
|
12
|
+
- feat(slack): 实现 `recallMessage`,利用已有 compound ref 和 `chat.delete` API
|
|
13
|
+
- feat(onebot11): 两个 endpoint 类实现 `recallMessage`(`delete_msg`)
|
|
14
|
+
- feat(onebot12): 两个 endpoint 类实现 `recallMessage`(`delete_message`)
|
|
15
|
+
- feat(napcat): 三个 endpoint 类实现 `recallMessage`(`delete_msg`)
|
|
16
|
+
- feat(discord): 两个 endpoint 类实现 `recallMessage`;`send()` 改为返回 `channelId:snowflake` 复合 ID
|
|
17
|
+
- feat(telegram): 实现 `recallMessage`(`deleteMessage`);`send()` 改为返回 `chatId:messageId` 复合 ID
|
|
18
|
+
- feat(kook): 两个 endpoint 类实现 `recallMessage`,利用 kook-client `recallMsg` API
|
|
19
|
+
- feat(lark): 实现 `recallMessage`(`DELETE /im/v1/messages/{id}`)
|
|
20
|
+
- feat(wecom): 实现 `recallMessage`(`POST /cgi-bin/message/recall`)
|
|
21
|
+
|
|
3
22
|
## 6.0.5
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/lib/endpoint.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export declare class DiscordGatewayEndpoint implements EndpointInstance {
|
|
|
23
23
|
readonly target: string;
|
|
24
24
|
readonly payload: unknown;
|
|
25
25
|
}): Promise<string>;
|
|
26
|
+
recallMessage(messageId: string): Promise<void>;
|
|
26
27
|
/** Test / internal: admit a message when open. */
|
|
27
28
|
admit(msg: DiscordInboundMessage): void;
|
|
28
29
|
/** Test / internal: admit a button interaction when open. */
|
|
@@ -68,6 +69,7 @@ export declare class DiscordInteractionsEndpoint implements EndpointInstance {
|
|
|
68
69
|
readonly target: string;
|
|
69
70
|
readonly payload: unknown;
|
|
70
71
|
}): Promise<string>;
|
|
72
|
+
recallMessage(messageId: string): Promise<void>;
|
|
71
73
|
admit(msg: DiscordInboundMessage): void;
|
|
72
74
|
}
|
|
73
75
|
/**
|
package/lib/endpoint.js
CHANGED
|
@@ -78,7 +78,8 @@ export class DiscordGatewayEndpoint {
|
|
|
78
78
|
}
|
|
79
79
|
async send({ target, payload }) {
|
|
80
80
|
const body = formatOutboundBody(payload);
|
|
81
|
-
const
|
|
81
|
+
const snowflake = await this.#sendBody(target, body);
|
|
82
|
+
const messageId = `${target}:${snowflake}`;
|
|
82
83
|
logger.debug(formatCompact({
|
|
83
84
|
op: 'discord_send',
|
|
84
85
|
endpoint: this.#options.config.name,
|
|
@@ -87,6 +88,20 @@ export class DiscordGatewayEndpoint {
|
|
|
87
88
|
}));
|
|
88
89
|
return messageId;
|
|
89
90
|
}
|
|
91
|
+
async recallMessage(messageId) {
|
|
92
|
+
if (!messageId)
|
|
93
|
+
return;
|
|
94
|
+
const colon = messageId.indexOf(':');
|
|
95
|
+
if (colon <= 0)
|
|
96
|
+
return;
|
|
97
|
+
const channelId = messageId.slice(0, colon);
|
|
98
|
+
const snowflake = messageId.slice(colon + 1);
|
|
99
|
+
const channel = await this.#requireClient().channels.fetch(channelId);
|
|
100
|
+
if (!channel?.isTextBased() || !channel.messages)
|
|
101
|
+
return;
|
|
102
|
+
const msg = await channel.messages.fetch(snowflake);
|
|
103
|
+
await msg.delete();
|
|
104
|
+
}
|
|
90
105
|
/** Test / internal: admit a message when open. */
|
|
91
106
|
admit(msg) {
|
|
92
107
|
if (!this.#open)
|
|
@@ -332,7 +347,26 @@ export class DiscordInteractionsEndpoint {
|
|
|
332
347
|
throw new Error(`Discord send failed (${response.status}): ${text.slice(0, 200)}`);
|
|
333
348
|
}
|
|
334
349
|
const data = JSON.parse(text);
|
|
335
|
-
|
|
350
|
+
const snowflake = data.id ?? '';
|
|
351
|
+
return snowflake ? `${target}:${snowflake}` : '';
|
|
352
|
+
}
|
|
353
|
+
async recallMessage(messageId) {
|
|
354
|
+
if (!messageId)
|
|
355
|
+
return;
|
|
356
|
+
const colon = messageId.indexOf(':');
|
|
357
|
+
if (colon <= 0)
|
|
358
|
+
return;
|
|
359
|
+
const channelId = messageId.slice(0, colon);
|
|
360
|
+
const snowflake = messageId.slice(colon + 1);
|
|
361
|
+
const response = await this.#fetch(`${DISCORD_API}/channels/${channelId}/messages/${snowflake}`, {
|
|
362
|
+
method: 'DELETE',
|
|
363
|
+
headers: { Authorization: `Bot ${this.#options.config.token}` },
|
|
364
|
+
signal: AbortSignal.timeout(OUTBOUND_TIMEOUT_MS),
|
|
365
|
+
});
|
|
366
|
+
if (!response.ok && response.status !== 404) {
|
|
367
|
+
const text = await response.text();
|
|
368
|
+
throw new Error(`Discord recall failed (${response.status}): ${text.slice(0, 200)}`);
|
|
369
|
+
}
|
|
336
370
|
}
|
|
337
371
|
admit(msg) {
|
|
338
372
|
if (!this.#open)
|
package/lib/gateway.d.ts
CHANGED
package/package.json
CHANGED
package/src/endpoint.ts
CHANGED
|
@@ -124,7 +124,8 @@ export class DiscordGatewayEndpoint implements EndpointInstance {
|
|
|
124
124
|
|
|
125
125
|
async send({ target, payload }: { readonly target: string; readonly payload: unknown }): Promise<string> {
|
|
126
126
|
const body = formatOutboundBody(payload);
|
|
127
|
-
const
|
|
127
|
+
const snowflake = await this.#sendBody(target, body);
|
|
128
|
+
const messageId = `${target}:${snowflake}`;
|
|
128
129
|
logger.debug(formatCompact({
|
|
129
130
|
op: 'discord_send',
|
|
130
131
|
endpoint: this.#options.config.name,
|
|
@@ -134,6 +135,18 @@ export class DiscordGatewayEndpoint implements EndpointInstance {
|
|
|
134
135
|
return messageId;
|
|
135
136
|
}
|
|
136
137
|
|
|
138
|
+
async recallMessage(messageId: string): Promise<void> {
|
|
139
|
+
if (!messageId) return;
|
|
140
|
+
const colon = messageId.indexOf(':');
|
|
141
|
+
if (colon <= 0) return;
|
|
142
|
+
const channelId = messageId.slice(0, colon);
|
|
143
|
+
const snowflake = messageId.slice(colon + 1);
|
|
144
|
+
const channel = await this.#requireClient().channels.fetch(channelId);
|
|
145
|
+
if (!channel?.isTextBased() || !channel.messages) return;
|
|
146
|
+
const msg = await channel.messages.fetch(snowflake);
|
|
147
|
+
await msg.delete();
|
|
148
|
+
}
|
|
149
|
+
|
|
137
150
|
/** Test / internal: admit a message when open. */
|
|
138
151
|
admit(msg: DiscordInboundMessage): void {
|
|
139
152
|
if (!this.#open) return;
|
|
@@ -441,7 +454,25 @@ export class DiscordInteractionsEndpoint implements EndpointInstance {
|
|
|
441
454
|
throw new Error(`Discord send failed (${response.status}): ${text.slice(0, 200)}`);
|
|
442
455
|
}
|
|
443
456
|
const data = JSON.parse(text) as { id?: string };
|
|
444
|
-
|
|
457
|
+
const snowflake = data.id ?? '';
|
|
458
|
+
return snowflake ? `${target}:${snowflake}` : '';
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
async recallMessage(messageId: string): Promise<void> {
|
|
462
|
+
if (!messageId) return;
|
|
463
|
+
const colon = messageId.indexOf(':');
|
|
464
|
+
if (colon <= 0) return;
|
|
465
|
+
const channelId = messageId.slice(0, colon);
|
|
466
|
+
const snowflake = messageId.slice(colon + 1);
|
|
467
|
+
const response = await this.#fetch(`${DISCORD_API}/channels/${channelId}/messages/${snowflake}`, {
|
|
468
|
+
method: 'DELETE',
|
|
469
|
+
headers: { Authorization: `Bot ${this.#options.config.token}` },
|
|
470
|
+
signal: AbortSignal.timeout(OUTBOUND_TIMEOUT_MS),
|
|
471
|
+
});
|
|
472
|
+
if (!response.ok && response.status !== 404) {
|
|
473
|
+
const text = await response.text();
|
|
474
|
+
throw new Error(`Discord recall failed (${response.status}): ${text.slice(0, 200)}`);
|
|
475
|
+
}
|
|
445
476
|
}
|
|
446
477
|
|
|
447
478
|
admit(msg: DiscordInboundMessage): void {
|
package/src/gateway.ts
CHANGED
|
@@ -55,6 +55,7 @@ export interface DiscordClientTransport {
|
|
|
55
55
|
send?(options: MessageCreateOptions): Promise<{ id: string }>;
|
|
56
56
|
messages?: {
|
|
57
57
|
fetch(id: string): Promise<{
|
|
58
|
+
delete(): Promise<unknown>;
|
|
58
59
|
react(emoji: string): Promise<unknown>;
|
|
59
60
|
reactions: {
|
|
60
61
|
resolve(emoji: unknown): { users: { remove(userId: string): Promise<unknown> } } | null;
|