@alemonjs/qq-bot 2.1.33 → 2.1.35

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 (132) hide show
  1. package/README.md +46 -8
  2. package/dist/assets/index.css +1 -1
  3. package/dist/assets/index.js +12 -5
  4. package/dist/index.html +1 -1
  5. package/lib/config.d.ts +44 -19
  6. package/lib/config.js +39 -35
  7. package/lib/desktop.d.ts +4 -1
  8. package/lib/desktop.js +53 -57
  9. package/lib/format.d.ts +26 -5
  10. package/lib/format.js +84 -101
  11. package/lib/hook.d.ts +82 -65
  12. package/lib/hook.js +35 -32
  13. package/lib/index.d.ts +6 -4
  14. package/lib/index.js +13 -16
  15. package/lib/index.webhook.d.ts +4 -1
  16. package/lib/index.webhook.js +12 -14
  17. package/lib/index.websoket.d.ts +6 -3
  18. package/lib/index.websoket.js +131 -41
  19. package/lib/message/AT_MESSAGE_CREATE.d.ts +36 -33
  20. package/lib/message/AT_MESSAGE_CREATE.js +1 -1
  21. package/lib/message/CHANNEL_CREATE.d.ts +17 -14
  22. package/lib/message/CHANNEL_CREATE.js +1 -1
  23. package/lib/message/CHANNEL_DELETE.d.ts +22 -14
  24. package/lib/message/CHANNEL_DELETE.js +1 -1
  25. package/lib/message/CHANNEL_UPDATE.d.ts +22 -14
  26. package/lib/message/CHANNEL_UPDATE.js +1 -1
  27. package/lib/message/DIRECT_MESSAGE_CREATE.d.ts +35 -27
  28. package/lib/message/DIRECT_MESSAGE_CREATE.js +1 -1
  29. package/lib/message/DIRECT_MESSAGE_DELETE.d.ts +23 -15
  30. package/lib/message/DIRECT_MESSAGE_DELETE.js +1 -1
  31. package/lib/message/ERROR.d.ts +4 -1
  32. package/lib/message/ERROR.js +1 -1
  33. package/lib/message/GUILD_CREATE.d.ts +22 -14
  34. package/lib/message/GUILD_CREATE.js +1 -1
  35. package/lib/message/GUILD_DELETE.d.ts +22 -14
  36. package/lib/message/GUILD_DELETE.js +1 -1
  37. package/lib/message/GUILD_MEMBER_ADD.d.ts +21 -13
  38. package/lib/message/GUILD_MEMBER_ADD.js +1 -1
  39. package/lib/message/GUILD_MEMBER_REMOVE.d.ts +21 -13
  40. package/lib/message/GUILD_MEMBER_REMOVE.js +1 -1
  41. package/lib/message/GUILD_MEMBER_UPDATE.d.ts +21 -13
  42. package/lib/message/GUILD_MEMBER_UPDATE.js +1 -1
  43. package/lib/message/GUILD_UPDATE.d.ts +22 -14
  44. package/lib/message/GUILD_UPDATE.js +1 -1
  45. package/lib/message/INTERACTION_CREATE.d.ts +52 -44
  46. package/lib/message/INTERACTION_CREATE.js +1 -1
  47. package/lib/message/MESSAGE_CREATE.d.ts +12 -1
  48. package/lib/message/MESSAGE_CREATE.js +1 -1
  49. package/lib/message/MESSAGE_DELETE.d.ts +12 -1
  50. package/lib/message/MESSAGE_DELETE.js +1 -1
  51. package/lib/message/MESSAGE_REACTION_ADD.d.ts +15 -12
  52. package/lib/message/MESSAGE_REACTION_ADD.js +1 -1
  53. package/lib/message/MESSAGE_REACTION_REMOVE.d.ts +15 -12
  54. package/lib/message/MESSAGE_REACTION_REMOVE.js +1 -1
  55. package/lib/message/PUBLIC_MESSAGE_DELETE.d.ts +20 -13
  56. package/lib/message/PUBLIC_MESSAGE_DELETE.js +1 -1
  57. package/lib/message/READY.d.ts +11 -5
  58. package/lib/message/READY.js +1 -1
  59. package/lib/message/group/C2C_MESSAGE_CREATE.d.ts +18 -15
  60. package/lib/message/group/C2C_MESSAGE_CREATE.js +1 -1
  61. package/lib/message/group/C2C_MSG_RECEIVE.d.ts +13 -3
  62. package/lib/message/group/C2C_MSG_RECEIVE.js +1 -1
  63. package/lib/message/group/C2C_MSG_REJECT.d.ts +9 -3
  64. package/lib/message/group/C2C_MSG_REJECT.js +1 -1
  65. package/lib/message/group/FRIEND_ADD.d.ts +13 -3
  66. package/lib/message/group/FRIEND_ADD.js +1 -1
  67. package/lib/message/group/FRIEND_DEL.d.ts +9 -3
  68. package/lib/message/group/FRIEND_DEL.js +1 -1
  69. package/lib/message/group/GROUP_ADD_ROBOT.d.ts +23 -4
  70. package/lib/message/group/GROUP_ADD_ROBOT.js +1 -1
  71. package/lib/message/group/GROUP_AT_MESSAGE_CREATE.d.ts +38 -32
  72. package/lib/message/group/GROUP_AT_MESSAGE_CREATE.js +1 -1
  73. package/lib/message/group/GROUP_DEL_ROBOT.d.ts +19 -4
  74. package/lib/message/group/GROUP_DEL_ROBOT.js +1 -1
  75. package/lib/message/group/GROUP_JOIN_REQUEST.d.ts +83 -22
  76. package/lib/message/group/GROUP_JOIN_REQUEST.js +1 -1
  77. package/lib/message/group/GROUP_MEMBER_ADD.d.ts +8 -5
  78. package/lib/message/group/GROUP_MEMBER_ADD.js +1 -1
  79. package/lib/message/group/GROUP_MEMBER_REMOVE.d.ts +8 -5
  80. package/lib/message/group/GROUP_MEMBER_REMOVE.js +1 -1
  81. package/lib/message/group/GROUP_MESSAGE_CREATE.d.ts +38 -32
  82. package/lib/message/group/GROUP_MESSAGE_CREATE.js +1 -1
  83. package/lib/message/group/GROUP_MSG_RECEIVE.d.ts +14 -4
  84. package/lib/message/group/GROUP_MSG_RECEIVE.js +1 -1
  85. package/lib/message/group/GROUP_MSG_REJECT.d.ts +10 -4
  86. package/lib/message/group/GROUP_MSG_REJECT.js +1 -1
  87. package/lib/message/group/MESSAGE_AUDIT_PASS.d.ts +12 -6
  88. package/lib/message/group/MESSAGE_AUDIT_PASS.js +1 -1
  89. package/lib/message/group/MESSAGE_AUDIT_REJECT.d.ts +12 -6
  90. package/lib/message/group/MESSAGE_AUDIT_REJECT.js +1 -1
  91. package/lib/register.d.ts +12 -9
  92. package/lib/register.js +1246 -1404
  93. package/lib/sdk/api.d.ts +937 -306
  94. package/lib/sdk/api.js +1481 -893
  95. package/lib/sdk/client.webhook.d.ts +25 -8
  96. package/lib/sdk/client.webhook.js +185 -189
  97. package/lib/sdk/client.websoket.d.ts +31 -9
  98. package/lib/sdk/client.websoket.js +369 -392
  99. package/lib/sdk/config.d.ts +6 -2
  100. package/lib/sdk/config.js +9 -6
  101. package/lib/sdk/instance.d.ts +11 -3
  102. package/lib/sdk/instance.js +72 -84
  103. package/lib/sdk/intents.d.ts +89 -3
  104. package/lib/sdk/intents.js +116 -33
  105. package/lib/sdk/message.d.ts +7 -4
  106. package/lib/sdk/message.group.d.ts +38 -35
  107. package/lib/sdk/message.group.js +1 -1
  108. package/lib/sdk/message.guild.d.ts +40 -37
  109. package/lib/sdk/message.guild.js +1 -1
  110. package/lib/sdk/message.js +1 -1
  111. package/lib/sdk/message.public.d.ts +8 -5
  112. package/lib/sdk/message.public.js +1 -1
  113. package/lib/sdk/qr-auth.d.ts +55 -0
  114. package/lib/sdk/qr-auth.js +166 -0
  115. package/lib/sdk/registry.d.ts +34 -24
  116. package/lib/sdk/registry.js +134 -114
  117. package/lib/sdk/session.d.ts +19 -15
  118. package/lib/sdk/session.js +51 -54
  119. package/lib/sdk/typing.d.ts +410 -184
  120. package/lib/sdk/typing.js +1 -1
  121. package/lib/sdk/webhook.secret.d.ts +33 -13
  122. package/lib/sdk/webhook.secret.js +50 -36
  123. package/lib/sends.d.ts +42 -25
  124. package/lib/sends.js +519 -541
  125. package/lib/types.d.ts +52 -41
  126. package/lib/types.js +1 -1
  127. package/lib/upload.d.ts +47 -18
  128. package/lib/upload.js +80 -51
  129. package/lib/utils.d.ts +9 -1
  130. package/lib/utils.js +10 -5
  131. package/package.json +10 -7
  132. package/LICENSE +0 -21
package/lib/register.js CHANGED
@@ -1,1408 +1,1250 @@
1
- import { cbpPlatform, FormatEvent, createResult, ResultCode, logger } from 'alemonjs';
2
- import { createHash } from 'node:crypto';
3
- import { stat, readFile } from 'node:fs/promises';
4
- import { basename } from 'node:path';
5
- import { chunkedUpload } from './upload.js';
6
- import { GROUP_AT_MESSAGE_CREATE, C2C_MESSAGE_CREATE, DIRECT_MESSAGE_CREATE, AT_MESSAGE_CREATE, MESSAGE_CREATE } from './sends.js';
7
- import { getQQBotConfig, platform, getMaster, getIdentity } from './config.js';
1
+ import { getIdentity, getMaster, getQQBotConfig, platform } from "./config.js";
2
+ import { chunkedUpload } from "./upload.js";
3
+ import { AT_MESSAGE_CREATE, C2C_MESSAGE_CREATE, DIRECT_MESSAGE_CREATE, GROUP_AT_MESSAGE_CREATE, MESSAGE_CREATE } from "./sends.js";
4
+ import { FormatEvent, ResultCode, cbpPlatform, createResult, logger } from "alemonjs";
5
+ import { createHash } from "node:crypto";
6
+ import { basename } from "node:path";
7
+ import { readFile, stat } from "node:fs/promises";
8
8
 
9
+ //#region src/register.ts
10
+ /**
11
+ * notice 事件中平台支持以 event_id 被动回复的 tag
12
+ * (QQ 官方「发送消息」文档:群聊支持 GROUP_ADD_ROBOT / GROUP_MSG_RECEIVE,
13
+ * 单聊支持 C2C_MSG_RECEIVE / FRIEND_ADD;event_id 取网关信封 payload.id)
14
+ */
15
+ const GROUP_EVENT_REPLY_TAGS = /* @__PURE__ */ new Set(["GROUP_ADD_ROBOT", "GROUP_MSG_RECEIVE"]);
16
+ const C2C_EVENT_REPLY_TAGS = /* @__PURE__ */ new Set(["C2C_MSG_RECEIVE", "FRIEND_ADD"]);
17
+ /**
18
+ * notice / member 类事件 tag:事件不含平台认可的被动回复 msg_id(MessageId 为合成值或缺省),
19
+ * 消息发送统一降级为群主动消息(仅携带 ChannelId,不透传 MessageId)。
20
+ * 事件回复 tag 也在其中:缺失 event_id 时同样落到主动消息
21
+ */
22
+ const GROUP_NOTICE_TAGS = /* @__PURE__ */ new Set([
23
+ "GROUP_ADD_ROBOT",
24
+ "GROUP_DEL_ROBOT",
25
+ "GROUP_MEMBER_ADD",
26
+ "GROUP_MEMBER_REMOVE",
27
+ "GROUP_JOIN_REQUEST",
28
+ "GROUP_MSG_RECEIVE",
29
+ "GROUP_MSG_REJECT",
30
+ "MESSAGE_AUDIT_PASS",
31
+ "MESSAGE_AUDIT_REJECT"
32
+ ]);
33
+ /**
34
+ * 好友 / C2C notice 类事件 tag:同上,降级为私聊主动消息(仅携带 UserId)
35
+ */
36
+ const C2C_NOTICE_TAGS = /* @__PURE__ */ new Set([
37
+ "C2C_MSG_RECEIVE",
38
+ "C2C_MSG_REJECT",
39
+ "FRIEND_ADD",
40
+ "FRIEND_DEL"
41
+ ]);
9
42
  const register = (client, options) => {
10
- const MAX_MEDIA_SIZE = 100 * 1024 * 1024;
11
- const config = getQQBotConfig();
12
- const botId = String(options?.botId ?? config?.app_id ?? '');
13
- const port = process.env?.port || config?.port || 17117;
14
- const url = `ws://127.0.0.1:${port}`;
15
- const cbp = options?.cbp ?? cbpPlatform(url);
16
- const createUserAvatarURL = (authorId) => {
17
- return `https://q.qlogo.cn/qqapp/${botId}/${authorId}/640`;
18
- };
19
- const getGroupMessageMeta = (event) => {
20
- const author = event?.author;
21
- const UserId = author?.id ?? '';
22
- const memberOpenId = author?.member_openid ?? '';
23
- const groupId = event?.group_id ?? event?.group_openid ?? '';
24
- const messageId = event?.id ?? '';
25
- const [isMaster, UserKey] = UserId ? getMaster(UserId) : [false, ''];
26
- return {
27
- UserId,
28
- UserKey,
29
- isMaster,
30
- UserName: author?.username ?? '',
31
- UserAvatar: UserId ? createUserAvatarURL(UserId) : '',
32
- groupId,
33
- messageId,
34
- openId: memberOpenId ? `C2C:${memberOpenId}` : ''
35
- };
36
- };
37
- const getGroupAuditMeta = (event) => {
38
- const groupId = event?.group_openid ?? '';
39
- const messageId = event?.message_id ?? event?.audit_id ?? '';
40
- const auditTime = event?.audit_time ?? '';
41
- return {
42
- groupId,
43
- messageId,
44
- auditTime
45
- };
46
- };
47
- const getMediaItems = (attachments) => {
48
- return (attachments || []).flatMap(attachment => {
49
- if (!attachment?.url) {
50
- return [];
51
- }
52
- const mimeType = attachment.content_type || '';
53
- const Type = mimeType.startsWith('image/')
54
- ? 'image'
55
- : mimeType.startsWith('audio/')
56
- ? 'audio'
57
- : mimeType.startsWith('video/')
58
- ? 'video'
59
- : 'file';
60
- return [
61
- {
62
- Type,
63
- Url: attachment.url,
64
- ...(attachment.filename && { FileName: attachment.filename }),
65
- ...(typeof attachment.size === 'number' && { FileSize: attachment.size }),
66
- ...(mimeType && { MimeType: mimeType })
67
- }
68
- ];
69
- });
70
- };
71
- const normalizeTarget = (target) => {
72
- if (!target?.targetId || !target.scope) {
73
- return undefined;
74
- }
75
- return target;
76
- };
77
- const validateTargetBot = (target) => {
78
- return !target.BotId || target.BotId === botId;
79
- };
80
- const mediaCache = new Map();
81
- const mediaType = (type) => (type === 'image' ? 1 : type === 'video' ? 2 : type === 'audio' ? 3 : 4);
82
- const prepareMedia = async (target, params) => {
83
- const sources = [params?.url, params?.data, params?.filePath, params?.fileId].filter(value => value !== undefined && value !== '').length;
84
- if (sources !== 1) {
85
- throw new Error('Provide exactly one media source: url, data, filePath, or fileId');
86
- }
87
- if (params.fileId) {
88
- return { fileId: String(params.fileId), reused: true };
89
- }
90
- let data = params.data;
91
- let buffer;
92
- let filePath;
93
- let fileSize;
94
- let hashes;
95
- let name = params.name;
96
- let hashSource = String(params.url || '');
97
- if (params.filePath) {
98
- const metadata = await stat(String(params.filePath));
99
- if (!metadata.isFile()) {
100
- throw new Error('media filePath must point to a regular file');
101
- }
102
- if (metadata.size > MAX_MEDIA_SIZE) {
103
- throw new Error('QQ media files must not exceed 100 MiB');
104
- }
105
- filePath = String(params.filePath);
106
- fileSize = metadata.size;
107
- hashes = await client.getMediaFileHashes(filePath);
108
- hashSource = hashes.sha256;
109
- name ||= basename(filePath);
110
- if (fileSize < 5 * 1024 * 1024) {
111
- buffer = await readFile(filePath);
112
- data = `base64://${buffer.toString('base64')}`;
113
- }
114
- }
115
- else if (data) {
116
- hashSource = data;
117
- const value = data.replace(/^base64:\/\//, '');
118
- buffer = Buffer.from(value, 'base64');
119
- if (buffer.length > MAX_MEDIA_SIZE) {
120
- throw new Error('QQ media files must not exceed 100 MiB');
121
- }
122
- }
123
- const key = [botId, target.scope, target.targetId, params.type, createHash('sha256').update(hashSource).digest('hex')].join(':');
124
- const cached = mediaCache.get(key);
125
- if (cached && (!cached.expiresAt || cached.expiresAt > Date.now())) {
126
- return { fileId: cached.fileId, expiresAt: cached.expiresAt, reused: true };
127
- }
128
- return { key, url: params.url, data, buffer, filePath, fileSize, hashes, name, reused: false };
129
- };
130
- const uploadMedia = async (target, params) => {
131
- if (!validateTargetBot(target)) {
132
- throw new Error(`BotId ${target.BotId} is not active`);
133
- }
134
- if (target.scope !== 'group' && target.scope !== 'c2c') {
135
- throw new Error('QQ media upload only supports group and c2c targets');
136
- }
137
- const prepared = await prepareMedia(target, params);
138
- if (prepared.fileId) {
139
- return prepared;
140
- }
141
- const fileType = mediaType(params.type);
142
- const value = prepared.filePath && prepared.fileSize && prepared.fileSize >= 5 * 1024 * 1024
143
- ? await client.postChunkedRichMedia({
144
- scope: target.scope,
145
- targetId: target.targetId,
146
- fileType,
147
- filePath: prepared.filePath,
148
- size: prepared.fileSize,
149
- hashes: prepared.hashes,
150
- name: prepared.name
151
- })
152
- : prepared.buffer && prepared.buffer.length >= 5 * 1024 * 1024
153
- ? await client.postChunkedRichMedia({ scope: target.scope, targetId: target.targetId, fileType, data: prepared.buffer, name: prepared.name })
154
- : target.scope === 'group'
155
- ? await client.postRichMediaByGroup(target.targetId, { file_type: fileType, url: prepared.url, file_data: prepared.data, srv_send_msg: false })
156
- : await client.postRichMediaByUser(target.targetId, { file_type: fileType, url: prepared.url, file_data: prepared.data, srv_send_msg: false });
157
- const expiresAt = value.ttl ? Date.now() + value.ttl * 1000 : undefined;
158
- if (prepared.key) {
159
- mediaCache.set(prepared.key, { fileId: value.file_info, expiresAt });
160
- }
161
- return { fileId: value.file_info, expiresAt, reused: false };
162
- };
163
- const createUserMeta = (UserId, extra = {}) => {
164
- const [IsMaster, UserKey] = getIdentity(UserId);
165
- return {
166
- UserId,
167
- UserKey,
168
- IsMaster,
169
- IsBot: false,
170
- ...extra
171
- };
172
- };
173
- client.on('GROUP_ADD_ROBOT', event => {
174
- cbp.send(FormatEvent.create('guild.join')
175
- .addPlatform({ Platform: platform, value: event, BotId: botId })
176
- .addGuild({ GuildId: event.group_openid, SpaceId: `GROUP:${event.group_openid}` })
177
- .addChannel({ ChannelId: event.group_openid })
178
- .addUser(createUserMeta(event.op_member_openid, { UserAvatar: createUserAvatarURL(event.op_member_openid) }))
179
- .add({ tag: 'GROUP_ADD_ROBOT' }).value);
180
- });
181
- client.on('GROUP_DEL_ROBOT', event => {
182
- cbp.send(FormatEvent.create('guild.exit')
183
- .addPlatform({ Platform: platform, value: event, BotId: botId })
184
- .addGuild({ GuildId: event.group_openid, SpaceId: `GROUP:${event.group_openid}` })
185
- .addChannel({ ChannelId: event.group_openid })
186
- .addUser(createUserMeta(event.op_member_openid, { UserAvatar: createUserAvatarURL(event.op_member_openid) }))
187
- .add({ tag: 'GROUP_DEL_ROBOT' }).value);
188
- });
189
- client.on('GROUP_MESSAGE_CREATE', event => {
190
- if (event?.author?.bot) {
191
- return;
192
- }
193
- const msg = getMessageContent(event);
194
- const meta = getGroupMessageMeta(event);
195
- cbp.send(FormatEvent.create('message.create')
196
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: false })
197
- .addGuild({ GuildId: meta.groupId, SpaceId: `GROUP:${meta.groupId}` })
198
- .addChannel({ ChannelId: meta.groupId })
199
- .addUser({
200
- UserId: meta.UserId,
201
- UserKey: meta.UserKey,
202
- UserAvatar: meta.UserAvatar,
203
- UserName: meta.UserName,
204
- IsMaster: meta.isMaster,
205
- IsBot: false
206
- })
207
- .addMessage({ MessageId: meta.messageId })
208
- .addText({ MessageText: msg?.trim() })
209
- .addMedia({ MessageMedia: getMediaItems(event.attachments) })
210
- .addOpen({ OpenId: meta.openId })
211
- .add({ tag: 'GROUP_MESSAGE_CREATE' }).value);
212
- });
213
- client.on('GROUP_MEMBER_ADD', event => {
214
- const UserId = event.op_member_openid ?? event.member_openid ?? '';
215
- const [isMaster, UserKey] = getMaster(UserId);
216
- cbp.send(FormatEvent.create('member.add')
217
- .addPlatform({ Platform: platform, value: event, BotId: botId })
218
- .addGuild({ GuildId: event.group_openid ?? '', SpaceId: `GROUP:${event.group_openid ?? ''}` })
219
- .addChannel({ ChannelId: event.group_openid ?? '' })
220
- .addUser({ UserId: UserId, UserKey, UserName: event?.username ?? '', UserAvatar: createUserAvatarURL(UserId), IsMaster: isMaster, IsBot: false })
221
- .add({ tag: 'GROUP_MEMBER_ADD' }).value);
222
- });
223
- client.on('GROUP_MEMBER_REMOVE', event => {
224
- const UserId = event.op_member_openid ?? event.member_openid ?? '';
225
- const [isMaster, UserKey] = getMaster(UserId);
226
- cbp.send(FormatEvent.create('member.remove')
227
- .addPlatform({ Platform: platform, value: event, BotId: botId })
228
- .addGuild({ GuildId: event.group_openid ?? '', SpaceId: `GROUP:${event.group_openid ?? ''}` })
229
- .addChannel({ ChannelId: event.group_openid ?? '' })
230
- .addUser({ UserId: UserId, UserKey, UserName: event?.username ?? '', UserAvatar: createUserAvatarURL(UserId), IsMaster: isMaster, IsBot: false })
231
- .add({ tag: 'GROUP_MEMBER_REMOVE' }).value);
232
- });
233
- client.on('GROUP_JOIN_REQUEST', event => {
234
- const UserId = event.member_openid ?? '';
235
- const [isMaster, UserKey] = getMaster(UserId);
236
- cbp.send(FormatEvent.create('notice.create')
237
- .addPlatform({ Platform: platform, value: event, BotId: botId })
238
- .addGuild({ GuildId: event.group_openid ?? '', SpaceId: `GROUP:${event.group_openid ?? ''}` })
239
- .addChannel({ ChannelId: event.group_openid ?? '' })
240
- .addUser({
241
- UserId: UserId,
242
- UserKey,
243
- UserName: event?.username ?? '',
244
- UserAvatar: createUserAvatarURL(UserId),
245
- IsMaster: isMaster,
246
- IsBot: event.bot ?? false
247
- })
248
- .addMessage({ MessageId: `group_join_request_${event.group_openid}_${event.join_request_id}` })
249
- .add({ tag: 'GROUP_JOIN_REQUEST' }).value);
250
- });
251
- client.on('GROUP_AT_MESSAGE_CREATE', event => {
252
- if (event?.author?.bot) {
253
- return;
254
- }
255
- const msg = getMessageContent(event);
256
- const meta = getGroupMessageMeta(event);
257
- cbp.send(FormatEvent.create('message.create')
258
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: true, IsPrivate: false })
259
- .addGuild({ GuildId: meta.groupId, SpaceId: `GROUP:${meta.groupId}` })
260
- .addChannel({ ChannelId: meta.groupId })
261
- .addUser({
262
- UserId: meta.UserId,
263
- UserKey: meta.UserKey,
264
- UserAvatar: meta.UserAvatar,
265
- UserName: meta.UserName,
266
- IsMaster: meta.isMaster,
267
- IsBot: false
268
- })
269
- .addMessage({ MessageId: meta.messageId })
270
- .addText({ MessageText: msg?.trim() })
271
- .addMedia({ MessageMedia: getMediaItems(event.attachments) })
272
- .addOpen({ OpenId: meta.openId })
273
- .add({ tag: 'GROUP_AT_MESSAGE_CREATE' }).value);
274
- });
275
- client.on('C2C_MESSAGE_CREATE', event => {
276
- const UserId = event.author.id;
277
- const [isMaster, UserKey] = getMaster(UserId);
278
- const UserAvatar = createUserAvatarURL(event.author.id);
279
- cbp.send(FormatEvent.create('private.message.create')
280
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: true })
281
- .addUser({
282
- UserId: event.author.id,
283
- UserKey,
284
- UserAvatar: UserAvatar,
285
- UserName: event?.author?.username,
286
- IsMaster: isMaster,
287
- IsBot: false
288
- })
289
- .addMessage({ MessageId: event.id })
290
- .addText({ MessageText: event.content?.trim() })
291
- .addMedia({ MessageMedia: getMediaItems(event.attachments) })
292
- .addOpen({ OpenId: `C2C:${event.author.user_openid}` })
293
- .add({ tag: 'C2C_MESSAGE_CREATE' }).value);
294
- });
295
- client.on('DIRECT_MESSAGE_CREATE', event => {
296
- if (event?.author?.bot) {
297
- return;
298
- }
299
- const msg = event?.content ?? '';
300
- const UserAvatar = event?.author?.avatar;
301
- const UserId = event.author.id;
302
- const [isMaster, UserKey] = getMaster(UserId);
303
- cbp.send(FormatEvent.create('private.message.create')
304
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: true })
305
- .addUser({
306
- UserId: event?.author?.id ?? '',
307
- UserKey,
308
- UserName: event?.author?.username ?? '',
309
- UserAvatar: UserAvatar,
310
- IsMaster: isMaster,
311
- IsBot: event.author?.bot
312
- })
313
- .addMessage({ MessageId: event.id })
314
- .addText({ MessageText: msg?.trim() })
315
- .addMedia({ MessageMedia: getMediaItems(event.attachments) })
316
- .addOpen({ OpenId: `DIRECT:${event.guild_id}` })
317
- .add({ tag: 'DIRECT_MESSAGE_CREATE' }).value);
318
- });
319
- client.on('AT_MESSAGE_CREATE', event => {
320
- if (event?.author?.bot) {
321
- return;
322
- }
323
- const msg = getMessageContent(event);
324
- const UserAvatar = event?.author?.avatar;
325
- const UserId = event.author.id;
326
- const [isMaster, UserKey] = getMaster(UserId);
327
- cbp.send(FormatEvent.create('message.create')
328
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: true, IsPrivate: false })
329
- .addGuild({ GuildId: event.guild_id, SpaceId: `GUILD:${event.channel_id}` })
330
- .addChannel({ ChannelId: event.channel_id })
331
- .addUser({
332
- UserId: event?.author?.id ?? '',
333
- UserKey,
334
- UserName: event?.author?.username ?? '',
335
- UserAvatar: UserAvatar,
336
- IsMaster: isMaster,
337
- IsBot: event.author?.bot
338
- })
339
- .addMessage({ MessageId: event.id })
340
- .addText({ MessageText: msg?.trim() })
341
- .addMedia({ MessageMedia: getMediaItems(event.attachments) })
342
- .addOpen({ OpenId: `DIRECT:${event.guild_id}` })
343
- .add({ tag: 'AT_MESSAGE_CREATE' }).value);
344
- });
345
- const getMessageContent = event => {
346
- let msg = event?.content ?? '';
347
- if (event?.mentions) {
348
- for (const item of event.mentions) {
349
- if (item?.id) {
350
- msg = msg.replace(`<@!${item.id}>`, '').trim();
351
- msg = msg.replace(`<@${item.id}>`, '').trim();
352
- }
353
- if (item?.username) {
354
- msg = msg.replace(`[${item.username}]`, '').trim();
355
- }
356
- }
357
- }
358
- return msg;
359
- };
360
- client.on('MESSAGE_CREATE', event => {
361
- if (event.author?.bot) {
362
- return;
363
- }
364
- if (new RegExp(/DELETE$/).test(event.eventType)) {
365
- return;
366
- }
367
- const UserId = event.author.id;
368
- const msg = getMessageContent(event);
369
- const UserAvatar = event?.author?.avatar;
370
- const [isMaster, UserKey] = getMaster(UserId);
371
- cbp.send(FormatEvent.create('message.create')
372
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: false })
373
- .addGuild({ GuildId: event.guild_id, SpaceId: `GUILD:${event.channel_id}` })
374
- .addChannel({ ChannelId: event.channel_id })
375
- .addUser({
376
- UserId: event?.author?.id ?? '',
377
- UserKey,
378
- UserName: event?.author?.username ?? '',
379
- UserAvatar: UserAvatar,
380
- IsMaster: isMaster,
381
- IsBot: false
382
- })
383
- .addMessage({ MessageId: event.id })
384
- .addText({ MessageText: msg?.trim() })
385
- .addMedia({ MessageMedia: getMediaItems(event.attachments) })
386
- .addOpen({ OpenId: `DIRECT:${event.guild_id}` })
387
- .add({ tag: 'MESSAGE_CREATE' }).value);
388
- });
389
- client.on('INTERACTION_CREATE', async (event) => {
390
- try {
391
- await client.interactionResponse('group', event.id, 0);
392
- }
393
- catch (err) {
394
- createResult(ResultCode.Fail, 'interactionResponse failed', err?.response?.data ?? err?.message ?? err);
395
- }
396
- if (event.scene === 'group') {
397
- const UserAvatar = createUserAvatarURL(event.group_member_openid);
398
- const UserId = event.group_member_openid;
399
- const [isMaster, UserKey] = getMaster(UserId);
400
- const MessageText = event.data.resolved.button_data?.trim() || '';
401
- const e = FormatEvent.create('interaction.create')
402
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: false })
403
- .addGuild({ GuildId: event.group_openid, SpaceId: `GROUP:${event.group_openid}` })
404
- .addChannel({ ChannelId: event.group_openid })
405
- .addUser({
406
- UserId: event.group_member_openid,
407
- UserKey,
408
- UserAvatar: UserAvatar,
409
- IsMaster: isMaster,
410
- IsBot: false
411
- })
412
- .addMessage({ MessageId: event.id })
413
- .addText({ MessageText: MessageText })
414
- .addInteraction({
415
- InteractionId: event.id,
416
- InteractionData: JSON.stringify(event.data.resolved),
417
- Target: { scope: 'group', targetId: event.group_openid, BotId: botId }
418
- })
419
- .addOpen({ OpenId: `C2C:${event.group_member_openid}` })
420
- .add({ tag: 'INTERACTION_CREATE_GROUP' }).value;
421
- cbp.send(e);
422
- }
423
- else if (event.scene === 'c2c') {
424
- const UserAvatar = createUserAvatarURL(event.user_openid);
425
- const UserId = event.user_openid;
426
- const [isMaster, UserKey] = getMaster(UserId);
427
- const MessageText = event.data.resolved.button_data?.trim() || '';
428
- const e = FormatEvent.create('private.interaction.create')
429
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: true })
430
- .addUser({
431
- UserId: event.user_openid,
432
- UserKey,
433
- UserAvatar: UserAvatar,
434
- IsMaster: isMaster,
435
- IsBot: false
436
- })
437
- .addMessage({ MessageId: event.id })
438
- .addText({ MessageText: MessageText })
439
- .addInteraction({
440
- InteractionId: event.id,
441
- InteractionData: JSON.stringify(event.data.resolved),
442
- Target: { scope: 'c2c', targetId: event.user_openid, BotId: botId }
443
- })
444
- .addOpen({ OpenId: `C2C:${event.user_openid}` })
445
- .add({ tag: 'INTERACTION_CREATE_C2C' }).value;
446
- cbp.send(e);
447
- }
448
- else if (event.scene === 'guild') {
449
- const UserAvatar = createUserAvatarURL(event.data.resolved.user_id);
450
- const UserId = event.data.resolved.user_id;
451
- const [isMaster, UserKey] = getMaster(UserId);
452
- const MessageText = event.data.resolved.button_data?.trim() || '';
453
- const e = FormatEvent.create('interaction.create')
454
- .addPlatform({ Platform: platform, value: event, BotId: botId, IsAtMe: false, IsPrivate: false })
455
- .addGuild({ GuildId: event.guild_id, SpaceId: `GUILD:${event.channel_id}` })
456
- .addChannel({ ChannelId: event.channel_id })
457
- .addUser({ UserId: event.data.resolved.user_id, UserKey, UserAvatar: UserAvatar, IsMaster: isMaster, IsBot: false })
458
- .addMessage({ MessageId: event.data.resolved.message_id })
459
- .addText({ MessageText: MessageText })
460
- .addInteraction({
461
- InteractionId: event.id,
462
- InteractionData: JSON.stringify(event.data.resolved),
463
- Target: { scope: 'channel', targetId: event.channel_id, BotId: botId }
464
- })
465
- .addOpen({ OpenId: `DIRECT:${event.guild_id}` })
466
- .add({ tag: 'INTERACTION_CREATE_GUILD' }).value;
467
- cbp.send(e);
468
- }
469
- else {
470
- logger.warn({
471
- code: ResultCode.Fail,
472
- message: '暂未更新支持此类型的交互事件',
473
- data: event
474
- });
475
- }
476
- });
477
- client.on('MESSAGE_DELETE', event => {
478
- const msg = event?.message ?? event;
479
- cbp.send(FormatEvent.create('message.delete')
480
- .addPlatform({ Platform: platform, value: event, BotId: botId })
481
- .addGuild({ GuildId: msg?.guild_id ?? '', SpaceId: `GUILD:${msg?.channel_id ?? ''}` })
482
- .addChannel({ ChannelId: msg?.channel_id ?? '' })
483
- .addMessage({ MessageId: msg?.id ?? '' })
484
- .add({ tag: 'MESSAGE_DELETE' }).value);
485
- });
486
- client.on('PUBLIC_MESSAGE_DELETE', event => {
487
- const msg = event.message;
488
- cbp.send(FormatEvent.create('message.delete')
489
- .addPlatform({ Platform: platform, value: event, BotId: botId })
490
- .addGuild({ GuildId: msg.guild_id ?? '', SpaceId: `GUILD:${msg.channel_id ?? ''}` })
491
- .addChannel({ ChannelId: msg.channel_id ?? '' })
492
- .addMessage({ MessageId: msg.id ?? '' })
493
- .add({ tag: 'PUBLIC_MESSAGE_DELETE' }).value);
494
- });
495
- client.on('DIRECT_MESSAGE_DELETE', event => {
496
- const msg = event.message;
497
- cbp.send(FormatEvent.create('private.message.delete')
498
- .addPlatform({ Platform: platform, value: event, BotId: botId })
499
- .addMessage({ MessageId: msg.id ?? '' })
500
- .add({ tag: 'DIRECT_MESSAGE_DELETE' }).value);
501
- });
502
- client.on('MESSAGE_REACTION_ADD', event => {
503
- cbp.send(FormatEvent.create('message.reaction.add')
504
- .addPlatform({ Platform: platform, value: event, BotId: botId })
505
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.channel_id ?? ''}` })
506
- .addChannel({ ChannelId: event.channel_id ?? '' })
507
- .addMessage({ MessageId: event.target?.id ?? '' })
508
- .add({ tag: 'MESSAGE_REACTION_ADD' }).value);
509
- });
510
- client.on('MESSAGE_REACTION_REMOVE', event => {
511
- cbp.send(FormatEvent.create('message.reaction.remove')
512
- .addPlatform({ Platform: platform, value: event, BotId: botId })
513
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.channel_id ?? ''}` })
514
- .addChannel({ ChannelId: event.channel_id ?? '' })
515
- .addMessage({ MessageId: event.target?.id ?? '' })
516
- .add({ tag: 'MESSAGE_REACTION_REMOVE' }).value);
517
- });
518
- client.on('CHANNEL_CREATE', event => {
519
- cbp.send(FormatEvent.create('channel.create')
520
- .addPlatform({ Platform: platform, value: event, BotId: botId })
521
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.guild_id ?? ''}` })
522
- .addChannel({ ChannelId: event.id ?? '' })
523
- .add({ tag: 'CHANNEL_CREATE' }).value);
524
- });
525
- client.on('CHANNEL_DELETE', event => {
526
- cbp.send(FormatEvent.create('channel.delete')
527
- .addPlatform({ Platform: platform, value: event, BotId: botId })
528
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.guild_id ?? ''}` })
529
- .addChannel({ ChannelId: event.id ?? '' })
530
- .add({ tag: 'CHANNEL_DELETE' }).value);
531
- });
532
- client.on('GUILD_CREATE', event => {
533
- cbp.send(FormatEvent.create('guild.join')
534
- .addPlatform({ Platform: platform, value: event, BotId: botId })
535
- .addGuild({ GuildId: event.id ?? '', SpaceId: `GUILD:${event.id ?? ''}` })
536
- .addUser({ UserId: event.op_user_id ?? '', UserKey: '', IsMaster: false, IsBot: false })
537
- .add({ tag: 'GUILD_CREATE' }).value);
538
- });
539
- client.on('GUILD_DELETE', event => {
540
- cbp.send(FormatEvent.create('guild.exit')
541
- .addPlatform({ Platform: platform, value: event, BotId: botId })
542
- .addGuild({ GuildId: event.id ?? '', SpaceId: `GUILD:${event.id ?? ''}` })
543
- .addUser({ UserId: event.op_user_id ?? '', UserKey: '', IsMaster: false, IsBot: false })
544
- .add({ tag: 'GUILD_DELETE' }).value);
545
- });
546
- client.on('GUILD_MEMBER_ADD', event => {
547
- const UserId = event.user?.id ?? '';
548
- const [isMaster, UserKey] = getMaster(UserId);
549
- cbp.send(FormatEvent.create('member.add')
550
- .addPlatform({ Platform: platform, value: event, BotId: botId })
551
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.guild_id ?? ''}` })
552
- .addUser({ UserId: UserId, UserKey, UserName: event.user?.username ?? '', UserAvatar: createUserAvatarURL(UserId), IsMaster: isMaster, IsBot: false })
553
- .add({ tag: 'GUILD_MEMBER_ADD' }).value);
554
- });
555
- client.on('GUILD_MEMBER_REMOVE', event => {
556
- const UserId = event.user?.id ?? '';
557
- const [isMaster, UserKey] = getMaster(UserId);
558
- cbp.send(FormatEvent.create('member.remove')
559
- .addPlatform({ Platform: platform, value: event, BotId: botId })
560
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.guild_id ?? ''}` })
561
- .addUser({ UserId: UserId, UserKey, UserName: event.user?.username ?? '', UserAvatar: createUserAvatarURL(UserId), IsMaster: isMaster, IsBot: false })
562
- .add({ tag: 'GUILD_MEMBER_REMOVE' }).value);
563
- });
564
- client.on('GUILD_MEMBER_UPDATE', event => {
565
- const UserId = event.user?.id ?? '';
566
- const [isMaster, UserKey] = getMaster(UserId);
567
- cbp.send(FormatEvent.create('member.update')
568
- .addPlatform({ Platform: platform, value: event, BotId: botId })
569
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.guild_id ?? ''}` })
570
- .addUser({ UserId: UserId, UserKey, UserName: event.user?.username ?? '', UserAvatar: createUserAvatarURL(UserId), IsMaster: isMaster, IsBot: false })
571
- .add({ tag: 'GUILD_MEMBER_UPDATE' }).value);
572
- });
573
- client.on('FRIEND_ADD', event => {
574
- cbp.send(FormatEvent.create('private.friend.add')
575
- .addPlatform({ Platform: platform, value: event, BotId: botId })
576
- .addUser(createUserMeta(event.openid ?? ''))
577
- .add({ tag: 'FRIEND_ADD' }).value);
578
- });
579
- client.on('FRIEND_DEL', event => {
580
- cbp.send(FormatEvent.create('private.friend.remove')
581
- .addPlatform({ Platform: platform, value: event, BotId: botId })
582
- .addUser(createUserMeta(event.openid ?? ''))
583
- .add({ tag: 'FRIEND_DEL' }).value);
584
- });
585
- client.on('CHANNEL_UPDATE', event => {
586
- cbp.send(FormatEvent.create('channel.update')
587
- .addPlatform({ Platform: platform, value: event, BotId: botId })
588
- .addGuild({ GuildId: event.guild_id ?? '', SpaceId: `GUILD:${event.guild_id ?? ''}` })
589
- .addChannel({ ChannelId: event.id ?? '' })
590
- .add({ tag: 'CHANNEL_UPDATE' }).value);
591
- });
592
- client.on('GUILD_UPDATE', event => {
593
- cbp.send(FormatEvent.create('guild.update')
594
- .addPlatform({ Platform: platform, value: event, BotId: botId })
595
- .addGuild({ GuildId: event.id ?? '', SpaceId: `GUILD:${event.id ?? ''}` })
596
- .add({ tag: 'GUILD_UPDATE' }).value);
597
- });
598
- client.on('GROUP_MSG_RECEIVE', event => {
599
- cbp.send(FormatEvent.create('notice.create')
600
- .addPlatform({ Platform: platform, value: event, BotId: botId })
601
- .addGuild({ GuildId: event.group_openid, SpaceId: `GROUP:${event.group_openid}` })
602
- .addChannel({ ChannelId: event.group_openid })
603
- .addUser(createUserMeta(event.op_member_openid))
604
- .addMessage({ MessageId: `group_msg_receive_${event.group_openid}_${event.timestamp}` })
605
- .add({ tag: 'GROUP_MSG_RECEIVE' }).value);
606
- });
607
- client.on('GROUP_MSG_REJECT', event => {
608
- cbp.send(FormatEvent.create('notice.create')
609
- .addPlatform({ Platform: platform, value: event, BotId: botId })
610
- .addGuild({ GuildId: event.group_openid, SpaceId: `GROUP:${event.group_openid}` })
611
- .addChannel({ ChannelId: event.group_openid })
612
- .addUser(createUserMeta(event.op_member_openid))
613
- .addMessage({ MessageId: `group_msg_reject_${event.group_openid}_${event.timestamp}` })
614
- .add({ tag: 'GROUP_MSG_REJECT' }).value);
615
- });
616
- client.on('MESSAGE_AUDIT_PASS', event => {
617
- const meta = getGroupAuditMeta(event);
618
- cbp.send(FormatEvent.create('notice.create')
619
- .addPlatform({ Platform: platform, value: event, BotId: botId })
620
- .addGuild({ GuildId: meta.groupId, SpaceId: `GROUP:${meta.groupId}` })
621
- .addChannel({ ChannelId: meta.groupId })
622
- .addMessage({ MessageId: meta.messageId })
623
- .add({ tag: 'MESSAGE_AUDIT_PASS' }).value);
624
- });
625
- client.on('MESSAGE_AUDIT_REJECT', event => {
626
- const meta = getGroupAuditMeta(event);
627
- cbp.send(FormatEvent.create('notice.create')
628
- .addPlatform({ Platform: platform, value: event, BotId: botId })
629
- .addGuild({ GuildId: meta.groupId, SpaceId: `GROUP:${meta.groupId}` })
630
- .addChannel({ ChannelId: meta.groupId })
631
- .addMessage({ MessageId: meta.messageId })
632
- .add({ tag: 'MESSAGE_AUDIT_REJECT' }).value);
633
- });
634
- client.on('C2C_MSG_RECEIVE', event => {
635
- cbp.send(FormatEvent.create('private.notice.create')
636
- .addPlatform({ Platform: platform, value: event, BotId: botId })
637
- .addUser(createUserMeta(event.openid ?? ''))
638
- .addMessage({ MessageId: `c2c_msg_receive_${event.openid}_${event.timestamp}` })
639
- .add({ tag: 'C2C_MSG_RECEIVE' }).value);
640
- });
641
- client.on('C2C_MSG_REJECT', event => {
642
- cbp.send(FormatEvent.create('private.notice.create')
643
- .addPlatform({ Platform: platform, value: event, BotId: botId })
644
- .addUser(createUserMeta(event.openid ?? ''))
645
- .addMessage({ MessageId: `c2c_msg_reject_${event.openid}_${event.timestamp}` })
646
- .add({ tag: 'C2C_MSG_REJECT' }).value);
647
- });
648
- client.on('ERROR', console.error);
649
- const api = {
650
- active: {
651
- send: {
652
- target: async (target, val, replyId) => {
653
- if (!validateTargetBot(target)) {
654
- return [createResult(ResultCode.FailParams, `BotId ${target.BotId} is not active`, null)];
655
- }
656
- if (target.scope === 'group') {
657
- return GROUP_AT_MESSAGE_CREATE(client, { ChannelId: target.targetId, MessageId: replyId }, val);
658
- }
659
- if (target.scope === 'c2c') {
660
- return C2C_MESSAGE_CREATE(client, { UserId: target.targetId, MessageId: replyId }, val);
661
- }
662
- if (target.scope === 'channel') {
663
- return AT_MESSAGE_CREATE(client, { ChannelId: target.targetId, MessageId: replyId }, val);
664
- }
665
- if (target.scope === 'direct') {
666
- return DIRECT_MESSAGE_CREATE(client, { UserId: target.targetId, MessageId: replyId }, val);
667
- }
668
- return [createResult(ResultCode.FailParams, `Unsupported target scope: ${target.scope}`, null)];
669
- },
670
- channel: async (SpaceId, val) => {
671
- if (/^GUILD:/.test(SpaceId)) {
672
- const id = SpaceId.replace('GUILD:', '');
673
- return await AT_MESSAGE_CREATE(client, {
674
- ChannelId: id
675
- }, val);
676
- }
677
- if (/^GROUP:/.test(SpaceId)) {
678
- const id = SpaceId.replace('GROUP:', '');
679
- return await GROUP_AT_MESSAGE_CREATE(client, {
680
- ChannelId: id
681
- }, val);
682
- }
683
- return [];
684
- },
685
- user: async (OpenId, val) => {
686
- if (/^C2C:/.test(OpenId)) {
687
- const id = OpenId.replace('C2C:', '');
688
- return await C2C_MESSAGE_CREATE(client, {
689
- UserId: id
690
- }, val);
691
- }
692
- else if (/^DIRECT:/.test(OpenId)) {
693
- const id = OpenId.replace('DIRECT:', '');
694
- return await DIRECT_MESSAGE_CREATE(client, {
695
- UserId: id
696
- }, val);
697
- }
698
- else if (/^GUILD:/.test(OpenId)) {
699
- const id = OpenId.replace('GUILD:', '');
700
- return await AT_MESSAGE_CREATE(client, {
701
- ChannelId: id
702
- }, val);
703
- }
704
- return [];
705
- }
706
- }
707
- },
708
- use: {
709
- send: async (event, val, options) => {
710
- if (!val || val.length <= 0) {
711
- return [];
712
- }
713
- const tag = event._tag;
714
- if (tag === 'GROUP_AT_MESSAGE_CREATE') {
715
- return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
716
- }
717
- if (tag === 'GROUP_MESSAGE_CREATE') {
718
- return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
719
- }
720
- if (tag === 'C2C_MESSAGE_CREATE') {
721
- return await C2C_MESSAGE_CREATE(client, event, val, options);
722
- }
723
- if (tag === 'DIRECT_MESSAGE_CREATE') {
724
- return await DIRECT_MESSAGE_CREATE(client, event, val);
725
- }
726
- if (tag === 'AT_MESSAGE_CREATE') {
727
- return await AT_MESSAGE_CREATE(client, event, val);
728
- }
729
- if (tag === 'MESSAGE_CREATE') {
730
- return await MESSAGE_CREATE(client, event, val);
731
- }
732
- if (tag === 'INTERACTION_CREATE_GROUP') {
733
- return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
734
- }
735
- if (tag === 'INTERACTION_CREATE_C2C') {
736
- return await C2C_MESSAGE_CREATE(client, event, val, options);
737
- }
738
- if (tag === 'INTERACTION_CREATE_GUILD') {
739
- return await AT_MESSAGE_CREATE(client, event, val);
740
- }
741
- return [];
742
- },
743
- mention: event => {
744
- const value = event.value || {};
745
- const Metions = [];
746
- if (value.mentions) {
747
- const mentions = (event.value['mentions'] || []);
748
- const MessageMention = mentions.map(item => {
749
- const UserId = item.id;
750
- const [isMaster, UserKey] = getMaster(UserId);
751
- return {
752
- UserId: item.id,
753
- IsMaster: isMaster,
754
- UserName: item.username,
755
- IsBot: item.bot ?? false,
756
- UserKey: UserKey
757
- };
758
- });
759
- return new Promise(resolve => resolve(MessageMention));
760
- }
761
- else {
762
- return new Promise(resolve => resolve(Metions));
763
- }
764
- }
765
- }
766
- };
767
- const onactions = async (data, consume) => {
768
- const event = data.payload.event ?? {};
769
- const getGroupOpenId = () => data.payload.ChannelId ?? data.payload.params?.groupOpenId ?? data.payload.GuildId ?? event.ChannelId ?? event.GuildId ?? '';
770
- const getMemberOpenId = () => data.payload.params?.memberOpenId ?? data.payload.UserId ?? event.UserId ?? '';
771
- const getGuildId = () => data.payload.GuildId ?? event.GuildId ?? '';
772
- const getUserId = () => data.payload.UserId ?? event.UserId ?? '';
773
- const getChannelId = () => data.payload.ChannelId ?? event.ChannelId ?? '';
774
- try {
775
- if (data.action === 'me.info') {
776
- const res = await client.usersMe();
777
- const UserId = res.id;
778
- const [isMaster, UserKey] = getMaster(UserId);
779
- const botInfo = {
780
- UserId: res?.id,
781
- UserName: res?.username,
782
- UserAvatar: createUserAvatarURL(res?.id),
783
- IsBot: true,
784
- IsMaster: isMaster,
785
- UserKey: UserKey
786
- };
787
- consume([createResult(ResultCode.Ok, '请求完成', botInfo)]);
788
- }
789
- else if (data.action === 'message.send') {
790
- const event = data.payload.event;
791
- const paramFormat = data.payload.params.format;
792
- const options = data.payload.params?.forceVerifyImageResource !== undefined ? { forceVerifyImageResource: data.payload.params.forceVerifyImageResource } : undefined;
793
- const res = await api.use.send(event, paramFormat, options);
794
- consume(res);
795
- }
796
- else if (data.action === 'mention.get') {
797
- const event = data.payload.event;
798
- const metions = await api.use.mention(event);
799
- consume([createResult(ResultCode.Ok, '请求完成', metions)]);
800
- }
801
- else if (data.action === 'message.send.channel') {
802
- const channelId = data.payload.ChannelId;
803
- const paramFormat = data.payload.params.format;
804
- const res = await api.active.send.channel(channelId, paramFormat);
805
- consume(res);
806
- }
807
- else if (data.action === 'message.send.user') {
808
- const userId = data.payload.UserId;
809
- const paramFormat = data.payload.params.format;
810
- const res = await api.active.send.user(userId, paramFormat);
811
- consume(res);
812
- }
813
- else if (data.action === 'message.send.target') {
814
- const target = normalizeTarget(data.payload.target);
815
- if (!target) {
816
- consume([createResult(ResultCode.FailParams, 'message.send.target 缺少 target', null)]);
817
- return;
818
- }
819
- const res = await api.active.send.target(target, data.payload.params?.format || [], data.payload.params?.replyId);
820
- consume(res);
821
- }
822
- else if (data.action === 'message.delete') {
823
- const messageId = data.payload.MessageId;
824
- const params = data.payload.params ?? {};
825
- const target = normalizeTarget(data.payload.target);
826
- if (target && !validateTargetBot(target)) {
827
- consume([createResult(ResultCode.FailParams, `BotId ${target.BotId} is not active`, null)]);
828
- return;
829
- }
830
- const scope = target?.scope ?? params.scope ?? params.messageType;
831
- const request = scope === 'group'
832
- ? client.grouMessageDelte(String(target?.targetId ?? params.groupId ?? data.payload.GroupId ?? data.payload.ChannelId), messageId)
833
- : scope === 'user' || scope === 'c2c'
834
- ? client.userMessageDelete(String(target?.targetId ?? params.userId ?? data.payload.UserId), messageId)
835
- : scope === 'direct'
836
- ? client.dmsMessageDelete(String(target?.targetId ?? params.guildId ?? data.payload.GuildId ?? data.payload.ChannelId), messageId)
837
- : client.channelsMessagesDelete(target?.targetId ?? data.payload.ChannelId, messageId);
838
- const res = await request.then(r => createResult(ResultCode.Ok, data.action, r)).catch(err => createResult(ResultCode.Fail, data.action, err));
839
- consume([res]);
840
- }
841
- else if (data.action === 'interaction.ack') {
842
- const params = data.payload.params ?? {};
843
- const interactionId = String(params.interactionId ?? data.payload.InteractionId ?? '');
844
- const mode = data.payload.target?.scope === 'channel' || data.payload.target?.scope === 'direct' || params.mode === 'guild' ? 'guild' : 'group';
845
- if (!interactionId) {
846
- consume([createResult(ResultCode.Fail, 'interaction.ack 缺少 InteractionId', null)]);
847
- return;
848
- }
849
- const res = await client
850
- .interactionResponse(mode, interactionId, params.code)
851
- .then(r => createResult(ResultCode.Ok, data.action, r))
852
- .catch(err => createResult(ResultCode.Fail, data.action, err));
853
- consume([res]);
854
- consume([res]);
855
- }
856
- else if (data.action === 'message.pin') {
857
- const res = await client
858
- .channelsPinsPut(getChannelId(), data.payload.MessageId)
859
- .then(r => createResult(ResultCode.Ok, data.action, r))
860
- .catch(err => createResult(ResultCode.Fail, data.action, err));
861
- consume([res]);
862
- }
863
- else if (data.action === 'message.unpin') {
864
- const res = await client
865
- .channelsPinsDelete(getChannelId(), data.payload.MessageId)
866
- .then(r => createResult(ResultCode.Ok, data.action, r))
867
- .catch(err => createResult(ResultCode.Fail, data.action, err));
868
- consume([res]);
869
- }
870
- else if (data.action === 'reaction.add') {
871
- const res = await client
872
- .channelsMessagesReactionsPut(getChannelId(), data.payload.MessageId, 1, data.payload.EmojiId)
873
- .then(r => createResult(ResultCode.Ok, data.action, r))
874
- .catch(err => createResult(ResultCode.Fail, data.action, err));
875
- consume([res]);
876
- }
877
- else if (data.action === 'reaction.remove') {
878
- const res = await client
879
- .channelsMessagesReactionsDelete(getChannelId(), data.payload.MessageId, 1, data.payload.EmojiId)
880
- .then(r => createResult(ResultCode.Ok, data.action, r))
881
- .catch(err => createResult(ResultCode.Fail, data.action, err));
882
- consume([res]);
883
- }
884
- else if (data.action === 'message.get') {
885
- const res = await client
886
- .channelsMessagesById(getChannelId(), data.payload.MessageId)
887
- .then(r => createResult(ResultCode.Ok, data.action, r))
888
- .catch(err => createResult(ResultCode.Fail, data.action, err));
889
- consume([res]);
890
- }
891
- else if (data.action === 'interaction.response') {
892
- const interactionId = data.payload.interaction_id;
893
- const code = data.payload.code ?? 0;
894
- const res = await client
895
- .interactionResponse('group', interactionId, code)
896
- .then(r => createResult(ResultCode.Ok, data.action, r))
897
- .catch(err => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err));
898
- consume([res]);
899
- }
900
- else if (data.action === 'member.info') {
901
- const guildId = data.payload.params?.guildId ?? getGuildId();
902
- const userId = data.payload.params?.userId ?? getUserId();
903
- const res = await client
904
- .guildsMembersMessage(guildId, userId)
905
- .then(r => createResult(ResultCode.Ok, data.action, r))
906
- .catch(err => createResult(ResultCode.Fail, data.action, err));
907
- consume([res]);
908
- }
909
- else if (data.action === 'member.list') {
910
- const guildId = getGuildId();
911
- const after = data.payload.params?.After ?? '0';
912
- const limit = data.payload.params?.Limit ?? 100;
913
- const res = await client
914
- .guildsMembers(guildId, { after, limit })
915
- .then(r => createResult(ResultCode.Ok, data.action, r))
916
- .catch(err => createResult(ResultCode.Fail, data.action, err));
917
- consume([res]);
918
- }
919
- else if (data.action === 'member.kick') {
920
- const res = await client
921
- .guildsMembersDelete(getGuildId(), getUserId())
922
- .then(r => createResult(ResultCode.Ok, data.action, r))
923
- .catch(err => createResult(ResultCode.Fail, data.action, err));
924
- consume([res]);
925
- }
926
- else if (data.action === 'member.ban') {
927
- const guildId = getGuildId();
928
- const userId = getUserId();
929
- const duration = data.payload.params?.duration ?? 0;
930
- const mute_seconds = String(duration > 0 ? duration : 604800);
931
- const res = await client
932
- .guildsMemberMute(guildId, userId, { mute_seconds })
933
- .then(r => createResult(ResultCode.Ok, data.action, r))
934
- .catch(err => createResult(ResultCode.Fail, data.action, err));
935
- consume([res]);
936
- }
937
- else if (data.action === 'member.unban') {
938
- const res = await client
939
- .guildsMemberMute(getGuildId(), getUserId(), { mute_seconds: '0' })
940
- .then(r => createResult(ResultCode.Ok, data.action, r))
941
- .catch(err => createResult(ResultCode.Fail, data.action, err));
942
- consume([res]);
943
- }
944
- else if (data.action === 'member.mute') {
945
- const guildId = getGuildId();
946
- const userId = getUserId();
947
- const duration = data.payload.params?.duration ?? 0;
948
- const mute_seconds = String(duration);
949
- const res = await client
950
- .guildsMemberMute(guildId, userId, { mute_seconds })
951
- .then(r => createResult(ResultCode.Ok, data.action, r))
952
- .catch(err => createResult(ResultCode.Fail, data.action, err));
953
- consume([res]);
954
- }
955
- else if (data.action === 'guild.info') {
956
- const res = await client
957
- .guilds(getGuildId())
958
- .then(r => createResult(ResultCode.Ok, data.action, r))
959
- .catch(err => createResult(ResultCode.Fail, data.action, err));
960
- consume([res]);
961
- }
962
- else if (data.action === 'guild.list') {
963
- const res = await client
964
- .usersMeGuilds({ before: '', after: '', limit: 100 })
965
- .then(r => createResult(ResultCode.Ok, data.action, r))
966
- .catch(err => createResult(ResultCode.Fail, data.action, err));
967
- consume([res]);
968
- }
969
- else if (data.action === 'guild.mute') {
970
- const guildId = getGuildId();
971
- const duration = data.payload.params?.duration ?? 0;
972
- const mute_seconds = String(duration);
973
- const res = await client
974
- .guildsMuteAll(guildId, { mute_seconds })
975
- .then(r => createResult(ResultCode.Ok, data.action, r))
976
- .catch(err => createResult(ResultCode.Fail, data.action, err));
977
- consume([res]);
978
- }
979
- else if (data.action === 'group.info') {
980
- const res = await client
981
- .groupsInfo(getGroupOpenId())
982
- .then(r => createResult(ResultCode.Ok, data.action, r))
983
- .catch(err => createResult(ResultCode.Fail, data.action, err));
984
- consume([res]);
985
- }
986
- else if (data.action === 'group.botState') {
987
- const res = await client
988
- .groupsBotState(getGroupOpenId())
989
- .then(r => createResult(ResultCode.Ok, data.action, r))
990
- .catch(err => createResult(ResultCode.Fail, data.action, err));
991
- consume([res]);
992
- }
993
- else if (data.action === 'group.member.info') {
994
- const res = await client
995
- .groupsMembersMessage(getGroupOpenId(), getMemberOpenId())
996
- .then(r => createResult(ResultCode.Ok, data.action, r))
997
- .catch(err => createResult(ResultCode.Fail, data.action, err));
998
- consume([res]);
999
- }
1000
- else if (data.action === 'group.joinRequest.list') {
1001
- const params = data.payload.params ?? {};
1002
- const res = await client
1003
- .groupsJoinRequestList(getGroupOpenId(), { cursor: params.cursor, limit: params.limit })
1004
- .then(r => createResult(ResultCode.Ok, data.action, r))
1005
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1006
- consume([res]);
1007
- }
1008
- else if (data.action === 'group.joinRequest.approve') {
1009
- const params = data.payload.params ?? {};
1010
- const res = await client
1011
- .groupsApprovalJoinRequest(getGroupOpenId(), getMemberOpenId(), {
1012
- op: params.op,
1013
- join_request_id: params.joinRequestId,
1014
- reject_reason: params.rejectReason,
1015
- add_to_member_blacklist: params.addToMemberBlacklist
1016
- })
1017
- .then(r => createResult(ResultCode.Ok, data.action, r))
1018
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1019
- consume([res]);
1020
- }
1021
- else if (data.action === 'group.mute.setting') {
1022
- const res = await client
1023
- .groupsRestrictChatSetting(getGroupOpenId())
1024
- .then(r => createResult(ResultCode.Ok, data.action, r))
1025
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1026
- consume([res]);
1027
- }
1028
- else if (data.action === 'group.mute.set') {
1029
- const res = await client
1030
- .groupsRestrictChatSettingPost(getGroupOpenId(), { members: data.payload.params?.members })
1031
- .then(r => createResult(ResultCode.Ok, data.action, r))
1032
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1033
- consume([res]);
1034
- }
1035
- else if (data.action === 'group.strategy.list') {
1036
- const params = data.payload.params ?? {};
1037
- const res = await client
1038
- .groupsJoinApprovalStrategies({ cursor: params.cursor, limit: params.limit })
1039
- .then(r => createResult(ResultCode.Ok, data.action, r))
1040
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1041
- consume([res]);
1042
- }
1043
- else if (data.action === 'group.strategy.create') {
1044
- const params = data.payload.params ?? {};
1045
- const res = await client
1046
- .groupsJoinApprovalStrategyCreate({
1047
- group_openids: params.groupOpenIds,
1048
- group_ids: params.groupIds,
1049
- is_enable: params.isEnable,
1050
- expire_at: params.expireAt,
1051
- remark: params.remark
1052
- })
1053
- .then(r => createResult(ResultCode.Ok, data.action, r))
1054
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1055
- consume([res]);
1056
- }
1057
- else if (data.action === 'group.strategy.update') {
1058
- const params = data.payload.params ?? {};
1059
- const res = await client
1060
- .groupsJoinApprovalStrategyPatch(data.payload.StrategyId, {
1061
- is_enable: params.isEnable,
1062
- expire_at: params.expireAt,
1063
- group_action: params.groupAction,
1064
- remark: params.remark
1065
- })
1066
- .then(r => createResult(ResultCode.Ok, data.action, r))
1067
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1068
- consume([res]);
1069
- }
1070
- else if (data.action === 'group.strategy.delete') {
1071
- const res = await client
1072
- .groupsJoinApprovalStrategyDelete(data.payload.StrategyId)
1073
- .then(r => createResult(ResultCode.Ok, data.action, r))
1074
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1075
- consume([res]);
1076
- }
1077
- else if (data.action === 'group.strategy.execute') {
1078
- const res = await client
1079
- .groupsJoinApprovalStrategyExecute(data.payload.StrategyId)
1080
- .then(r => createResult(ResultCode.Ok, data.action, r))
1081
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1082
- consume([res]);
1083
- }
1084
- else if (data.action === 'group.strategy.whitelist') {
1085
- const params = data.payload.params ?? {};
1086
- const res = await client
1087
- .groupsJoinApprovalStrategyWhitelistUsers(data.payload.StrategyId, { op: params.op, whitelist_users: params.whitelistUsers })
1088
- .then(r => createResult(ResultCode.Ok, data.action, r))
1089
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1090
- consume([res]);
1091
- }
1092
- else if (data.action === 'channel.info') {
1093
- const res = await client
1094
- .channels(getChannelId())
1095
- .then(r => createResult(ResultCode.Ok, data.action, r))
1096
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1097
- consume([res]);
1098
- }
1099
- else if (data.action === 'channel.list') {
1100
- const res = await client
1101
- .guildsChannels(getGuildId())
1102
- .then(r => createResult(ResultCode.Ok, data.action, r))
1103
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1104
- consume([res]);
1105
- }
1106
- else if (data.action === 'channel.create') {
1107
- const guildId = getGuildId();
1108
- const params = data.payload.params;
1109
- const res = await client
1110
- .guildsChannelsCreate(guildId, { name: params.name, type: params.type ? Number(params.type) : 0, position: 0, parent_id: params.parentId ?? '' })
1111
- .then(r => createResult(ResultCode.Ok, data.action, r))
1112
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1113
- consume([res]);
1114
- }
1115
- else if (data.action === 'channel.update') {
1116
- const channelId = getChannelId();
1117
- const params = data.payload.params;
1118
- const res = await client
1119
- .guildsChannelsUpdate(channelId, { name: params.name ?? '', position: params.position ?? 0 })
1120
- .then(r => createResult(ResultCode.Ok, data.action, r))
1121
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1122
- consume([res]);
1123
- }
1124
- else if (data.action === 'channel.delete') {
1125
- const res = await client
1126
- .guildsChannelsdelete(getChannelId(), {})
1127
- .then(r => createResult(ResultCode.Ok, data.action, r))
1128
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1129
- consume([res]);
1130
- }
1131
- else if (data.action === 'role.list') {
1132
- const res = await client
1133
- .guildsRoles(getGuildId())
1134
- .then(r => createResult(ResultCode.Ok, data.action, r))
1135
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1136
- consume([res]);
1137
- }
1138
- else if (data.action === 'role.create') {
1139
- const params = data.payload.params;
1140
- const res = await client
1141
- .guildsRolesPost(getGuildId(), { name: params.name, color: params.color })
1142
- .then(r => createResult(ResultCode.Ok, data.action, r))
1143
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1144
- consume([res]);
1145
- }
1146
- else if (data.action === 'role.update') {
1147
- const params = data.payload.params;
1148
- const res = await client
1149
- .guildsRolesPatch(getGuildId(), data.payload.RoleId, { name: params.name, color: params.color })
1150
- .then(r => createResult(ResultCode.Ok, data.action, r))
1151
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1152
- consume([res]);
1153
- }
1154
- else if (data.action === 'role.delete') {
1155
- const res = await client
1156
- .guildsRolesDelete(getGuildId(), data.payload.RoleId)
1157
- .then(r => createResult(ResultCode.Ok, data.action, r))
1158
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1159
- consume([res]);
1160
- }
1161
- else if (data.action === 'role.assign') {
1162
- const res = await client
1163
- .guildsRolesMembersPut(getGuildId(), '', getUserId(), data.payload.RoleId)
1164
- .then(r => createResult(ResultCode.Ok, data.action, r))
1165
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1166
- consume([res]);
1167
- }
1168
- else if (data.action === 'role.remove') {
1169
- const res = await client
1170
- .guildsRolesMembersDelete(getGuildId(), '', getUserId(), data.payload.RoleId)
1171
- .then(r => createResult(ResultCode.Ok, data.action, r))
1172
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1173
- consume([res]);
1174
- }
1175
- else if (data.action === 'file.send.channel') {
1176
- const res = await client
1177
- .postRichMediaByGroup(getGroupOpenId(), {
1178
- file_type: data.payload.params?.file_type ?? 1,
1179
- url: data.payload.params?.url,
1180
- file_data: data.payload.params?.file_data,
1181
- srv_send_msg: data.payload.params?.srv_send_msg ?? false
1182
- })
1183
- .then(r => createResult(ResultCode.Ok, data.action, r))
1184
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1185
- consume([res]);
1186
- }
1187
- else if (data.action === 'file.send.user') {
1188
- const res = await client
1189
- .postRichMediaByUser(getUserId(), {
1190
- file_type: data.payload.params?.file_type ?? 1,
1191
- url: data.payload.params?.url,
1192
- file_data: data.payload.params?.file_data,
1193
- srv_send_msg: data.payload.params?.srv_send_msg ?? false
1194
- })
1195
- .then(r => createResult(ResultCode.Ok, data.action, r))
1196
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1197
- consume([res]);
1198
- }
1199
- else if (data.action === 'me.guilds') {
1200
- const res = await client
1201
- .usersMeGuilds({ before: '', after: '', limit: 100 })
1202
- .then(r => createResult(ResultCode.Ok, data.action, r))
1203
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1204
- consume([res]);
1205
- }
1206
- else if (data.action === 'media.send.channel') {
1207
- consume([createResult(ResultCode.Warn, 'media.send.channel not directly supported, use message.send with format', null)]);
1208
- }
1209
- else if (data.action === 'media.send.user') {
1210
- const userId = getUserId();
1211
- const params = data.payload.params;
1212
- const fileType = params?.type === 'image' ? 1 : params?.type === 'video' ? 2 : params?.type === 'audio' ? 3 : 4;
1213
- const res = await client
1214
- .postRichMediaByUser(userId, { file_type: fileType, url: params?.url, file_data: params?.data })
1215
- .then(r => createResult(ResultCode.Ok, data.action, r))
1216
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1217
- consume([res]);
1218
- }
1219
- else if (data.action === 'media.upload') {
1220
- const target = normalizeTarget(data.payload.target);
1221
- if (!target) {
1222
- consume([createResult(ResultCode.Warn, 'QQ media.upload requires target', null)]);
1223
- return;
1224
- }
1225
- const res = await uploadMedia(target, data.payload.params || {})
1226
- .then(value => createResult(ResultCode.Ok, data.action, value))
1227
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1228
- consume([res]);
1229
- }
1230
- else if (data.action === 'media.send') {
1231
- const target = normalizeTarget(data.payload.target);
1232
- if (!target) {
1233
- consume([createResult(ResultCode.FailParams, 'media.send 缺少 target', null)]);
1234
- return;
1235
- }
1236
- if (!validateTargetBot(target)) {
1237
- consume([createResult(ResultCode.FailParams, `BotId ${target.BotId} is not active`, null)]);
1238
- return;
1239
- }
1240
- const params = data.payload.params || {};
1241
- if (params.fileId) {
1242
- const send = target.scope === 'group'
1243
- ? client.groupOpenMessages(target.targetId, { msg_type: 7, content: params.content || '', media: { file_info: params.fileId } })
1244
- : target.scope === 'c2c'
1245
- ? client.usersOpenMessages(target.targetId, { msg_type: 7, content: params.content || '', media: { file_info: params.fileId } })
1246
- : null;
1247
- if (!send) {
1248
- consume([createResult(ResultCode.Warn, 'QQ media.send only supports group and c2c targets', null)]);
1249
- return;
1250
- }
1251
- const res = await send
1252
- .then(value => createResult(ResultCode.Ok, data.action, { id: value.id }))
1253
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1254
- consume([res]);
1255
- return;
1256
- }
1257
- const upload = await uploadMedia(target, params)
1258
- .then(value => value.fileId)
1259
- .catch(error => {
1260
- consume([createResult(ResultCode.Fail, data.action, error)]);
1261
- return null;
1262
- });
1263
- if (!upload) {
1264
- return;
1265
- }
1266
- await onactions({ action: 'media.send', payload: { target, params: { ...params, fileId: upload, url: undefined, data: undefined, filePath: undefined } } }, consume);
1267
- }
1268
- else if (data.action === 'connection.status') {
1269
- const status = client.getConnectionStatus();
1270
- consume([
1271
- createResult(ResultCode.Ok, data.action, {
1272
- Platform: platform,
1273
- state: status.state,
1274
- bots: [{ BotId: botId, ...status }]
1275
- })
1276
- ]);
1277
- }
1278
- else if (data.action === 'media.upload.prepare') {
1279
- const userId = getUserId();
1280
- const groupId = getGroupOpenId();
1281
- const res = await (userId ? client.usersUploadPrepare(userId, data.payload.params) : client.groupUploadPrepare(groupId, data.payload.params))
1282
- .then(r => createResult(ResultCode.Ok, data.action, r))
1283
- .catch(err => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err));
1284
- consume([res]);
1285
- }
1286
- else if (data.action === 'media.upload.part.finish') {
1287
- const userId = getUserId();
1288
- const groupId = getGroupOpenId();
1289
- const res = await (userId ? client.usersUploadPartFinish(userId, data.payload.params) : client.groupUploadPartFinish(groupId, data.payload.params))
1290
- .then(r => createResult(ResultCode.Ok, data.action, r))
1291
- .catch(err => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err));
1292
- consume([res]);
1293
- }
1294
- else if (data.action === 'media.upload.chunked') {
1295
- const userId = getUserId();
1296
- const groupId = getGroupOpenId();
1297
- const params = data.payload.params ?? {};
1298
- const res = await chunkedUpload(client, userId ? 'user' : 'group', userId || groupId, params.file ?? params.file_path, {
1299
- file_type: params.file_type ?? 1,
1300
- file_name: params.file_name,
1301
- srv_send_msg: params.srv_send_msg
1302
- })
1303
- .then(r => createResult(ResultCode.Ok, data.action, r))
1304
- .catch(err => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err));
1305
- consume([res]);
1306
- }
1307
- else if (data.action === 'stream.message.send') {
1308
- const res = await client
1309
- .streamMessages(getUserId(), data.payload.params ?? {})
1310
- .then(r => createResult(ResultCode.Ok, data.action, r))
1311
- .catch(err => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err));
1312
- consume([res]);
1313
- }
1314
- else if (data.action === 'message.input.notify') {
1315
- const params = data.payload.params ?? {};
1316
- const res = await client
1317
- .usersOpenMessages(getUserId(), {
1318
- msg_type: 6,
1319
- input_notify: { input_type: params.input_type ?? 1, input_second: params.input_second ?? 60 },
1320
- msg_seq: params.msg_seq,
1321
- msg_id: params.msg_id
1322
- })
1323
- .then(r => createResult(ResultCode.Ok, data.action, r))
1324
- .catch(err => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err));
1325
- consume([res]);
1326
- }
1327
- else if (data.action === 'permission.get') {
1328
- const res = await client
1329
- .channelsPermissions(getChannelId(), getUserId())
1330
- .then(r => createResult(ResultCode.Ok, data.action, r))
1331
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1332
- consume([res]);
1333
- }
1334
- else if (data.action === 'permission.set') {
1335
- const params = data.payload.params;
1336
- const res = await client
1337
- .channelsPermissionsPut(getChannelId(), getUserId(), params?.allow ?? '0', params?.deny ?? '0')
1338
- .then(r => createResult(ResultCode.Ok, data.action, r))
1339
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1340
- consume([res]);
1341
- }
1342
- else if (data.action === 'reaction.list') {
1343
- const res = await client
1344
- .channelsMessagesReactionsUsers(getChannelId(), data.payload.MessageId, 1, data.payload.EmojiId, { limit: data.payload.params?.limit ?? 20 })
1345
- .then(r => createResult(ResultCode.Ok, data.action, r))
1346
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1347
- consume([res]);
1348
- }
1349
- else if (data.action === 'channel.announce') {
1350
- const guildId = getGuildId();
1351
- const params = data.payload.params;
1352
- if (params?.remove) {
1353
- const res = await client
1354
- .guildsAnnouncesDelete(guildId, params?.messageId ?? 'all')
1355
- .then(r => createResult(ResultCode.Ok, data.action, r))
1356
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1357
- consume([res]);
1358
- }
1359
- else {
1360
- const res = await client
1361
- .guildsAnnounces(guildId, { message_id: params?.messageId, channel_id: params?.channelId })
1362
- .then(r => createResult(ResultCode.Ok, data.action, r))
1363
- .catch(err => createResult(ResultCode.Fail, data.action, err));
1364
- consume([res]);
1365
- }
1366
- }
1367
- else {
1368
- consume([createResult(ResultCode.Fail, '未知请求,请尝试升级版本', null)]);
1369
- }
1370
- }
1371
- catch (error) {
1372
- consume([createResult(ResultCode.Fail, '请求失败', error)]);
1373
- }
1374
- };
1375
- const onapis = async (data, consume) => {
1376
- const key = data.payload?.key;
1377
- const params = data.payload?.params;
1378
- try {
1379
- const keys = key.split('.');
1380
- let parent = null;
1381
- let target = client;
1382
- for (const k of keys) {
1383
- if (target === null || target === undefined || !(k in target)) {
1384
- consume([createResult(ResultCode.Fail, '未知请求,请尝试升级版本', null)]);
1385
- return;
1386
- }
1387
- parent = target;
1388
- target = target[k];
1389
- }
1390
- if (typeof target !== 'function') {
1391
- consume([createResult(ResultCode.Fail, '目标不是可调用方法', null)]);
1392
- return;
1393
- }
1394
- const res = await target.call(parent, ...params);
1395
- consume([createResult(ResultCode.Ok, '请求完成', res)]);
1396
- }
1397
- catch (error) {
1398
- consume([createResult(ResultCode.Fail, '请求失败', error)]);
1399
- }
1400
- };
1401
- if (options?.bindActions !== false) {
1402
- cbp.onactions((data, consume) => void onactions(data, consume));
1403
- cbp.onapis((data, consume) => void onapis(data, consume));
1404
- }
1405
- return { onAction: onactions, onApi: onapis };
43
+ const MAX_MEDIA_SIZE = 104857600;
44
+ const config = getQQBotConfig();
45
+ const botId = String(options?.botId ?? config?.app_id ?? "");
46
+ const url = `ws://127.0.0.1:${process.env?.port || config?.port || 17117}`;
47
+ const cbp = options?.cbp ?? cbpPlatform(url);
48
+ /**
49
+ * group
50
+ *
51
+ * GROUP_AT_MESSAGE_CREATE
52
+ * C2C_MESSAGE_CREATE
53
+ */
54
+ const createUserAvatarURL = (authorId) => {
55
+ return `https://q.qlogo.cn/qqapp/${botId}/${authorId}/640`;
56
+ };
57
+ const getGroupMessageMeta = (event) => {
58
+ const author = event?.author;
59
+ const UserId = author?.id ?? "";
60
+ const memberOpenId = author?.member_openid ?? "";
61
+ const groupId = event?.group_id ?? event?.group_openid ?? "";
62
+ const messageId = event?.id ?? "";
63
+ const [isMaster, UserKey] = UserId ? getMaster(UserId) : [false, ""];
64
+ return {
65
+ UserId,
66
+ UserKey,
67
+ isMaster,
68
+ UserName: author?.username ?? "",
69
+ UserAvatar: UserId ? createUserAvatarURL(UserId) : "",
70
+ groupId,
71
+ messageId,
72
+ openId: memberOpenId ? `C2C:${memberOpenId}` : ""
73
+ };
74
+ };
75
+ const getGroupAuditMeta = (event) => {
76
+ return {
77
+ groupId: event?.group_openid ?? "",
78
+ messageId: event?.message_id ?? event?.audit_id ?? "",
79
+ auditTime: event?.audit_time ?? ""
80
+ };
81
+ };
82
+ const getMediaItems = (attachments) => {
83
+ return (attachments || []).flatMap((attachment) => {
84
+ if (!attachment?.url) return [];
85
+ const mimeType = attachment.content_type || "";
86
+ return [{
87
+ Type: mimeType.startsWith("image/") ? "image" : mimeType.startsWith("audio/") ? "audio" : mimeType.startsWith("video/") ? "video" : "file",
88
+ Url: attachment.url,
89
+ ...attachment.filename && { FileName: attachment.filename },
90
+ ...typeof attachment.size === "number" && { FileSize: attachment.size },
91
+ ...mimeType && { MimeType: mimeType }
92
+ }];
93
+ });
94
+ };
95
+ const normalizeTarget = (target) => {
96
+ if (!target?.targetId || !target.scope) return;
97
+ return target;
98
+ };
99
+ const validateTargetBot = (target) => {
100
+ return !target.BotId || target.BotId === botId;
101
+ };
102
+ const mediaCache = /* @__PURE__ */ new Map();
103
+ const mediaType = (type) => type === "image" ? 1 : type === "video" ? 2 : type === "audio" ? 3 : 4;
104
+ const prepareMedia = async (target, params) => {
105
+ if ([
106
+ params?.url,
107
+ params?.data,
108
+ params?.filePath,
109
+ params?.fileId
110
+ ].filter((value) => value !== void 0 && value !== "").length !== 1) throw new Error("Provide exactly one media source: url, data, filePath, or fileId");
111
+ if (params.fileId) return {
112
+ fileId: String(params.fileId),
113
+ reused: true
114
+ };
115
+ let data = params.data;
116
+ let buffer;
117
+ let filePath;
118
+ let fileSize;
119
+ let hashes;
120
+ let name = params.name;
121
+ let hashSource = String(params.url || "");
122
+ if (params.filePath) {
123
+ const metadata = await stat(String(params.filePath));
124
+ if (!metadata.isFile()) throw new Error("media filePath must point to a regular file");
125
+ if (metadata.size > MAX_MEDIA_SIZE) throw new Error("QQ media files must not exceed 100 MiB");
126
+ filePath = String(params.filePath);
127
+ fileSize = metadata.size;
128
+ hashes = await client.getMediaFileHashes(filePath);
129
+ hashSource = hashes.sha256;
130
+ name ||= basename(filePath);
131
+ if (fileSize < 5242880) {
132
+ buffer = await readFile(filePath);
133
+ data = `base64://${buffer.toString("base64")}`;
134
+ }
135
+ } else if (data) {
136
+ hashSource = data;
137
+ const value = data.replace(/^base64:\/\//, "");
138
+ buffer = Buffer.from(value, "base64");
139
+ if (buffer.length > MAX_MEDIA_SIZE) throw new Error("QQ media files must not exceed 100 MiB");
140
+ }
141
+ const key = [
142
+ botId,
143
+ target.scope,
144
+ target.targetId,
145
+ params.type,
146
+ createHash("sha256").update(hashSource).digest("hex")
147
+ ].join(":");
148
+ const cached = mediaCache.get(key);
149
+ if (cached && (!cached.expiresAt || cached.expiresAt > Date.now())) return {
150
+ fileId: cached.fileId,
151
+ expiresAt: cached.expiresAt,
152
+ reused: true
153
+ };
154
+ return {
155
+ key,
156
+ url: params.url,
157
+ data,
158
+ buffer,
159
+ filePath,
160
+ fileSize,
161
+ hashes,
162
+ name,
163
+ reused: false
164
+ };
165
+ };
166
+ const uploadMedia = async (target, params) => {
167
+ if (!validateTargetBot(target)) throw new Error(`BotId ${target.BotId} is not active`);
168
+ if (target.scope !== "group" && target.scope !== "c2c") throw new Error("QQ media upload only supports group and c2c targets");
169
+ const prepared = await prepareMedia(target, params);
170
+ if (prepared.fileId) return prepared;
171
+ const fileType = mediaType(params.type);
172
+ const value = prepared.filePath && prepared.fileSize && prepared.fileSize >= 5242880 ? await client.postChunkedRichMedia({
173
+ scope: target.scope,
174
+ targetId: target.targetId,
175
+ fileType,
176
+ filePath: prepared.filePath,
177
+ size: prepared.fileSize,
178
+ hashes: prepared.hashes,
179
+ name: prepared.name
180
+ }) : prepared.buffer && prepared.buffer.length >= 5242880 ? await client.postChunkedRichMedia({
181
+ scope: target.scope,
182
+ targetId: target.targetId,
183
+ fileType,
184
+ data: prepared.buffer,
185
+ name: prepared.name
186
+ }) : target.scope === "group" ? await client.postRichMediaByGroup(target.targetId, {
187
+ file_type: fileType,
188
+ url: prepared.url,
189
+ file_data: prepared.data,
190
+ srv_send_msg: false
191
+ }) : await client.postRichMediaByUser(target.targetId, {
192
+ file_type: fileType,
193
+ url: prepared.url,
194
+ file_data: prepared.data,
195
+ srv_send_msg: false
196
+ });
197
+ const expiresAt = value.ttl ? Date.now() + value.ttl * 1e3 : void 0;
198
+ if (prepared.key) mediaCache.set(prepared.key, {
199
+ fileId: value.file_info,
200
+ expiresAt
201
+ });
202
+ return {
203
+ fileId: value.file_info,
204
+ expiresAt,
205
+ reused: false
206
+ };
207
+ };
208
+ const createUserMeta = (UserId, extra = {}) => {
209
+ const [IsMaster, UserKey] = getIdentity(UserId);
210
+ return {
211
+ UserId,
212
+ UserKey,
213
+ IsMaster,
214
+ IsBot: false,
215
+ ...extra
216
+ };
217
+ };
218
+ client.on("GROUP_ADD_ROBOT", (event) => {
219
+ cbp.send(FormatEvent.create("guild.join").addPlatform({
220
+ Platform: platform,
221
+ value: event,
222
+ BotId: botId
223
+ }).addGuild({
224
+ GuildId: event.group_openid,
225
+ SpaceId: `GROUP:${event.group_openid}`
226
+ }).addChannel({ ChannelId: event.group_openid }).addUser(createUserMeta(event.op_member_openid, { UserAvatar: createUserAvatarURL(event.op_member_openid) })).addMessage({ MessageId: event.id }).add({ tag: "GROUP_ADD_ROBOT" }).value);
227
+ });
228
+ client.on("GROUP_DEL_ROBOT", (event) => {
229
+ cbp.send(FormatEvent.create("guild.exit").addPlatform({
230
+ Platform: platform,
231
+ value: event,
232
+ BotId: botId
233
+ }).addGuild({
234
+ GuildId: event.group_openid,
235
+ SpaceId: `GROUP:${event.group_openid}`
236
+ }).addChannel({ ChannelId: event.group_openid }).addUser(createUserMeta(event.op_member_openid, { UserAvatar: createUserAvatarURL(event.op_member_openid) })).add({ tag: "GROUP_DEL_ROBOT" }).value);
237
+ });
238
+ client.on("GROUP_MESSAGE_CREATE", (event) => {
239
+ if (event?.author?.bot) return;
240
+ const msg = getMessageContent(event);
241
+ const meta = getGroupMessageMeta(event);
242
+ cbp.send(FormatEvent.create("message.create").addPlatform({
243
+ Platform: platform,
244
+ value: event,
245
+ BotId: botId,
246
+ IsAtMe: false,
247
+ IsPrivate: false
248
+ }).addGuild({
249
+ GuildId: meta.groupId,
250
+ SpaceId: `GROUP:${meta.groupId}`
251
+ }).addChannel({ ChannelId: meta.groupId }).addUser({
252
+ UserId: meta.UserId,
253
+ UserKey: meta.UserKey,
254
+ UserAvatar: meta.UserAvatar,
255
+ UserName: meta.UserName,
256
+ IsMaster: meta.isMaster,
257
+ IsBot: false
258
+ }).addMessage({ MessageId: meta.messageId }).addText({ MessageText: msg?.trim() }).addMedia({ MessageMedia: getMediaItems(event.attachments) }).addOpen({ OpenId: meta.openId }).add({ tag: "GROUP_MESSAGE_CREATE" }).value);
259
+ });
260
+ client.on("GROUP_MEMBER_ADD", (event) => {
261
+ const UserId = event.op_member_openid ?? event.member_openid ?? "";
262
+ const [isMaster, UserKey] = getMaster(UserId);
263
+ cbp.send(FormatEvent.create("member.add").addPlatform({
264
+ Platform: platform,
265
+ value: event,
266
+ BotId: botId
267
+ }).addGuild({
268
+ GuildId: event.group_openid ?? "",
269
+ SpaceId: `GROUP:${event.group_openid ?? ""}`
270
+ }).addChannel({ ChannelId: event.group_openid ?? "" }).addUser({
271
+ UserId,
272
+ UserKey,
273
+ UserName: event?.username ?? "",
274
+ UserAvatar: createUserAvatarURL(UserId),
275
+ IsMaster: isMaster,
276
+ IsBot: false
277
+ }).add({ tag: "GROUP_MEMBER_ADD" }).value);
278
+ });
279
+ client.on("GROUP_MEMBER_REMOVE", (event) => {
280
+ const UserId = event.op_member_openid ?? event.member_openid ?? "";
281
+ const [isMaster, UserKey] = getMaster(UserId);
282
+ cbp.send(FormatEvent.create("member.remove").addPlatform({
283
+ Platform: platform,
284
+ value: event,
285
+ BotId: botId
286
+ }).addGuild({
287
+ GuildId: event.group_openid ?? "",
288
+ SpaceId: `GROUP:${event.group_openid ?? ""}`
289
+ }).addChannel({ ChannelId: event.group_openid ?? "" }).addUser({
290
+ UserId,
291
+ UserKey,
292
+ UserName: event?.username ?? "",
293
+ UserAvatar: createUserAvatarURL(UserId),
294
+ IsMaster: isMaster,
295
+ IsBot: false
296
+ }).add({ tag: "GROUP_MEMBER_REMOVE" }).value);
297
+ });
298
+ client.on("GROUP_JOIN_REQUEST", (event) => {
299
+ const UserId = event.member_openid ?? "";
300
+ const [isMaster, UserKey] = getMaster(UserId);
301
+ cbp.send(FormatEvent.create("notice.create").addPlatform({
302
+ Platform: platform,
303
+ value: event,
304
+ BotId: botId
305
+ }).addGuild({
306
+ GuildId: event.group_openid ?? "",
307
+ SpaceId: `GROUP:${event.group_openid ?? ""}`
308
+ }).addChannel({ ChannelId: event.group_openid ?? "" }).addUser({
309
+ UserId,
310
+ UserKey,
311
+ UserName: event?.username ?? "",
312
+ UserAvatar: createUserAvatarURL(UserId),
313
+ IsMaster: isMaster,
314
+ IsBot: event.bot ?? false
315
+ }).addMessage({ MessageId: `group_join_request_${event.group_openid}_${event.join_request_id}` }).add({ tag: "GROUP_JOIN_REQUEST" }).value);
316
+ });
317
+ client.on("GROUP_AT_MESSAGE_CREATE", (event) => {
318
+ if (event?.author?.bot) return;
319
+ const msg = getMessageContent(event);
320
+ const meta = getGroupMessageMeta(event);
321
+ cbp.send(FormatEvent.create("message.create").addPlatform({
322
+ Platform: platform,
323
+ value: event,
324
+ BotId: botId,
325
+ IsAtMe: true,
326
+ IsPrivate: false
327
+ }).addGuild({
328
+ GuildId: meta.groupId,
329
+ SpaceId: `GROUP:${meta.groupId}`
330
+ }).addChannel({ ChannelId: meta.groupId }).addUser({
331
+ UserId: meta.UserId,
332
+ UserKey: meta.UserKey,
333
+ UserAvatar: meta.UserAvatar,
334
+ UserName: meta.UserName,
335
+ IsMaster: meta.isMaster,
336
+ IsBot: false
337
+ }).addMessage({ MessageId: meta.messageId }).addText({ MessageText: msg?.trim() }).addMedia({ MessageMedia: getMediaItems(event.attachments) }).addOpen({ OpenId: meta.openId }).add({ tag: "GROUP_AT_MESSAGE_CREATE" }).value);
338
+ });
339
+ client.on("C2C_MESSAGE_CREATE", (event) => {
340
+ const UserId = event.author.id;
341
+ const [isMaster, UserKey] = getMaster(UserId);
342
+ const UserAvatar = createUserAvatarURL(event.author.id);
343
+ cbp.send(FormatEvent.create("private.message.create").addPlatform({
344
+ Platform: platform,
345
+ value: event,
346
+ BotId: botId,
347
+ IsAtMe: false,
348
+ IsPrivate: true
349
+ }).addUser({
350
+ UserId: event.author.id,
351
+ UserKey,
352
+ UserAvatar,
353
+ UserName: event?.author?.username,
354
+ IsMaster: isMaster,
355
+ IsBot: false
356
+ }).addMessage({ MessageId: event.id }).addText({ MessageText: event.content?.trim() }).addMedia({ MessageMedia: getMediaItems(event.attachments) }).addOpen({ OpenId: `C2C:${event.author.user_openid}` }).add({ tag: "C2C_MESSAGE_CREATE" }).value);
357
+ });
358
+ /**
359
+ * guild
360
+ */
361
+ client.on("DIRECT_MESSAGE_CREATE", (event) => {
362
+ if (event?.author?.bot) return;
363
+ const msg = event?.content ?? "";
364
+ const UserAvatar = event?.author?.avatar;
365
+ const UserId = event.author.id;
366
+ const [isMaster, UserKey] = getMaster(UserId);
367
+ cbp.send(FormatEvent.create("private.message.create").addPlatform({
368
+ Platform: platform,
369
+ value: event,
370
+ BotId: botId,
371
+ IsAtMe: false,
372
+ IsPrivate: true
373
+ }).addUser({
374
+ UserId: event?.author?.id ?? "",
375
+ UserKey,
376
+ UserName: event?.author?.username ?? "",
377
+ UserAvatar,
378
+ IsMaster: isMaster,
379
+ IsBot: event.author?.bot
380
+ }).addMessage({ MessageId: event.id }).addText({ MessageText: msg?.trim() }).addMedia({ MessageMedia: getMediaItems(event.attachments) }).addOpen({ OpenId: `DIRECT:${event.guild_id}` }).add({ tag: "DIRECT_MESSAGE_CREATE" }).value);
381
+ });
382
+ client.on("AT_MESSAGE_CREATE", (event) => {
383
+ if (event?.author?.bot) return;
384
+ const msg = getMessageContent(event);
385
+ const UserAvatar = event?.author?.avatar;
386
+ const UserId = event.author.id;
387
+ const [isMaster, UserKey] = getMaster(UserId);
388
+ cbp.send(FormatEvent.create("message.create").addPlatform({
389
+ Platform: platform,
390
+ value: event,
391
+ BotId: botId,
392
+ IsAtMe: true,
393
+ IsPrivate: false
394
+ }).addGuild({
395
+ GuildId: event.guild_id,
396
+ SpaceId: `GUILD:${event.channel_id}`
397
+ }).addChannel({ ChannelId: event.channel_id }).addUser({
398
+ UserId: event?.author?.id ?? "",
399
+ UserKey,
400
+ UserName: event?.author?.username ?? "",
401
+ UserAvatar,
402
+ IsMaster: isMaster,
403
+ IsBot: event.author?.bot
404
+ }).addMessage({ MessageId: event.id }).addText({ MessageText: msg?.trim() }).addMedia({ MessageMedia: getMediaItems(event.attachments) }).addOpen({ OpenId: `DIRECT:${event.guild_id}` }).add({ tag: "AT_MESSAGE_CREATE" }).value);
405
+ });
406
+ /**
407
+ *
408
+ * @param event
409
+ * @returns
410
+ */
411
+ const getMessageContent = (event) => {
412
+ let msg = event?.content ?? "";
413
+ if (event?.mentions) for (const item of event.mentions) {
414
+ if (item?.id) {
415
+ msg = msg.replace(`<@!${item.id}>`, "").trim();
416
+ msg = msg.replace(`<@${item.id}>`, "").trim();
417
+ }
418
+ if (item?.username) msg = msg.replace(`[${item.username}]`, "").trim();
419
+ }
420
+ return msg;
421
+ };
422
+ client.on("MESSAGE_CREATE", (event) => {
423
+ if (event.author?.bot) return;
424
+ if ((/* @__PURE__ */ new RegExp(/DELETE$/)).test(event.eventType)) return;
425
+ const UserId = event.author.id;
426
+ const msg = getMessageContent(event);
427
+ const UserAvatar = event?.author?.avatar;
428
+ const [isMaster, UserKey] = getMaster(UserId);
429
+ cbp.send(FormatEvent.create("message.create").addPlatform({
430
+ Platform: platform,
431
+ value: event,
432
+ BotId: botId,
433
+ IsAtMe: false,
434
+ IsPrivate: false
435
+ }).addGuild({
436
+ GuildId: event.guild_id,
437
+ SpaceId: `GUILD:${event.channel_id}`
438
+ }).addChannel({ ChannelId: event.channel_id }).addUser({
439
+ UserId: event?.author?.id ?? "",
440
+ UserKey,
441
+ UserName: event?.author?.username ?? "",
442
+ UserAvatar,
443
+ IsMaster: isMaster,
444
+ IsBot: false
445
+ }).addMessage({ MessageId: event.id }).addText({ MessageText: msg?.trim() }).addMedia({ MessageMedia: getMediaItems(event.attachments) }).addOpen({ OpenId: `DIRECT:${event.guild_id}` }).add({ tag: "MESSAGE_CREATE" }).value);
446
+ });
447
+ client.on("INTERACTION_CREATE", async (event) => {
448
+ try {
449
+ await client.interactionResponse("group", event.id, 0);
450
+ } catch (err) {
451
+ createResult(ResultCode.Fail, "interactionResponse failed", err?.response?.data ?? err?.message ?? err);
452
+ }
453
+ if (event.scene === "group") {
454
+ const UserAvatar = createUserAvatarURL(event.group_member_openid);
455
+ const UserId = event.group_member_openid;
456
+ const [isMaster, UserKey] = getMaster(UserId);
457
+ const MessageText = event.data.resolved.button_data?.trim() || "";
458
+ const e = FormatEvent.create("interaction.create").addPlatform({
459
+ Platform: platform,
460
+ value: event,
461
+ BotId: botId,
462
+ IsAtMe: false,
463
+ IsPrivate: false
464
+ }).addGuild({
465
+ GuildId: event.group_openid,
466
+ SpaceId: `GROUP:${event.group_openid}`
467
+ }).addChannel({ ChannelId: event.group_openid }).addUser({
468
+ UserId: event.group_member_openid,
469
+ UserKey,
470
+ UserAvatar,
471
+ IsMaster: isMaster,
472
+ IsBot: false
473
+ }).addMessage({ MessageId: event.id }).addText({ MessageText }).addInteraction({
474
+ InteractionId: event.id,
475
+ InteractionData: JSON.stringify(event.data.resolved),
476
+ Target: {
477
+ scope: "group",
478
+ targetId: event.group_openid,
479
+ BotId: botId
480
+ }
481
+ }).addOpen({ OpenId: `C2C:${event.group_member_openid}` }).add({ tag: "INTERACTION_CREATE_GROUP" }).value;
482
+ cbp.send(e);
483
+ } else if (event.scene === "c2c") {
484
+ const UserAvatar = createUserAvatarURL(event.user_openid);
485
+ const UserId = event.user_openid;
486
+ const [isMaster, UserKey] = getMaster(UserId);
487
+ const MessageText = event.data.resolved.button_data?.trim() || "";
488
+ const e = FormatEvent.create("private.interaction.create").addPlatform({
489
+ Platform: platform,
490
+ value: event,
491
+ BotId: botId,
492
+ IsAtMe: false,
493
+ IsPrivate: true
494
+ }).addUser({
495
+ UserId: event.user_openid,
496
+ UserKey,
497
+ UserAvatar,
498
+ IsMaster: isMaster,
499
+ IsBot: false
500
+ }).addMessage({ MessageId: event.id }).addText({ MessageText }).addInteraction({
501
+ InteractionId: event.id,
502
+ InteractionData: JSON.stringify(event.data.resolved),
503
+ Target: {
504
+ scope: "c2c",
505
+ targetId: event.user_openid,
506
+ BotId: botId
507
+ }
508
+ }).addOpen({ OpenId: `C2C:${event.user_openid}` }).add({ tag: "INTERACTION_CREATE_C2C" }).value;
509
+ cbp.send(e);
510
+ } else if (event.scene === "guild") {
511
+ const UserAvatar = createUserAvatarURL(event.data.resolved.user_id);
512
+ const UserId = event.data.resolved.user_id;
513
+ const [isMaster, UserKey] = getMaster(UserId);
514
+ const MessageText = event.data.resolved.button_data?.trim() || "";
515
+ const e = FormatEvent.create("interaction.create").addPlatform({
516
+ Platform: platform,
517
+ value: event,
518
+ BotId: botId,
519
+ IsAtMe: false,
520
+ IsPrivate: false
521
+ }).addGuild({
522
+ GuildId: event.guild_id,
523
+ SpaceId: `GUILD:${event.channel_id}`
524
+ }).addChannel({ ChannelId: event.channel_id }).addUser({
525
+ UserId: event.data.resolved.user_id,
526
+ UserKey,
527
+ UserAvatar,
528
+ IsMaster: isMaster,
529
+ IsBot: false
530
+ }).addMessage({ MessageId: event.data.resolved.message_id }).addText({ MessageText }).addInteraction({
531
+ InteractionId: event.id,
532
+ InteractionData: JSON.stringify(event.data.resolved),
533
+ Target: {
534
+ scope: "channel",
535
+ targetId: event.channel_id,
536
+ BotId: botId
537
+ }
538
+ }).addOpen({ OpenId: `DIRECT:${event.guild_id}` }).add({ tag: "INTERACTION_CREATE_GUILD" }).value;
539
+ cbp.send(e);
540
+ } else logger.warn({
541
+ code: ResultCode.Fail,
542
+ message: "暂未更新支持此类型的交互事件",
543
+ data: event
544
+ });
545
+ });
546
+ client.on("MESSAGE_DELETE", (event) => {
547
+ const msg = event?.message ?? event;
548
+ cbp.send(FormatEvent.create("message.delete").addPlatform({
549
+ Platform: platform,
550
+ value: event,
551
+ BotId: botId
552
+ }).addGuild({
553
+ GuildId: msg?.guild_id ?? "",
554
+ SpaceId: `GUILD:${msg?.channel_id ?? ""}`
555
+ }).addChannel({ ChannelId: msg?.channel_id ?? "" }).addMessage({ MessageId: msg?.id ?? "" }).add({ tag: "MESSAGE_DELETE" }).value);
556
+ });
557
+ client.on("PUBLIC_MESSAGE_DELETE", (event) => {
558
+ const msg = event.message;
559
+ cbp.send(FormatEvent.create("message.delete").addPlatform({
560
+ Platform: platform,
561
+ value: event,
562
+ BotId: botId
563
+ }).addGuild({
564
+ GuildId: msg.guild_id ?? "",
565
+ SpaceId: `GUILD:${msg.channel_id ?? ""}`
566
+ }).addChannel({ ChannelId: msg.channel_id ?? "" }).addMessage({ MessageId: msg.id ?? "" }).add({ tag: "PUBLIC_MESSAGE_DELETE" }).value);
567
+ });
568
+ client.on("DIRECT_MESSAGE_DELETE", (event) => {
569
+ const msg = event.message;
570
+ cbp.send(FormatEvent.create("private.message.delete").addPlatform({
571
+ Platform: platform,
572
+ value: event,
573
+ BotId: botId
574
+ }).addMessage({ MessageId: msg.id ?? "" }).add({ tag: "DIRECT_MESSAGE_DELETE" }).value);
575
+ });
576
+ client.on("MESSAGE_REACTION_ADD", (event) => {
577
+ cbp.send(FormatEvent.create("message.reaction.add").addPlatform({
578
+ Platform: platform,
579
+ value: event,
580
+ BotId: botId
581
+ }).addGuild({
582
+ GuildId: event.guild_id ?? "",
583
+ SpaceId: `GUILD:${event.channel_id ?? ""}`
584
+ }).addChannel({ ChannelId: event.channel_id ?? "" }).addMessage({ MessageId: event.target?.id ?? "" }).add({ tag: "MESSAGE_REACTION_ADD" }).value);
585
+ });
586
+ client.on("MESSAGE_REACTION_REMOVE", (event) => {
587
+ cbp.send(FormatEvent.create("message.reaction.remove").addPlatform({
588
+ Platform: platform,
589
+ value: event,
590
+ BotId: botId
591
+ }).addGuild({
592
+ GuildId: event.guild_id ?? "",
593
+ SpaceId: `GUILD:${event.channel_id ?? ""}`
594
+ }).addChannel({ ChannelId: event.channel_id ?? "" }).addMessage({ MessageId: event.target?.id ?? "" }).add({ tag: "MESSAGE_REACTION_REMOVE" }).value);
595
+ });
596
+ client.on("CHANNEL_CREATE", (event) => {
597
+ cbp.send(FormatEvent.create("channel.create").addPlatform({
598
+ Platform: platform,
599
+ value: event,
600
+ BotId: botId
601
+ }).addGuild({
602
+ GuildId: event.guild_id ?? "",
603
+ SpaceId: `GUILD:${event.guild_id ?? ""}`
604
+ }).addChannel({ ChannelId: event.id ?? "" }).add({ tag: "CHANNEL_CREATE" }).value);
605
+ });
606
+ client.on("CHANNEL_DELETE", (event) => {
607
+ cbp.send(FormatEvent.create("channel.delete").addPlatform({
608
+ Platform: platform,
609
+ value: event,
610
+ BotId: botId
611
+ }).addGuild({
612
+ GuildId: event.guild_id ?? "",
613
+ SpaceId: `GUILD:${event.guild_id ?? ""}`
614
+ }).addChannel({ ChannelId: event.id ?? "" }).add({ tag: "CHANNEL_DELETE" }).value);
615
+ });
616
+ client.on("GUILD_CREATE", (event) => {
617
+ cbp.send(FormatEvent.create("guild.join").addPlatform({
618
+ Platform: platform,
619
+ value: event,
620
+ BotId: botId
621
+ }).addGuild({
622
+ GuildId: event.id ?? "",
623
+ SpaceId: `GUILD:${event.id ?? ""}`
624
+ }).addUser({
625
+ UserId: event.op_user_id ?? "",
626
+ UserKey: "",
627
+ IsMaster: false,
628
+ IsBot: false
629
+ }).add({ tag: "GUILD_CREATE" }).value);
630
+ });
631
+ client.on("GUILD_DELETE", (event) => {
632
+ cbp.send(FormatEvent.create("guild.exit").addPlatform({
633
+ Platform: platform,
634
+ value: event,
635
+ BotId: botId
636
+ }).addGuild({
637
+ GuildId: event.id ?? "",
638
+ SpaceId: `GUILD:${event.id ?? ""}`
639
+ }).addUser({
640
+ UserId: event.op_user_id ?? "",
641
+ UserKey: "",
642
+ IsMaster: false,
643
+ IsBot: false
644
+ }).add({ tag: "GUILD_DELETE" }).value);
645
+ });
646
+ client.on("GUILD_MEMBER_ADD", (event) => {
647
+ const UserId = event.user?.id ?? "";
648
+ const [isMaster, UserKey] = getMaster(UserId);
649
+ cbp.send(FormatEvent.create("member.add").addPlatform({
650
+ Platform: platform,
651
+ value: event,
652
+ BotId: botId
653
+ }).addGuild({
654
+ GuildId: event.guild_id ?? "",
655
+ SpaceId: `GUILD:${event.guild_id ?? ""}`
656
+ }).addUser({
657
+ UserId,
658
+ UserKey,
659
+ UserName: event.user?.username ?? "",
660
+ UserAvatar: createUserAvatarURL(UserId),
661
+ IsMaster: isMaster,
662
+ IsBot: false
663
+ }).add({ tag: "GUILD_MEMBER_ADD" }).value);
664
+ });
665
+ client.on("GUILD_MEMBER_REMOVE", (event) => {
666
+ const UserId = event.user?.id ?? "";
667
+ const [isMaster, UserKey] = getMaster(UserId);
668
+ cbp.send(FormatEvent.create("member.remove").addPlatform({
669
+ Platform: platform,
670
+ value: event,
671
+ BotId: botId
672
+ }).addGuild({
673
+ GuildId: event.guild_id ?? "",
674
+ SpaceId: `GUILD:${event.guild_id ?? ""}`
675
+ }).addUser({
676
+ UserId,
677
+ UserKey,
678
+ UserName: event.user?.username ?? "",
679
+ UserAvatar: createUserAvatarURL(UserId),
680
+ IsMaster: isMaster,
681
+ IsBot: false
682
+ }).add({ tag: "GUILD_MEMBER_REMOVE" }).value);
683
+ });
684
+ client.on("GUILD_MEMBER_UPDATE", (event) => {
685
+ const UserId = event.user?.id ?? "";
686
+ const [isMaster, UserKey] = getMaster(UserId);
687
+ cbp.send(FormatEvent.create("member.update").addPlatform({
688
+ Platform: platform,
689
+ value: event,
690
+ BotId: botId
691
+ }).addGuild({
692
+ GuildId: event.guild_id ?? "",
693
+ SpaceId: `GUILD:${event.guild_id ?? ""}`
694
+ }).addUser({
695
+ UserId,
696
+ UserKey,
697
+ UserName: event.user?.username ?? "",
698
+ UserAvatar: createUserAvatarURL(UserId),
699
+ IsMaster: isMaster,
700
+ IsBot: false
701
+ }).add({ tag: "GUILD_MEMBER_UPDATE" }).value);
702
+ });
703
+ client.on("FRIEND_ADD", (event) => {
704
+ cbp.send(FormatEvent.create("private.friend.add").addPlatform({
705
+ Platform: platform,
706
+ value: event,
707
+ BotId: botId
708
+ }).addUser(createUserMeta(event.openid ?? "")).addMessage({ MessageId: event.id }).add({ tag: "FRIEND_ADD" }).value);
709
+ });
710
+ client.on("FRIEND_DEL", (event) => {
711
+ cbp.send(FormatEvent.create("private.friend.remove").addPlatform({
712
+ Platform: platform,
713
+ value: event,
714
+ BotId: botId
715
+ }).addUser(createUserMeta(event.openid ?? "")).add({ tag: "FRIEND_DEL" }).value);
716
+ });
717
+ client.on("CHANNEL_UPDATE", (event) => {
718
+ cbp.send(FormatEvent.create("channel.update").addPlatform({
719
+ Platform: platform,
720
+ value: event,
721
+ BotId: botId
722
+ }).addGuild({
723
+ GuildId: event.guild_id ?? "",
724
+ SpaceId: `GUILD:${event.guild_id ?? ""}`
725
+ }).addChannel({ ChannelId: event.id ?? "" }).add({ tag: "CHANNEL_UPDATE" }).value);
726
+ });
727
+ client.on("GUILD_UPDATE", (event) => {
728
+ cbp.send(FormatEvent.create("guild.update").addPlatform({
729
+ Platform: platform,
730
+ value: event,
731
+ BotId: botId
732
+ }).addGuild({
733
+ GuildId: event.id ?? "",
734
+ SpaceId: `GUILD:${event.id ?? ""}`
735
+ }).add({ tag: "GUILD_UPDATE" }).value);
736
+ });
737
+ client.on("GROUP_MSG_RECEIVE", (event) => {
738
+ cbp.send(FormatEvent.create("notice.create").addPlatform({
739
+ Platform: platform,
740
+ value: event,
741
+ BotId: botId
742
+ }).addGuild({
743
+ GuildId: event.group_openid,
744
+ SpaceId: `GROUP:${event.group_openid}`
745
+ }).addChannel({ ChannelId: event.group_openid }).addUser(createUserMeta(event.op_member_openid)).addMessage({ MessageId: event.id }).add({ tag: "GROUP_MSG_RECEIVE" }).value);
746
+ });
747
+ client.on("GROUP_MSG_REJECT", (event) => {
748
+ cbp.send(FormatEvent.create("notice.create").addPlatform({
749
+ Platform: platform,
750
+ value: event,
751
+ BotId: botId
752
+ }).addGuild({
753
+ GuildId: event.group_openid,
754
+ SpaceId: `GROUP:${event.group_openid}`
755
+ }).addChannel({ ChannelId: event.group_openid }).addUser(createUserMeta(event.op_member_openid)).addMessage({ MessageId: `group_msg_reject_${event.group_openid}_${event.timestamp}` }).add({ tag: "GROUP_MSG_REJECT" }).value);
756
+ });
757
+ client.on("MESSAGE_AUDIT_PASS", (event) => {
758
+ const meta = getGroupAuditMeta(event);
759
+ cbp.send(FormatEvent.create("notice.create").addPlatform({
760
+ Platform: platform,
761
+ value: event,
762
+ BotId: botId
763
+ }).addGuild({
764
+ GuildId: meta.groupId,
765
+ SpaceId: `GROUP:${meta.groupId}`
766
+ }).addChannel({ ChannelId: meta.groupId }).addMessage({ MessageId: meta.messageId }).add({ tag: "MESSAGE_AUDIT_PASS" }).value);
767
+ });
768
+ client.on("MESSAGE_AUDIT_REJECT", (event) => {
769
+ const meta = getGroupAuditMeta(event);
770
+ cbp.send(FormatEvent.create("notice.create").addPlatform({
771
+ Platform: platform,
772
+ value: event,
773
+ BotId: botId
774
+ }).addGuild({
775
+ GuildId: meta.groupId,
776
+ SpaceId: `GROUP:${meta.groupId}`
777
+ }).addChannel({ ChannelId: meta.groupId }).addMessage({ MessageId: meta.messageId }).add({ tag: "MESSAGE_AUDIT_REJECT" }).value);
778
+ });
779
+ client.on("C2C_MSG_RECEIVE", (event) => {
780
+ cbp.send(FormatEvent.create("private.notice.create").addPlatform({
781
+ Platform: platform,
782
+ value: event,
783
+ BotId: botId
784
+ }).addUser(createUserMeta(event.openid ?? "")).addMessage({ MessageId: event.id }).add({ tag: "C2C_MSG_RECEIVE" }).value);
785
+ });
786
+ client.on("C2C_MSG_REJECT", (event) => {
787
+ cbp.send(FormatEvent.create("private.notice.create").addPlatform({
788
+ Platform: platform,
789
+ value: event,
790
+ BotId: botId
791
+ }).addUser(createUserMeta(event.openid ?? "")).addMessage({ MessageId: `c2c_msg_reject_${event.openid}_${event.timestamp}` }).add({ tag: "C2C_MSG_REJECT" }).value);
792
+ });
793
+ client.on("ERROR", console.error);
794
+ const api = {
795
+ active: { send: {
796
+ target: async (target, val, replyId) => {
797
+ if (!validateTargetBot(target)) return [createResult(ResultCode.FailParams, `BotId ${target.BotId} is not active`, null)];
798
+ if (target.scope === "group") return GROUP_AT_MESSAGE_CREATE(client, {
799
+ ChannelId: target.targetId,
800
+ MessageId: replyId
801
+ }, val);
802
+ if (target.scope === "c2c") return C2C_MESSAGE_CREATE(client, {
803
+ UserId: target.targetId,
804
+ MessageId: replyId
805
+ }, val);
806
+ if (target.scope === "channel") return AT_MESSAGE_CREATE(client, {
807
+ ChannelId: target.targetId,
808
+ MessageId: replyId
809
+ }, val);
810
+ if (target.scope === "direct") return DIRECT_MESSAGE_CREATE(client, {
811
+ UserId: target.targetId,
812
+ MessageId: replyId
813
+ }, val);
814
+ return [createResult(ResultCode.FailParams, `Unsupported target scope: ${target.scope}`, null)];
815
+ },
816
+ channel: async (SpaceId, val) => {
817
+ if (/^GUILD:/.test(SpaceId)) {
818
+ const id = SpaceId.replace("GUILD:", "");
819
+ return await AT_MESSAGE_CREATE(client, { ChannelId: id }, val);
820
+ }
821
+ if (/^GROUP:/.test(SpaceId)) {
822
+ const id = SpaceId.replace("GROUP:", "");
823
+ return await GROUP_AT_MESSAGE_CREATE(client, { ChannelId: id }, val);
824
+ }
825
+ return [];
826
+ },
827
+ user: async (OpenId, val) => {
828
+ if (/^C2C:/.test(OpenId)) {
829
+ const id = OpenId.replace("C2C:", "");
830
+ return await C2C_MESSAGE_CREATE(client, { UserId: id }, val);
831
+ } else if (/^DIRECT:/.test(OpenId)) {
832
+ const id = OpenId.replace("DIRECT:", "");
833
+ return await DIRECT_MESSAGE_CREATE(client, { UserId: id }, val);
834
+ } else if (/^GUILD:/.test(OpenId)) {
835
+ const id = OpenId.replace("GUILD:", "");
836
+ return await AT_MESSAGE_CREATE(client, { ChannelId: id }, val);
837
+ }
838
+ return [];
839
+ }
840
+ } },
841
+ use: {
842
+ send: async (event, val, options) => {
843
+ if (!val || val.length <= 0) return [];
844
+ const tag = event._tag;
845
+ if (tag === "GROUP_AT_MESSAGE_CREATE") return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
846
+ if (tag === "GROUP_MESSAGE_CREATE") return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
847
+ if (tag === "C2C_MESSAGE_CREATE") return await C2C_MESSAGE_CREATE(client, event, val, options);
848
+ if (tag === "DIRECT_MESSAGE_CREATE") return await DIRECT_MESSAGE_CREATE(client, event, val);
849
+ if (tag === "AT_MESSAGE_CREATE") return await AT_MESSAGE_CREATE(client, event, val);
850
+ if (tag === "MESSAGE_CREATE") return await MESSAGE_CREATE(client, event, val);
851
+ if (tag === "INTERACTION_CREATE_GROUP") return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
852
+ if (tag === "INTERACTION_CREATE_C2C") return await C2C_MESSAGE_CREATE(client, event, val, options);
853
+ if (tag === "INTERACTION_CREATE_GUILD") return await AT_MESSAGE_CREATE(client, event, val);
854
+ if (GROUP_EVENT_REPLY_TAGS.has(tag) && event.MessageId) return await GROUP_AT_MESSAGE_CREATE(client, event, val, options);
855
+ if (C2C_EVENT_REPLY_TAGS.has(tag) && event.MessageId) return await C2C_MESSAGE_CREATE(client, event, val, options);
856
+ if (GROUP_NOTICE_TAGS.has(tag) && event.ChannelId) return await GROUP_AT_MESSAGE_CREATE(client, { ChannelId: event.ChannelId }, val, options);
857
+ if (C2C_NOTICE_TAGS.has(tag) && event.UserId) return await C2C_MESSAGE_CREATE(client, { UserId: event.UserId }, val, options);
858
+ return [createResult(ResultCode.Fail, `message.send: unsupported event tag "${tag}"`, null)];
859
+ },
860
+ mention: (event) => {
861
+ const value = event.value || {};
862
+ const Metions = [];
863
+ if (value.mentions) {
864
+ const MessageMention = (event.value["mentions"] || []).map((item) => {
865
+ const UserId = item.id;
866
+ const [isMaster, UserKey] = getMaster(UserId);
867
+ return {
868
+ UserId: item.id,
869
+ IsMaster: isMaster,
870
+ UserName: item.username,
871
+ IsBot: item.bot ?? false,
872
+ UserKey
873
+ };
874
+ });
875
+ return new Promise((resolve) => resolve(MessageMention));
876
+ } else return new Promise((resolve) => resolve(Metions));
877
+ }
878
+ }
879
+ };
880
+ const onactions = async (data, consume) => {
881
+ const event = data.payload.event ?? {};
882
+ const getGroupOpenId = () => data.payload.ChannelId ?? data.payload.params?.groupOpenId ?? data.payload.GuildId ?? event.ChannelId ?? event.GuildId ?? "";
883
+ const getMemberOpenId = () => data.payload.params?.memberOpenId ?? data.payload.UserId ?? event.UserId ?? "";
884
+ const getGuildId = () => data.payload.GuildId ?? event.GuildId ?? "";
885
+ const getUserId = () => data.payload.UserId ?? event.UserId ?? "";
886
+ const getChannelId = () => data.payload.ChannelId ?? event.ChannelId ?? "";
887
+ try {
888
+ if (data.action === "me.info") {
889
+ const res = await client.usersMe();
890
+ const UserId = res.id;
891
+ const [isMaster, UserKey] = getMaster(UserId);
892
+ const botInfo = {
893
+ UserId: res?.id,
894
+ UserName: res?.username,
895
+ UserAvatar: createUserAvatarURL(res?.id),
896
+ IsBot: true,
897
+ IsMaster: isMaster,
898
+ UserKey
899
+ };
900
+ consume([createResult(ResultCode.Ok, "请求完成", botInfo)]);
901
+ } else if (data.action === "message.send") {
902
+ const event = data.payload.event;
903
+ const paramFormat = data.payload.params.format;
904
+ const options = data.payload.params?.forceVerifyImageResource !== void 0 ? { forceVerifyImageResource: data.payload.params.forceVerifyImageResource } : void 0;
905
+ consume(await api.use.send(event, paramFormat, options));
906
+ } else if (data.action === "mention.get") {
907
+ const event = data.payload.event;
908
+ const metions = await api.use.mention(event);
909
+ consume([createResult(ResultCode.Ok, "请求完成", metions)]);
910
+ } else if (data.action === "message.send.channel") {
911
+ const channelId = data.payload.ChannelId;
912
+ const paramFormat = data.payload.params.format;
913
+ consume(await api.active.send.channel(channelId, paramFormat));
914
+ } else if (data.action === "message.send.user") {
915
+ const userId = data.payload.UserId;
916
+ const paramFormat = data.payload.params.format;
917
+ consume(await api.active.send.user(userId, paramFormat));
918
+ } else if (data.action === "message.send.target") {
919
+ const target = normalizeTarget(data.payload.target);
920
+ if (!target) {
921
+ consume([createResult(ResultCode.FailParams, "message.send.target 缺少 target", null)]);
922
+ return;
923
+ }
924
+ consume(await api.active.send.target(target, data.payload.params?.format || [], data.payload.params?.replyId));
925
+ } else if (data.action === "message.delete") {
926
+ const messageId = data.payload.MessageId;
927
+ const params = data.payload.params ?? {};
928
+ const target = normalizeTarget(data.payload.target);
929
+ if (target && !validateTargetBot(target)) {
930
+ consume([createResult(ResultCode.FailParams, `BotId ${target.BotId} is not active`, null)]);
931
+ return;
932
+ }
933
+ const scope = target?.scope ?? params.scope ?? params.messageType;
934
+ consume([await (scope === "group" ? client.grouMessageDelte(String(target?.targetId ?? params.groupId ?? data.payload.GroupId ?? data.payload.ChannelId), messageId) : scope === "user" || scope === "c2c" ? client.userMessageDelete(String(target?.targetId ?? params.userId ?? data.payload.UserId), messageId) : scope === "direct" ? client.dmsMessageDelete(String(target?.targetId ?? params.guildId ?? data.payload.GuildId ?? data.payload.ChannelId), messageId) : client.channelsMessagesDelete(target?.targetId ?? data.payload.ChannelId, messageId)).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
935
+ } else if (data.action === "interaction.ack") {
936
+ const params = data.payload.params ?? {};
937
+ const interactionId = String(params.interactionId ?? data.payload.InteractionId ?? "");
938
+ const mode = data.payload.target?.scope === "channel" || data.payload.target?.scope === "direct" || params.mode === "guild" ? "guild" : "group";
939
+ if (!interactionId) {
940
+ consume([createResult(ResultCode.Fail, "interaction.ack 缺少 InteractionId", null)]);
941
+ return;
942
+ }
943
+ const res = await client.interactionResponse(mode, interactionId, params.code).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err));
944
+ consume([res]);
945
+ consume([res]);
946
+ } else if (data.action === "message.pin") consume([await client.channelsPinsPut(getChannelId(), data.payload.MessageId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
947
+ else if (data.action === "message.unpin") consume([await client.channelsPinsDelete(getChannelId(), data.payload.MessageId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
948
+ else if (data.action === "reaction.add") consume([await client.channelsMessagesReactionsPut(getChannelId(), data.payload.MessageId, 1, data.payload.EmojiId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
949
+ else if (data.action === "reaction.remove") consume([await client.channelsMessagesReactionsDelete(getChannelId(), data.payload.MessageId, 1, data.payload.EmojiId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
950
+ else if (data.action === "message.get") consume([await client.channelsMessagesById(getChannelId(), data.payload.MessageId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
951
+ else if (data.action === "interaction.response") {
952
+ const interactionId = data.payload.interaction_id;
953
+ const code = data.payload.code ?? 0;
954
+ consume([await client.interactionResponse("group", interactionId, code).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err))]);
955
+ } else if (data.action === "member.info") {
956
+ const guildId = data.payload.params?.guildId ?? getGuildId();
957
+ const userId = data.payload.params?.userId ?? getUserId();
958
+ consume([await client.guildsMembersMessage(guildId, userId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
959
+ } else if (data.action === "member.list") {
960
+ const guildId = getGuildId();
961
+ const after = data.payload.params?.After ?? "0";
962
+ const limit = data.payload.params?.Limit ?? 100;
963
+ consume([await client.guildsMembers(guildId, {
964
+ after,
965
+ limit
966
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
967
+ } else if (data.action === "member.kick") consume([await client.guildsMembersDelete(getGuildId(), getUserId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
968
+ else if (data.action === "member.ban") {
969
+ const guildId = getGuildId();
970
+ const userId = getUserId();
971
+ const duration = data.payload.params?.duration ?? 0;
972
+ const mute_seconds = String(duration > 0 ? duration : 604800);
973
+ consume([await client.guildsMemberMute(guildId, userId, { mute_seconds }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
974
+ } else if (data.action === "member.unban") consume([await client.guildsMemberMute(getGuildId(), getUserId(), { mute_seconds: "0" }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
975
+ else if (data.action === "member.mute") {
976
+ const guildId = getGuildId();
977
+ const userId = getUserId();
978
+ const duration = data.payload.params?.duration ?? 0;
979
+ const mute_seconds = String(duration);
980
+ consume([await client.guildsMemberMute(guildId, userId, { mute_seconds }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
981
+ } else if (data.action === "guild.info") consume([await client.guilds(getGuildId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
982
+ else if (data.action === "guild.list") consume([await client.usersMeGuilds({
983
+ before: "",
984
+ after: "",
985
+ limit: 100
986
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
987
+ else if (data.action === "guild.mute") {
988
+ const guildId = getGuildId();
989
+ const duration = data.payload.params?.duration ?? 0;
990
+ const mute_seconds = String(duration);
991
+ consume([await client.guildsMuteAll(guildId, { mute_seconds }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
992
+ } else if (data.action === "group.info") consume([await client.groupsInfo(getGroupOpenId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
993
+ else if (data.action === "group.botState") consume([await client.groupsBotState(getGroupOpenId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
994
+ else if (data.action === "group.member.info") consume([await client.groupsMembersMessage(getGroupOpenId(), getMemberOpenId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
995
+ else if (data.action === "group.joinRequest.list") {
996
+ const params = data.payload.params ?? {};
997
+ consume([await client.groupsJoinRequestList(getGroupOpenId(), {
998
+ cursor: params.cursor,
999
+ limit: params.limit
1000
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1001
+ } else if (data.action === "group.joinRequest.approve") {
1002
+ const params = data.payload.params ?? {};
1003
+ consume([await client.groupsApprovalJoinRequest(getGroupOpenId(), getMemberOpenId(), {
1004
+ op: params.op,
1005
+ join_request_id: params.joinRequestId,
1006
+ reject_reason: params.rejectReason,
1007
+ add_to_member_blacklist: params.addToMemberBlacklist
1008
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1009
+ } else if (data.action === "group.mute.setting") consume([await client.groupsRestrictChatSetting(getGroupOpenId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1010
+ else if (data.action === "group.mute.set") consume([await client.groupsRestrictChatSettingPost(getGroupOpenId(), { members: data.payload.params?.members }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1011
+ else if (data.action === "group.strategy.list") {
1012
+ const params = data.payload.params ?? {};
1013
+ consume([await client.groupsJoinApprovalStrategies({
1014
+ cursor: params.cursor,
1015
+ limit: params.limit
1016
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1017
+ } else if (data.action === "group.strategy.create") {
1018
+ const params = data.payload.params ?? {};
1019
+ consume([await client.groupsJoinApprovalStrategyCreate({
1020
+ group_openids: params.groupOpenIds,
1021
+ group_ids: params.groupIds,
1022
+ is_enable: params.isEnable,
1023
+ expire_at: params.expireAt,
1024
+ remark: params.remark
1025
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1026
+ } else if (data.action === "group.strategy.update") {
1027
+ const params = data.payload.params ?? {};
1028
+ consume([await client.groupsJoinApprovalStrategyPatch(data.payload.StrategyId, {
1029
+ is_enable: params.isEnable,
1030
+ expire_at: params.expireAt,
1031
+ group_action: params.groupAction,
1032
+ remark: params.remark
1033
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1034
+ } else if (data.action === "group.strategy.delete") consume([await client.groupsJoinApprovalStrategyDelete(data.payload.StrategyId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1035
+ else if (data.action === "group.strategy.execute") consume([await client.groupsJoinApprovalStrategyExecute(data.payload.StrategyId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1036
+ else if (data.action === "group.strategy.whitelist") {
1037
+ const params = data.payload.params ?? {};
1038
+ consume([await client.groupsJoinApprovalStrategyWhitelistUsers(data.payload.StrategyId, {
1039
+ op: params.op,
1040
+ whitelist_users: params.whitelistUsers
1041
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1042
+ } else if (data.action === "channel.info") consume([await client.channels(getChannelId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1043
+ else if (data.action === "channel.list") consume([await client.guildsChannels(getGuildId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1044
+ else if (data.action === "channel.create") {
1045
+ const guildId = getGuildId();
1046
+ const params = data.payload.params;
1047
+ consume([await client.guildsChannelsCreate(guildId, {
1048
+ name: params.name,
1049
+ type: params.type ? Number(params.type) : 0,
1050
+ position: 0,
1051
+ parent_id: params.parentId ?? ""
1052
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1053
+ } else if (data.action === "channel.update") {
1054
+ const channelId = getChannelId();
1055
+ const params = data.payload.params;
1056
+ consume([await client.guildsChannelsUpdate(channelId, {
1057
+ name: params.name ?? "",
1058
+ position: params.position ?? 0
1059
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1060
+ } else if (data.action === "channel.delete") consume([await client.guildsChannelsdelete(getChannelId(), {}).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1061
+ else if (data.action === "role.list") consume([await client.guildsRoles(getGuildId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1062
+ else if (data.action === "role.create") {
1063
+ const params = data.payload.params;
1064
+ consume([await client.guildsRolesPost(getGuildId(), {
1065
+ name: params.name,
1066
+ color: params.color
1067
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1068
+ } else if (data.action === "role.update") {
1069
+ const params = data.payload.params;
1070
+ consume([await client.guildsRolesPatch(getGuildId(), data.payload.RoleId, {
1071
+ name: params.name,
1072
+ color: params.color
1073
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1074
+ } else if (data.action === "role.delete") consume([await client.guildsRolesDelete(getGuildId(), data.payload.RoleId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1075
+ else if (data.action === "role.assign") consume([await client.guildsRolesMembersPut(getGuildId(), "", getUserId(), data.payload.RoleId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1076
+ else if (data.action === "role.remove") consume([await client.guildsRolesMembersDelete(getGuildId(), "", getUserId(), data.payload.RoleId).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1077
+ else if (data.action === "file.send.channel") consume([await client.postRichMediaByGroup(getGroupOpenId(), {
1078
+ file_type: data.payload.params?.file_type ?? 1,
1079
+ url: data.payload.params?.url,
1080
+ file_data: data.payload.params?.file_data,
1081
+ srv_send_msg: data.payload.params?.srv_send_msg ?? false
1082
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1083
+ else if (data.action === "file.send.user") consume([await client.postRichMediaByUser(getUserId(), {
1084
+ file_type: data.payload.params?.file_type ?? 1,
1085
+ url: data.payload.params?.url,
1086
+ file_data: data.payload.params?.file_data,
1087
+ srv_send_msg: data.payload.params?.srv_send_msg ?? false
1088
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1089
+ else if (data.action === "me.guilds") consume([await client.usersMeGuilds({
1090
+ before: "",
1091
+ after: "",
1092
+ limit: 100
1093
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1094
+ else if (data.action === "media.send.channel") consume([createResult(ResultCode.Warn, "media.send.channel not directly supported, use message.send with format", null)]);
1095
+ else if (data.action === "media.send.user") {
1096
+ const userId = getUserId();
1097
+ const params = data.payload.params;
1098
+ const fileType = params?.type === "image" ? 1 : params?.type === "video" ? 2 : params?.type === "audio" ? 3 : 4;
1099
+ consume([await client.postRichMediaByUser(userId, {
1100
+ file_type: fileType,
1101
+ url: params?.url,
1102
+ file_data: params?.data
1103
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1104
+ } else if (data.action === "media.upload") {
1105
+ const target = normalizeTarget(data.payload.target);
1106
+ if (!target) {
1107
+ consume([createResult(ResultCode.Warn, "QQ media.upload requires target", null)]);
1108
+ return;
1109
+ }
1110
+ consume([await uploadMedia(target, data.payload.params || {}).then((value) => createResult(ResultCode.Ok, data.action, value)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1111
+ } else if (data.action === "media.send") {
1112
+ const target = normalizeTarget(data.payload.target);
1113
+ if (!target) {
1114
+ consume([createResult(ResultCode.FailParams, "media.send 缺少 target", null)]);
1115
+ return;
1116
+ }
1117
+ if (!validateTargetBot(target)) {
1118
+ consume([createResult(ResultCode.FailParams, `BotId ${target.BotId} is not active`, null)]);
1119
+ return;
1120
+ }
1121
+ const params = data.payload.params || {};
1122
+ if (params.fileId) {
1123
+ const send = target.scope === "group" ? client.groupOpenMessages(target.targetId, {
1124
+ msg_type: 7,
1125
+ content: params.content || "",
1126
+ media: { file_info: params.fileId }
1127
+ }) : target.scope === "c2c" ? client.usersOpenMessages(target.targetId, {
1128
+ msg_type: 7,
1129
+ content: params.content || "",
1130
+ media: { file_info: params.fileId }
1131
+ }) : null;
1132
+ if (!send) {
1133
+ consume([createResult(ResultCode.Warn, "QQ media.send only supports group and c2c targets", null)]);
1134
+ return;
1135
+ }
1136
+ consume([await send.then((value) => createResult(ResultCode.Ok, data.action, { id: value.id })).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1137
+ return;
1138
+ }
1139
+ const upload = await uploadMedia(target, params).then((value) => value.fileId).catch((error) => {
1140
+ consume([createResult(ResultCode.Fail, data.action, error)]);
1141
+ return null;
1142
+ });
1143
+ if (!upload) return;
1144
+ await onactions({
1145
+ action: "media.send",
1146
+ payload: {
1147
+ target,
1148
+ params: {
1149
+ ...params,
1150
+ fileId: upload,
1151
+ url: void 0,
1152
+ data: void 0,
1153
+ filePath: void 0
1154
+ }
1155
+ }
1156
+ }, consume);
1157
+ } else if (data.action === "connection.status") {
1158
+ const status = client.getConnectionStatus();
1159
+ consume([createResult(ResultCode.Ok, data.action, {
1160
+ Platform: platform,
1161
+ state: status.state,
1162
+ bots: [{
1163
+ BotId: botId,
1164
+ ...status
1165
+ }]
1166
+ })]);
1167
+ } else if (data.action === "media.upload.prepare") {
1168
+ const userId = getUserId();
1169
+ const groupId = getGroupOpenId();
1170
+ consume([await (userId ? client.usersUploadPrepare(userId, data.payload.params) : client.groupUploadPrepare(groupId, data.payload.params)).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err))]);
1171
+ } else if (data.action === "media.upload.part.finish") {
1172
+ const userId = getUserId();
1173
+ const groupId = getGroupOpenId();
1174
+ consume([await (userId ? client.usersUploadPartFinish(userId, data.payload.params) : client.groupUploadPartFinish(groupId, data.payload.params)).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err))]);
1175
+ } else if (data.action === "media.upload.chunked") {
1176
+ const userId = getUserId();
1177
+ const groupId = getGroupOpenId();
1178
+ const params = data.payload.params ?? {};
1179
+ consume([await chunkedUpload(client, userId ? "user" : "group", userId || groupId, params.file ?? params.file_path, {
1180
+ file_type: params.file_type ?? 1,
1181
+ file_name: params.file_name,
1182
+ srv_send_msg: params.srv_send_msg
1183
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err))]);
1184
+ } else if (data.action === "stream.message.send") consume([await client.streamMessages(getUserId(), data.payload.params ?? {}).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err))]);
1185
+ else if (data.action === "message.input.notify") {
1186
+ const params = data.payload.params ?? {};
1187
+ consume([await client.usersOpenMessages(getUserId(), {
1188
+ msg_type: 6,
1189
+ input_notify: {
1190
+ input_type: params.input_type ?? 1,
1191
+ input_second: params.input_second ?? 60
1192
+ },
1193
+ msg_seq: params.msg_seq,
1194
+ msg_id: params.msg_id
1195
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err?.response?.data ?? err?.message ?? err))]);
1196
+ } else if (data.action === "permission.get") consume([await client.channelsPermissions(getChannelId(), getUserId()).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1197
+ else if (data.action === "permission.set") {
1198
+ const params = data.payload.params;
1199
+ consume([await client.channelsPermissionsPut(getChannelId(), getUserId(), params?.allow ?? "0", params?.deny ?? "0").then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1200
+ } else if (data.action === "reaction.list") consume([await client.channelsMessagesReactionsUsers(getChannelId(), data.payload.MessageId, 1, data.payload.EmojiId, { limit: data.payload.params?.limit ?? 20 }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1201
+ else if (data.action === "channel.announce") {
1202
+ const guildId = getGuildId();
1203
+ const params = data.payload.params;
1204
+ if (params?.remove) consume([await client.guildsAnnouncesDelete(guildId, params?.messageId ?? "all").then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1205
+ else consume([await client.guildsAnnounces(guildId, {
1206
+ message_id: params?.messageId,
1207
+ channel_id: params?.channelId
1208
+ }).then((r) => createResult(ResultCode.Ok, data.action, r)).catch((err) => createResult(ResultCode.Fail, data.action, err))]);
1209
+ } else consume([createResult(ResultCode.Fail, "未知请求,请尝试升级版本", null)]);
1210
+ } catch (error) {
1211
+ consume([createResult(ResultCode.Fail, "请求失败", error)]);
1212
+ }
1213
+ };
1214
+ const onapis = async (data, consume) => {
1215
+ const key = data.payload?.key;
1216
+ const params = data.payload?.params;
1217
+ try {
1218
+ const keys = key.split(".");
1219
+ let parent = null;
1220
+ let target = client;
1221
+ for (const k of keys) {
1222
+ if (target === null || target === void 0 || !(k in target)) {
1223
+ consume([createResult(ResultCode.Fail, "未知请求,请尝试升级版本", null)]);
1224
+ return;
1225
+ }
1226
+ parent = target;
1227
+ target = target[k];
1228
+ }
1229
+ if (typeof target !== "function") {
1230
+ consume([createResult(ResultCode.Fail, "目标不是可调用方法", null)]);
1231
+ return;
1232
+ }
1233
+ const res = await target.call(parent, ...params);
1234
+ consume([createResult(ResultCode.Ok, "请求完成", res)]);
1235
+ } catch (error) {
1236
+ consume([createResult(ResultCode.Fail, "请求失败", error)]);
1237
+ }
1238
+ };
1239
+ if (options?.bindActions !== false) {
1240
+ cbp.onactions((data, consume) => void onactions(data, consume));
1241
+ cbp.onapis((data, consume) => void onapis(data, consume));
1242
+ }
1243
+ return {
1244
+ onAction: onactions,
1245
+ onApi: onapis
1246
+ };
1406
1247
  };
1407
1248
 
1408
- export { register };
1249
+ //#endregion
1250
+ export { register };