@zhin.js/adapter-discord 5.0.0 → 5.0.2

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 (68) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +7 -1
  3. package/{skills/discord → agent}/PERMITS.md +1 -1
  4. package/agent/tools/add_role.ts +24 -0
  5. package/agent/tools/create_thread.ts +25 -0
  6. package/agent/tools/forum_post.ts +24 -0
  7. package/agent/tools/list_roles.ts +22 -0
  8. package/agent/tools/react.ts +22 -0
  9. package/agent/tools/remove_role.ts +24 -0
  10. package/agent/tools/send_embed.ts +37 -0
  11. package/dist/index.js +2 -2
  12. package/lib/agent/tools/add_role.js +22 -0
  13. package/lib/agent/tools/add_role.js.map +1 -0
  14. package/lib/agent/tools/create_thread.js +23 -0
  15. package/lib/agent/tools/create_thread.js.map +1 -0
  16. package/lib/agent/tools/forum_post.js +22 -0
  17. package/lib/agent/tools/forum_post.js.map +1 -0
  18. package/lib/agent/tools/list_roles.js +20 -0
  19. package/lib/agent/tools/list_roles.js.map +1 -0
  20. package/lib/agent/tools/react.js +20 -0
  21. package/lib/agent/tools/react.js.map +1 -0
  22. package/lib/agent/tools/remove_role.js +22 -0
  23. package/lib/agent/tools/remove_role.js.map +1 -0
  24. package/lib/agent/tools/send_embed.js +40 -0
  25. package/lib/agent/tools/send_embed.js.map +1 -0
  26. package/lib/{adapter.js → src/adapter.js} +3 -2
  27. package/lib/src/adapter.js.map +1 -0
  28. package/lib/src/discord-agent-deps.js +10 -0
  29. package/lib/src/discord-agent-deps.js.map +1 -0
  30. package/lib/src/endpoint-interactions.js.map +1 -0
  31. package/lib/{endpoint.js → src/endpoint.js} +116 -14
  32. package/lib/src/endpoint.js.map +1 -0
  33. package/lib/src/index.js +159 -0
  34. package/lib/src/index.js.map +1 -0
  35. package/lib/{platform-permit.js → src/platform-permit.js} +5 -2
  36. package/lib/src/platform-permit.js.map +1 -0
  37. package/lib/src/segment-mapper.js +2 -0
  38. package/lib/src/segment-mapper.js.map +1 -0
  39. package/lib/src/types.js.map +1 -0
  40. package/package.json +25 -15
  41. package/src/adapter.ts +3 -2
  42. package/src/discord-agent-deps.ts +22 -0
  43. package/src/endpoint.ts +125 -15
  44. package/src/index.ts +22 -198
  45. package/src/platform-permit.ts +3 -4
  46. package/src/segment-mapper.ts +1 -0
  47. package/lib/adapter.d.ts +0 -24
  48. package/lib/adapter.d.ts.map +0 -1
  49. package/lib/adapter.js.map +0 -1
  50. package/lib/endpoint-interactions.d.ts +0 -34
  51. package/lib/endpoint-interactions.d.ts.map +0 -1
  52. package/lib/endpoint-interactions.js.map +0 -1
  53. package/lib/endpoint.d.ts +0 -122
  54. package/lib/endpoint.d.ts.map +0 -1
  55. package/lib/endpoint.js.map +0 -1
  56. package/lib/index.d.ts +0 -18
  57. package/lib/index.d.ts.map +0 -1
  58. package/lib/index.js +0 -330
  59. package/lib/index.js.map +0 -1
  60. package/lib/platform-permit.d.ts +0 -16
  61. package/lib/platform-permit.d.ts.map +0 -1
  62. package/lib/platform-permit.js.map +0 -1
  63. package/lib/types.d.ts +0 -49
  64. package/lib/types.d.ts.map +0 -1
  65. package/lib/types.js.map +0 -1
  66. /package/{skills/discord/SKILL.md → agent/skills/discord.md} +0 -0
  67. /package/lib/{endpoint-interactions.js → src/endpoint-interactions.js} +0 -0
  68. /package/lib/{types.js → src/types.js} +0 -0
package/src/endpoint.ts CHANGED
@@ -17,24 +17,32 @@ import {
17
17
  Routes,
18
18
  ApplicationCommandData,
19
19
  ChatInputCommandInteraction,
20
+ ButtonInteraction,
20
21
  InteractionType,
21
22
  InteractionResponseType,
22
23
  GuildMember,
23
- PermissionsBitField,
24
+ ActionRowBuilder,
25
+ ButtonBuilder,
26
+ ButtonStyle,
24
27
  PermissionFlagsBits,
25
- } from "discord.js";
28
+ type MessageEditOptions as DiscordEditMessageOptions,
29
+ } from 'discord.js';
26
30
  import {
27
31
  Endpoint,
28
32
  Message,
29
33
  SendOptions,
30
34
  SendContent,
31
35
  MessageSegment,
32
- segment,} from 'zhin.js';
36
+ segment,
37
+ expandInteractiveSegmentsInContent,
38
+ type EditMessageOptions,
39
+ } from 'zhin.js';
33
40
  import type { DiscordGatewayConfig, DiscordChannelMessage } from "./types.js";
34
41
  import type { DiscordAdapter } from "./adapter.js";
35
- import { createReadStream } from "fs";
36
- import { promises as fs } from "fs";
42
+ import { createReadStream, promises as fs } from 'fs';
43
+
37
44
  import path from "path";
45
+ import { fromCanonicalSegments, toCanonicalSegments } from './segment-mapper.js';
38
46
 
39
47
  export class DiscordEndpoint
40
48
  extends Client
@@ -122,19 +130,62 @@ export class DiscordEndpoint
122
130
  }
123
131
  }
124
132
 
133
+ private async handleButtonInteraction(interaction: ButtonInteraction): Promise<void> {
134
+ try {
135
+ await interaction.deferUpdate();
136
+ } catch {
137
+ // already acknowledged
138
+ }
139
+ const channel = interaction.channel;
140
+ if (!channel) return;
141
+ const channelType = channel.type === ChannelType.DM ? "private" : "group";
142
+ const message = Message.from(interaction, {
143
+ $id: interaction.id,
144
+ $adapter: "discord",
145
+ $endpoint: this.$config.name,
146
+ $sender: {
147
+ id: interaction.user.id,
148
+ name: interaction.user.username || interaction.user.displayName,
149
+ },
150
+ $channel: {
151
+ id: channel.id,
152
+ type: channelType,
153
+ },
154
+ $content: [{
155
+ type: "action",
156
+ data: {
157
+ id: interaction.customId,
158
+ payload: interaction.customId,
159
+ sourceMessageId: interaction.message?.id,
160
+ },
161
+ }],
162
+ $raw: interaction.customId,
163
+ $timestamp: Date.now(),
164
+ $recall: async () => {},
165
+ $reply: async (content: SendContent): Promise<string> => {
166
+ if (!interaction.channel?.isTextBased()) return "";
167
+ const result = await this.sendContentToChannel(interaction.channel as TextChannel, content);
168
+ return result.id;
169
+ },
170
+ });
171
+ this.adapter.emit("message.receive", message);
172
+ }
173
+
125
174
  async $connect(): Promise<void> {
126
175
  return new Promise((resolve, reject) => {
127
176
  // 监听消息事件
128
177
  this.on("messageCreate", this.handleDiscordMessage.bind(this));
129
178
 
130
- // 监听交互事件(Slash Commands
131
- if (this.$config.enableSlashCommands) {
132
- this.on("interactionCreate", async (interaction) => {
133
- if (interaction.isChatInputCommand()) {
134
- await this.handleSlashCommand(interaction);
135
- }
136
- });
137
- }
179
+ // 监听交互事件(Slash Commands + 按钮)
180
+ this.on("interactionCreate", async (interaction) => {
181
+ if (interaction.isChatInputCommand() && this.$config.enableSlashCommands) {
182
+ await this.handleSlashCommand(interaction);
183
+ return;
184
+ }
185
+ if (interaction.isButton()) {
186
+ await this.handleButtonInteraction(interaction);
187
+ }
188
+ });
138
189
 
139
190
  // 监听就绪事件
140
191
  this.once("clientReady", async () => {
@@ -204,7 +255,8 @@ export class DiscordEndpoint
204
255
  }
205
256
 
206
257
  // 转换消息内容为 segment 格式
207
- const content = this.parseMessageContent(msg);
258
+ const wire = this.parseMessageContent(msg);
259
+ const content = toCanonicalSegments(wire);
208
260
 
209
261
  const sender = (() => {
210
262
  const base = {
@@ -550,9 +602,11 @@ export class DiscordEndpoint
550
602
  throw new Error(`Channel ${options.id} is not a text channel`);
551
603
  }
552
604
 
605
+ const canonical = expandInteractiveSegmentsInContent(options.content);
606
+ const wire = fromCanonicalSegments(canonical);
553
607
  const result = await this.sendContentToChannel(
554
608
  channel as any,
555
- options.content
609
+ wire
556
610
  );
557
611
  this.messageChannelMap.set(result.id, options.id);
558
612
  this.pluginLogger.debug(
@@ -620,6 +674,25 @@ export class DiscordEndpoint
620
674
  embeds.push(this.createEmbedFromData(data));
621
675
  break;
622
676
 
677
+ case "keyboard": {
678
+ const components = (data.rows ?? []).map((row: Array<{ id: string; label: string; payload: string; disabled?: boolean; style?: string }>) =>
679
+ new ActionRowBuilder<ButtonBuilder>().addComponents(
680
+ ...row.map((btn) => {
681
+ const b = new ButtonBuilder()
682
+ .setCustomId(String(btn.payload).slice(0, 100))
683
+ .setLabel(btn.label)
684
+ .setDisabled(!!btn.disabled);
685
+ if (btn.style === "danger") b.setStyle(ButtonStyle.Danger);
686
+ else if (btn.style === "primary") b.setStyle(ButtonStyle.Primary);
687
+ else b.setStyle(ButtonStyle.Secondary);
688
+ return b;
689
+ }),
690
+ ),
691
+ );
692
+ messageOptions.components = components;
693
+ break;
694
+ }
695
+
623
696
  default:
624
697
  // 未知类型作为文本处理
625
698
  textContent += data.text || `[${type}]`;
@@ -642,6 +715,43 @@ export class DiscordEndpoint
642
715
  // 发送消息
643
716
  return await channel.send(messageOptions);
644
717
  }
718
+
719
+ async $editMessage(options: EditMessageOptions): Promise<void> {
720
+ const channel = await this.channels.fetch(options.id);
721
+ if (!channel || !channel.isTextBased()) {
722
+ throw new Error(`Channel ${options.id} is not a text channel`);
723
+ }
724
+ const msg = await (channel as TextChannel).messages.fetch(options.messageId);
725
+ const messageOptions: DiscordEditMessageOptions = {};
726
+ let textContent = "";
727
+ if (!Array.isArray(options.content)) options.content = [options.content];
728
+ for (const seg of options.content) {
729
+ if (typeof seg === "string") {
730
+ textContent += seg;
731
+ continue;
732
+ }
733
+ if (seg.type === "text") textContent += seg.data.text || "";
734
+ if (seg.type === "keyboard") {
735
+ messageOptions.components = (seg.data.rows ?? []).map((row: Array<{ label: string; payload: string; disabled?: boolean; style?: string }>) =>
736
+ new ActionRowBuilder<ButtonBuilder>().addComponents(
737
+ ...row.map((btn) => {
738
+ const b = new ButtonBuilder()
739
+ .setCustomId(String(btn.payload).slice(0, 100))
740
+ .setLabel(btn.label)
741
+ .setDisabled(!!btn.disabled);
742
+ if (btn.style === "danger") b.setStyle(ButtonStyle.Danger);
743
+ else if (btn.style === "primary") b.setStyle(ButtonStyle.Primary);
744
+ else b.setStyle(ButtonStyle.Secondary);
745
+ return b;
746
+ }),
747
+ ),
748
+ );
749
+ }
750
+ }
751
+ if (textContent.trim()) messageOptions.content = textContent.trim();
752
+ await msg.edit(messageOptions);
753
+ }
754
+
645
755
  async $recallMessage(id: string): Promise<void> { }
646
756
 
647
757
  // ==================== 服务器管理 API ====================
package/src/index.ts CHANGED
@@ -2,15 +2,15 @@
2
2
  * Discord 适配器入口:单一适配器,支持 Gateway / Interactions(connection: gateway | interactions)
3
3
  */
4
4
  import path from "node:path";
5
- import { usePlugin, type Plugin, type Context, type IGroupManagement, createGroupManagementTools, type ToolFeature } from "zhin.js";
5
+ import { usePlugin, type Plugin, type Context, type ISceneManagement, createSceneManagementTools, type ToolFeature } from "zhin.js";
6
6
  import type { Router } from "@zhin.js/host-router";
7
7
  import { PageManager } from "@zhin.js/host-api";
8
- import { DiscordAdapter, type DiscordEndpointLike } from "./adapter.js";
8
+ import { DiscordAdapter } from "./adapter.js";
9
9
  import {
10
10
  discordGroupPermitResolver,
11
- platformPermit,
12
11
  registerDiscordPlatformPermitChecker,
13
12
  } from "./platform-permit.js";
13
+ import { setDiscordAgentDeps } from "./discord-agent-deps.js";
14
14
 
15
15
  declare module "zhin.js" {
16
16
  namespace Plugin {
@@ -47,204 +47,28 @@ provide({
47
47
  useContext('tool', 'discord', (toolService: ToolFeature, discord: DiscordAdapter) => {
48
48
  const disposers: (() => void)[] = [];
49
49
  disposers.push(registerDiscordPlatformPermitChecker());
50
- const groupTools = createGroupManagementTools(
51
- discord as unknown as IGroupManagement,
52
- 'discord',
53
- { permitResolver: discordGroupPermitResolver, registerChecker: false },
54
- );
55
- disposers.push(...groupTools.map(t => toolService.addTool(t, plugin.name)));
56
-
57
- function getGatewayBot(endpointId: string): DiscordEndpointLike {
58
- const endpoint = discord.endpoints.get(endpointId);
59
- if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
60
- if ((endpoint.$config as { connection?: string }).connection !== 'gateway') {
61
- throw new Error('此工具仅支持 connection: gateway');
62
- }
63
- return endpoint;
64
- }
65
-
66
- disposers.push(toolService.addTool({
67
- name: 'discord_add_role',
68
- description: '给成员添加 Discord 角色',
69
- parameters: {
70
- type: 'object',
71
- properties: {
72
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
73
- guild_id: { type: 'string', description: '服务器 ID' },
74
- user_id: { type: 'string', description: '用户 ID' },
75
- role_id: { type: 'string', description: '角色 ID' },
76
- },
77
- required: ['endpoint_id', 'guild_id', 'user_id', 'role_id'],
78
- },
79
- platforms: ['discord'],
80
- tags: ['discord'],
81
- permissions: [platformPermit('manage_roles')],
82
- execute: async (args: Record<string, any>) => {
83
- const endpoint = getGatewayBot(args.endpoint_id) as any;
84
- const success = await endpoint.addRole(args.guild_id, args.user_id, args.role_id);
85
- return { success, message: success ? `已给用户 ${args.user_id} 添加角色` : '操作失败' };
86
- },
87
- }, plugin.name));
88
-
89
- disposers.push(toolService.addTool({
90
- name: 'discord_remove_role',
91
- description: '移除成员的 Discord 角色',
92
- parameters: {
93
- type: 'object',
94
- properties: {
95
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
96
- guild_id: { type: 'string', description: '服务器 ID' },
97
- user_id: { type: 'string', description: '用户 ID' },
98
- role_id: { type: 'string', description: '角色 ID' },
99
- },
100
- required: ['endpoint_id', 'guild_id', 'user_id', 'role_id'],
101
- },
102
- platforms: ['discord'],
103
- tags: ['discord'],
104
- permissions: [platformPermit('manage_roles')],
105
- execute: async (args: Record<string, any>) => {
106
- const endpoint = getGatewayBot(args.endpoint_id) as any;
107
- const success = await endpoint.removeRole(args.guild_id, args.user_id, args.role_id);
108
- return { success, message: success ? `已移除用户 ${args.user_id} 的角色` : '操作失败' };
109
- },
110
- }, plugin.name));
111
-
112
- disposers.push(toolService.addTool({
113
- name: 'discord_list_roles',
114
- description: '获取 Discord 服务器角色列表',
115
- parameters: {
116
- type: 'object',
117
- properties: {
118
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
119
- guild_id: { type: 'string', description: '服务器 ID' },
120
- },
121
- required: ['endpoint_id', 'guild_id'],
122
- },
123
- platforms: ['discord'],
124
- tags: ['discord'],
125
- permissions: [platformPermit('manage_roles')],
126
- execute: async (args: Record<string, any>) => {
127
- const endpoint = getGatewayBot(args.endpoint_id) as any;
128
- const roles = await endpoint.getRoles(args.guild_id);
129
- return { roles, count: roles.length };
130
- },
131
- }, plugin.name));
132
-
133
- disposers.push(toolService.addTool({
134
- name: 'discord_create_thread',
135
- description: '在 Discord 频道中创建帖子/子线程',
136
- parameters: {
137
- type: 'object',
138
- properties: {
139
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
140
- channel_id: { type: 'string', description: '频道 ID' },
141
- name: { type: 'string', description: '帖子标题' },
142
- message_id: { type: 'string', description: '基于某条消息创建(可选)' },
143
- auto_archive_duration: {
144
- type: 'number',
145
- description: '自动归档时间(分钟:60/1440/4320/10080)',
146
- },
147
- },
148
- required: ['endpoint_id', 'channel_id', 'name'],
50
+ setDiscordAgentDeps({
51
+ getEndpoint: (endpointId) => {
52
+ const endpoint = discord.endpoints.get(endpointId);
53
+ if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
54
+ return endpoint;
149
55
  },
150
- platforms: ['discord'],
151
- tags: ['discord'],
152
- permissions: [platformPermit('manage_channels')],
153
- execute: async (args: Record<string, any>) => {
154
- const endpoint = getGatewayBot(args.endpoint_id) as any;
155
- const thread = await endpoint.createThread(args.channel_id, args.name, args.message_id, args.auto_archive_duration);
156
- return { success: true, thread_id: thread.id, message: `帖子 "${args.name}" 已创建` };
157
- },
158
- }, plugin.name));
159
-
160
- disposers.push(toolService.addTool({
161
- name: 'discord_react',
162
- description: '对 Discord 消息添加表情反应',
163
- parameters: {
164
- type: 'object',
165
- properties: {
166
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
167
- channel_id: { type: 'string', description: '频道 ID' },
168
- message_id: { type: 'string', description: '消息 ID' },
169
- emoji: {
170
- type: 'string',
171
- description: '表情(Unicode 表情或自定义表情如 <:name:id>)',
172
- },
173
- },
174
- required: ['endpoint_id', 'channel_id', 'message_id', 'emoji'],
175
- },
176
- platforms: ['discord'],
177
- tags: ['discord'],
178
- execute: async (args: Record<string, any>) => {
179
- const endpoint = getGatewayBot(args.endpoint_id) as any;
180
- await endpoint.addReaction(args.channel_id, args.message_id, args.emoji);
181
- return { success: true, message: `已添加反应 ${args.emoji}` };
182
- },
183
- }, plugin.name));
184
-
185
- disposers.push(toolService.addTool({
186
- name: 'discord_send_embed',
187
- description: '发送 Discord 富文本嵌入消息(Embed)',
188
- parameters: {
189
- type: 'object',
190
- properties: {
191
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
192
- channel_id: { type: 'string', description: '频道 ID' },
193
- title: { type: 'string', description: 'Embed 标题' },
194
- description: { type: 'string', description: 'Embed 描述' },
195
- color: { type: 'number', description: '颜色值(十进制,如 0x00ff00 = 65280)' },
196
- url: { type: 'string', description: '标题链接(可选)' },
197
- fields: {
198
- type: 'string',
199
- description: '字段,JSON 格式: [{"name":"k","value":"v","inline":false}]',
200
- },
201
- },
202
- required: ['endpoint_id', 'channel_id'],
203
- },
204
- platforms: ['discord'],
205
- tags: ['discord'],
206
- execute: async (args: Record<string, any>) => {
207
- const endpoint = getGatewayBot(args.endpoint_id) as any;
208
- const embedData: any = {};
209
- if (args.title) embedData.title = args.title;
210
- if (args.description) embedData.description = args.description;
211
- if (args.color) embedData.color = args.color;
212
- if (args.url) embedData.url = args.url;
213
- if (args.fields) {
214
- try {
215
- embedData.fields = JSON.parse(args.fields);
216
- } catch {
217
- return { success: false, message: 'fields 格式错误,应为 JSON 数组' };
218
- }
56
+ getGatewayEndpoint: (endpointId) => {
57
+ const endpoint = discord.endpoints.get(endpointId);
58
+ if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
59
+ if ((endpoint.$config as { connection?: string }).connection !== 'gateway') {
60
+ throw new Error('此工具仅支持 connection: gateway');
219
61
  }
220
- const msg = await endpoint.sendEmbed(args.channel_id, embedData);
221
- return { success: true, message_id: msg.id, message: 'Embed 已发送' };
222
- },
223
- }, plugin.name));
224
-
225
- disposers.push(toolService.addTool({
226
- name: 'discord_forum_post',
227
- description: '在 Discord 论坛频道中创建帖子',
228
- parameters: {
229
- type: 'object',
230
- properties: {
231
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
232
- channel_id: { type: 'string', description: '论坛频道 ID' },
233
- name: { type: 'string', description: '帖子标题' },
234
- content: { type: 'string', description: '帖子内容' },
235
- tags: { type: 'string', description: '标签名,逗号分隔(可选)' },
236
- },
237
- required: ['endpoint_id', 'channel_id', 'name', 'content'],
238
- },
239
- platforms: ['discord'],
240
- tags: ['discord'],
241
- execute: async (args: Record<string, any>) => {
242
- const endpoint = getGatewayBot(args.endpoint_id) as any;
243
- const tagList = args.tags ? args.tags.split(',').map((t: string) => t.trim()) : undefined;
244
- const thread = await endpoint.createForumPost(args.channel_id, args.name, args.content, tagList);
245
- return { success: true, thread_id: thread.id, message: `论坛帖 "${args.name}" 已创建` };
62
+ return endpoint;
246
63
  },
247
- }, plugin.name));
64
+ getAdapter: () => discord,
65
+ });
66
+ const sceneTools = createSceneManagementTools(
67
+ discord as unknown as ISceneManagement,
68
+ 'discord',
69
+ { permitResolver: discordGroupPermitResolver, registerChecker: false },
70
+ );
71
+ disposers.push(...sceneTools.map(t => toolService.addTool(t, plugin.name)));
248
72
 
249
73
  return () => disposers.forEach(d => d());
250
74
  });
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Discord platform permit — Guild 权限位
3
3
  */
4
- import type { Message } from 'zhin.js';
5
- import { registerPlatformPermitChecker } from 'zhin.js';
4
+ import { registerPlatformPermitChecker, type Message } from 'zhin.js';
6
5
 
7
6
  const ADAPTER = 'discord';
8
7
 
@@ -11,8 +10,8 @@ export function platformPermit(perm: string): string {
11
10
  }
12
11
 
13
12
  const FACTORY_PERM_MAP: Record<string, string> = {
14
- group_admin: 'moderate_members',
15
- group_owner: 'guild_owner',
13
+ scene_admin: 'moderate_members',
14
+ scene_owner: 'guild_owner',
16
15
  };
17
16
 
18
17
  export function discordGroupPermitResolver(logicalPerm: string): string {
@@ -0,0 +1 @@
1
+ export { toCanonicalSegments, fromCanonicalSegments } from 'zhin.js';
package/lib/adapter.d.ts DELETED
@@ -1,24 +0,0 @@
1
- /**
2
- * Discord 适配器:单一适配器支持 Gateway / Interactions,由 config.connection 区分
3
- */
4
- import { Adapter, Plugin } from 'zhin.js';
5
- import { DiscordEndpoint } from "./endpoint.js";
6
- import { DiscordInteractionsEndpoint } from "./endpoint-interactions.js";
7
- import type { DiscordEndpointConfig } from "./types.js";
8
- export type DiscordEndpointLike = DiscordEndpoint | DiscordInteractionsEndpoint;
9
- export declare class DiscordAdapter extends Adapter<DiscordEndpointLike> {
10
- #private;
11
- static readonly capabilities: readonly ["inbound", "outbound"];
12
- static outboundRichSegmentPolicy: import("zhin.js").OutboundRichSegmentPolicy;
13
- constructor(plugin: Plugin);
14
- createEndpoint(config: DiscordEndpointConfig): DiscordEndpointLike;
15
- kickMember(endpointId: string, sceneId: string, userId: string): Promise<boolean>;
16
- banMember(endpointId: string, sceneId: string, userId: string, reason?: string): Promise<boolean>;
17
- unbanMember(endpointId: string, sceneId: string, userId: string): Promise<boolean>;
18
- muteMember(endpointId: string, sceneId: string, userId: string, duration?: number): Promise<boolean>;
19
- setMemberNickname(endpointId: string, sceneId: string, userId: string, nickname: string): Promise<boolean>;
20
- listMembers(endpointId: string, sceneId: string): Promise<any[]>;
21
- getGroupInfo(endpointId: string, sceneId: string): Promise<any>;
22
- start(): Promise<void>;
23
- }
24
- //# sourceMappingURL=adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAwC,MAAM,SAAS,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,2BAA2B,CAAC;AAMhF,qBAAa,cAAe,SAAQ,OAAO,CAAC,mBAAmB,CAAC;;IAC9D,gBAAyB,YAAY,mCAAoC;IACzE,OAAgB,yBAAyB,8CAAwC;gBAIrE,MAAM,EAAE,MAAM;IAI1B,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,mBAAmB;IAiB5D,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAO9D,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAO9E,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAO/D,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAM;IAO9E,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAOvF,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAO/C,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAOhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Discord Interactions Endpoint 实现
3
- */
4
- import { Client } from "discord.js";
5
- import { Endpoint, Message, SendOptions } from 'zhin.js';
6
- import { type Router } from "@zhin.js/host-router/router";
7
- import type { DiscordInteractionsConfig } from "./types.js";
8
- import type { DiscordAdapter } from "./adapter.js";
9
- export declare class DiscordInteractionsEndpoint extends Client implements Endpoint<DiscordInteractionsConfig, any> {
10
- adapter: DiscordAdapter;
11
- $config: DiscordInteractionsConfig;
12
- $connected: boolean;
13
- private router;
14
- private slashCommandHandlers;
15
- get pluginLogger(): import("zhin.js").Logger;
16
- get $id(): string;
17
- constructor(adapter: DiscordAdapter, router: Router, $config: DiscordInteractionsConfig);
18
- private setupInteractionsEndpoint;
19
- private handleInteraction;
20
- private verifyDiscordSignature;
21
- private handleApplicationCommand;
22
- private formatInteractionAsMessage;
23
- private formatSendContent;
24
- $connect(): Promise<void>;
25
- $disconnect(): Promise<void>;
26
- private registerSlashCommands;
27
- addSlashCommandHandler(commandName: string, handler: (interaction: any) => Promise<void>): void;
28
- removeSlashCommandHandler(commandName: string): boolean;
29
- private getActivityType;
30
- $formatMessage(msg: any): Message<any>;
31
- $sendMessage(options: SendOptions): Promise<string>;
32
- $recallMessage(id: string): Promise<void>;
33
- }
34
- //# sourceMappingURL=endpoint-interactions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-interactions.d.ts","sourceRoot":"","sources":["../src/endpoint-interactions.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,MAAM,EAiBP,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAwC,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAsB,KAAK,MAAM,EAAsB,MAAM,6BAA6B,CAAC;AAClG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,qBAAa,2BACX,SAAQ,MACR,YAAW,QAAQ,CAAC,yBAAyB,EAAE,GAAG,CAAC;IAgBhC,OAAO,EAAE,cAAc;IAAyB,OAAO,EAAE,yBAAyB;IAfrG,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,oBAAoB,CAGd;IAEd,IAAI,YAAY,6BAEf;IAED,IAAI,GAAG,WAEN;gBAEkB,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAS,OAAO,EAAE,yBAAyB;IAerG,OAAO,CAAC,yBAAyB;YAOnB,iBAAiB;IA0C/B,OAAO,CAAC,sBAAsB;YAiBhB,wBAAwB;IA+BtC,OAAO,CAAC,0BAA0B;IAuClC,OAAO,CAAC,iBAAiB;IAuCnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBpB,qBAAqB;IAsBnC,sBAAsB,CACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,WAAW,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAC3C,IAAI;IAKP,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKvD,OAAO,CAAC,eAAe;IAYvB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAIhC,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAChD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint-interactions.js","sourceRoot":"","sources":["../src/endpoint-interactions.ts"],"names":[],"mappings":"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"}