@satorijs/adapter-discord 3.2.6 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -23,12 +23,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
23
23
  ));
24
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
25
 
26
- // satori/adapters/discord/src/index.ts
26
+ // adapters/discord/src/index.ts
27
27
  var src_exports = {};
28
28
  __export(src_exports, {
29
29
  Discord: () => types_exports,
30
30
  DiscordBot: () => DiscordBot,
31
- Sender: () => Sender,
31
+ DiscordModulator: () => DiscordModulator,
32
32
  WsClient: () => WsClient,
33
33
  adaptAuthor: () => adaptAuthor,
34
34
  adaptChannel: () => adaptChannel,
@@ -41,10 +41,10 @@ __export(src_exports, {
41
41
  });
42
42
  module.exports = __toCommonJS(src_exports);
43
43
 
44
- // satori/adapters/discord/src/bot.ts
44
+ // adapters/discord/src/bot.ts
45
45
  var import_satori4 = require("@satorijs/satori");
46
46
 
47
- // satori/adapters/discord/src/utils.ts
47
+ // adapters/discord/src/utils.ts
48
48
  var import_satori = require("@satorijs/satori");
49
49
  var adaptUser = /* @__PURE__ */ __name((user) => ({
50
50
  userId: user.id,
@@ -94,7 +94,7 @@ async function adaptMessage(bot, meta, session = {}) {
94
94
  });
95
95
  }
96
96
  if ((_c = meta.attachments) == null ? void 0 : _c.length) {
97
- session.content += meta.attachments.map((v) => {
97
+ session.content += " " + meta.attachments.map((v) => {
98
98
  var _a2, _b2, _c2;
99
99
  if (v.height && v.width && ((_a2 = v.content_type) == null ? void 0 : _a2.startsWith("image/"))) {
100
100
  return (0, import_satori.segment)("image", {
@@ -200,23 +200,13 @@ async function adaptSession(bot, input) {
200
200
  }
201
201
  __name(adaptSession, "adaptSession");
202
202
 
203
- // satori/adapters/discord/src/sender.ts
203
+ // adapters/discord/src/modulator.ts
204
204
  var import_satori2 = require("@satorijs/satori");
205
205
  var import_file_type = require("file-type");
206
206
  var import_form_data = __toESM(require("form-data"));
207
- var AggregateError = class extends Error {
208
- constructor(errors, message = "") {
209
- super(message);
210
- this.errors = errors;
211
- }
212
- };
213
- __name(AggregateError, "AggregateError");
214
- var Sender = class {
215
- constructor(bot, url) {
216
- this.bot = bot;
217
- this.url = url;
218
- this.results = [];
219
- this.errors = [];
207
+ var DiscordModulator = class extends import_satori2.Modulator {
208
+ constructor() {
209
+ super(...arguments);
220
210
  this.buffer = "";
221
211
  this.addition = {};
222
212
  this.figure = null;
@@ -224,8 +214,11 @@ var Sender = class {
224
214
  }
225
215
  async post(data, headers) {
226
216
  try {
227
- const result = await this.bot.http.post(this.url, data, { headers });
228
- this.results.push(result.id);
217
+ const result = await this.bot.http.post(`/channels/${this.channelId}/messages`, data, { headers });
218
+ const session = this.bot.session();
219
+ await adaptMessage(this.bot, result, session);
220
+ session.app.emit(session, "send", session);
221
+ this.results.push(session);
229
222
  } catch (e) {
230
223
  this.errors.push(e);
231
224
  }
@@ -279,7 +272,7 @@ var Sender = class {
279
272
  }
280
273
  }, sendDownload);
281
274
  }
282
- async sendBuffer() {
275
+ async flush() {
283
276
  const content = this.buffer.trim();
284
277
  if (!content)
285
278
  return;
@@ -287,97 +280,105 @@ var Sender = class {
287
280
  this.buffer = "";
288
281
  this.addition = {};
289
282
  }
290
- async render(elements) {
291
- for (const element of elements) {
292
- const { type, attrs, children } = element;
293
- if (type === "text") {
294
- this.buffer += attrs.content;
295
- } else if (type === "p") {
296
- await this.render(children);
297
- this.buffer += "\n";
298
- } else if (type === "at") {
299
- if (attrs.id) {
300
- this.buffer += `<@${attrs.id}>`;
301
- } else if (attrs.type === "all") {
302
- this.buffer += `@everyone`;
303
- } else if (attrs.type === "here") {
304
- this.buffer += `@here`;
305
- }
306
- } else if (type === "sharp" && attrs.id) {
307
- this.buffer += `<#${attrs.id}>`;
308
- } else if (type === "face" && attrs.name && attrs.id) {
309
- this.buffer += `<:${attrs.name}:${attrs.id}>`;
310
- } else if ((type === "image" || type === "video") && attrs.url) {
311
- if (this.mode === "figure") {
312
- this.figure = element;
313
- } else {
314
- await this.sendAsset(type, attrs, {
315
- ...this.addition,
316
- content: this.buffer.trim()
317
- });
318
- this.buffer = "";
319
- }
320
- } else if (type === "share") {
321
- await this.sendBuffer();
322
- await this.post({
323
- ...this.addition,
324
- embeds: [{ ...attrs }]
325
- });
326
- } else if (type === "record") {
327
- await this.sendAsset("file", attrs, {
283
+ async visit(element) {
284
+ const { type, attrs, children } = element;
285
+ if (type === "text") {
286
+ this.buffer += attrs.content.replace(/[\\*_`~|()]/g, "\\$&");
287
+ } else if (type === "b" || type === "strong") {
288
+ this.buffer += "**";
289
+ await this.render(children);
290
+ this.buffer += "**";
291
+ } else if (type === "i" || type === "em") {
292
+ this.buffer += "*";
293
+ await this.render(children);
294
+ this.buffer += "*";
295
+ } else if (type === "u" || type === "ins") {
296
+ this.buffer += "__";
297
+ await this.render(children);
298
+ this.buffer += "__";
299
+ } else if (type === "s" || type === "del") {
300
+ this.buffer += "~~";
301
+ await this.render(children);
302
+ this.buffer += "~~";
303
+ } else if (type === "spl") {
304
+ this.buffer += "||";
305
+ await this.render(children);
306
+ this.buffer += "||";
307
+ } else if (type === "code") {
308
+ this.buffer += "`";
309
+ await this.render(children);
310
+ this.buffer += "`";
311
+ } else if (type === "a") {
312
+ await this.render(children);
313
+ this.buffer += ` (${attrs.href}) `;
314
+ } else if (type === "p") {
315
+ await this.render(children);
316
+ this.buffer += "\n";
317
+ } else if (type === "at") {
318
+ if (attrs.id) {
319
+ this.buffer += `<@${attrs.id}>`;
320
+ } else if (attrs.type === "all") {
321
+ this.buffer += `@everyone`;
322
+ } else if (attrs.type === "here") {
323
+ this.buffer += `@here`;
324
+ }
325
+ } else if (type === "sharp" && attrs.id) {
326
+ this.buffer += `<#${attrs.id}>`;
327
+ } else if (type === "face" && attrs.name && attrs.id) {
328
+ this.buffer += `<:${attrs.name}:${attrs.id}>`;
329
+ } else if ((type === "image" || type === "video") && attrs.url) {
330
+ if (this.mode === "figure") {
331
+ this.figure = element;
332
+ } else {
333
+ await this.sendAsset(type, attrs, {
328
334
  ...this.addition,
329
335
  content: this.buffer.trim()
330
336
  });
331
337
  this.buffer = "";
332
- } else if (type === "figure") {
333
- await this.sendBuffer();
334
- this.mode = "figure";
338
+ }
339
+ } else if (type === "share") {
340
+ await this.flush();
341
+ await this.post({
342
+ ...this.addition,
343
+ embeds: [{ ...attrs }]
344
+ });
345
+ } else if (type === "record") {
346
+ await this.sendAsset("file", attrs, {
347
+ ...this.addition,
348
+ content: this.buffer.trim()
349
+ });
350
+ this.buffer = "";
351
+ } else if (type === "figure") {
352
+ await this.flush();
353
+ this.mode = "figure";
354
+ await this.render(children);
355
+ await this.sendAsset(this.figure.type, this.figure.attrs, {
356
+ ...this.addition,
357
+ content: this.buffer.trim()
358
+ });
359
+ this.buffer = "";
360
+ this.mode = "default";
361
+ } else if (type === "quote") {
362
+ await this.flush();
363
+ this.addition.message_reference = {
364
+ message_id: attrs.id
365
+ };
366
+ } else if (type === "message") {
367
+ if (this.mode === "figure") {
335
368
  await this.render(children);
336
- await this.sendAsset(this.figure.type, this.figure.attrs, {
337
- ...this.addition,
338
- content: this.buffer.trim()
339
- });
340
- this.buffer = "";
341
- this.mode = "default";
342
- } else if (type === "quote") {
343
- await this.sendBuffer();
344
- this.addition.message_reference = {
345
- message_id: attrs.id
346
- };
347
- } else if (type === "message") {
348
- if (this.mode === "figure") {
349
- await this.render(children);
350
- this.buffer += "\n";
351
- } else {
352
- await this.sendBuffer();
353
- if ("quote" in attrs) {
354
- this.addition.message_reference = {
355
- message_id: attrs.id
356
- };
357
- } else {
358
- await this.sendMessage(children);
359
- }
360
- }
369
+ this.buffer += "\n";
361
370
  } else {
362
- await this.render(children);
371
+ await this.flush();
372
+ await this.render(children, true);
363
373
  }
374
+ } else {
375
+ await this.render(children);
364
376
  }
365
377
  }
366
- async sendMessage(elements) {
367
- await this.render(elements);
368
- await this.sendBuffer();
369
- }
370
- async send(content) {
371
- const elements = import_satori2.segment.parse(content);
372
- await this.sendMessage(elements);
373
- if (!this.errors.length)
374
- return this.results;
375
- throw new AggregateError(this.errors);
376
- }
377
378
  };
378
- __name(Sender, "Sender");
379
- ((Sender2) => {
380
- Sender2.Config = import_satori2.Schema.object({
379
+ __name(DiscordModulator, "DiscordModulator");
380
+ ((DiscordModulator2) => {
381
+ DiscordModulator2.Config = import_satori2.Schema.object({
381
382
  handleExternalAsset: import_satori2.Schema.union([
382
383
  import_satori2.Schema.const("download").description("先下载后发送"),
383
384
  import_satori2.Schema.const("direct").description("直接发送链接"),
@@ -389,9 +390,9 @@ __name(Sender, "Sender");
389
390
  import_satori2.Schema.const("auto").description("如果图片本身采用直接发送则与前面的文本分开,否则将文本作为图片的附带信息发送")
390
391
  ]).role("radio").description("发送图文等混合内容时采用的方式。").default("auto")
391
392
  }).description("发送设置");
392
- })(Sender || (Sender = {}));
393
+ })(DiscordModulator || (DiscordModulator = {}));
393
394
 
394
- // satori/adapters/discord/src/types/index.ts
395
+ // adapters/discord/src/types/index.ts
395
396
  var types_exports = {};
396
397
  __export(types_exports, {
397
398
  ActivityFlag: () => ActivityFlag,
@@ -402,12 +403,12 @@ __export(types_exports, {
402
403
  AuditLog: () => AuditLog,
403
404
  AutoModerationAction: () => AutoModerationAction,
404
405
  AutoModerationRule: () => AutoModerationRule,
405
- Channel: () => Channel3,
406
+ Channel: () => Channel2,
406
407
  ComponentType: () => ComponentType,
407
408
  DeviceType: () => DeviceType,
408
409
  GatewayIntent: () => GatewayIntent,
409
410
  GatewayOpcode: () => GatewayOpcode,
410
- Guild: () => Guild4,
411
+ Guild: () => Guild3,
411
412
  GuildFeature: () => GuildFeature,
412
413
  GuildScheduledEvent: () => GuildScheduledEvent,
413
414
  IntegrationExpireBehavior: () => IntegrationExpireBehavior,
@@ -417,7 +418,7 @@ __export(types_exports, {
417
418
  Internal: () => Internal,
418
419
  Invite: () => Invite,
419
420
  MembershipState: () => MembershipState,
420
- Message: () => Message3,
421
+ Message: () => Message2,
421
422
  Permission: () => Permission,
422
423
  StatusType: () => StatusType2,
423
424
  Sticker: () => Sticker3,
@@ -428,7 +429,7 @@ __export(types_exports, {
428
429
  Webhook: () => Webhook2
429
430
  });
430
431
 
431
- // satori/adapters/discord/src/types/internal.ts
432
+ // adapters/discord/src/types/internal.ts
432
433
  var import_cosmokit = require("cosmokit");
433
434
  var Internal = class {
434
435
  constructor(http) {
@@ -468,7 +469,7 @@ var Internal = class {
468
469
  };
469
470
  __name(Internal, "Internal");
470
471
 
471
- // satori/adapters/discord/src/types/application.ts
472
+ // adapters/discord/src/types/application.ts
472
473
  var ApplicationFlag = /* @__PURE__ */ ((ApplicationFlag2) => {
473
474
  ApplicationFlag2[ApplicationFlag2["GATEWAY_PRESENCE"] = 4096] = "GATEWAY_PRESENCE";
474
475
  ApplicationFlag2[ApplicationFlag2["GATEWAY_PRESENCE_LIMITED"] = 8192] = "GATEWAY_PRESENCE_LIMITED";
@@ -487,7 +488,7 @@ Internal.define({
487
488
  }
488
489
  });
489
490
 
490
- // satori/adapters/discord/src/types/audit-log.ts
491
+ // adapters/discord/src/types/audit-log.ts
491
492
  var AuditLog;
492
493
  ((AuditLog2) => {
493
494
  let Type;
@@ -554,7 +555,7 @@ Internal.define({
554
555
  }
555
556
  });
556
557
 
557
- // satori/adapters/discord/src/types/auto-moderation.ts
558
+ // adapters/discord/src/types/auto-moderation.ts
558
559
  var AutoModerationRule;
559
560
  ((AutoModerationRule2) => {
560
561
  let EventType;
@@ -596,7 +597,7 @@ Internal.define({
596
597
  }
597
598
  });
598
599
 
599
- // satori/adapters/discord/src/types/ban.ts
600
+ // adapters/discord/src/types/ban.ts
600
601
  Internal.define({
601
602
  "/guilds/{guild.id}/bans": {
602
603
  GET: "getGuildBans"
@@ -608,9 +609,9 @@ Internal.define({
608
609
  }
609
610
  });
610
611
 
611
- // satori/adapters/discord/src/types/channel.ts
612
- var Channel3;
613
- ((Channel11) => {
612
+ // adapters/discord/src/types/channel.ts
613
+ var Channel2;
614
+ ((Channel10) => {
614
615
  let Type;
615
616
  ((Type2) => {
616
617
  Type2[Type2["GUILD_TEXT"] = 0] = "GUILD_TEXT";
@@ -626,8 +627,8 @@ var Channel3;
626
627
  Type2[Type2["GUILD_STAGE_VOICE"] = 13] = "GUILD_STAGE_VOICE";
627
628
  Type2[Type2["GUILD_DIRECTORY"] = 14] = "GUILD_DIRECTORY";
628
629
  Type2[Type2["GUILD_FORUM"] = 15] = "GUILD_FORUM";
629
- })(Type = Channel11.Type || (Channel11.Type = {}));
630
- })(Channel3 || (Channel3 = {}));
630
+ })(Type = Channel10.Type || (Channel10.Type = {}));
631
+ })(Channel2 || (Channel2 = {}));
631
632
  var AllowedMentionType = /* @__PURE__ */ ((AllowedMentionType2) => {
632
633
  AllowedMentionType2["ROLE_MENTIONS"] = "roles";
633
634
  AllowedMentionType2["USER_MENTIONS"] = "users";
@@ -668,7 +669,7 @@ Internal.define({
668
669
  }
669
670
  });
670
671
 
671
- // satori/adapters/discord/src/types/command.ts
672
+ // adapters/discord/src/types/command.ts
672
673
  var ApplicationCommand;
673
674
  ((ApplicationCommand3) => {
674
675
  let Type;
@@ -727,7 +728,7 @@ Internal.define({
727
728
  }
728
729
  });
729
730
 
730
- // satori/adapters/discord/src/types/component.ts
731
+ // adapters/discord/src/types/component.ts
731
732
  var ComponentType = /* @__PURE__ */ ((ComponentType2) => {
732
733
  ComponentType2[ComponentType2["ACTION_ROW"] = 1] = "ACTION_ROW";
733
734
  ComponentType2[ComponentType2["BUTTON"] = 2] = "BUTTON";
@@ -741,7 +742,7 @@ var TextInputStyles = /* @__PURE__ */ ((TextInputStyles2) => {
741
742
  return TextInputStyles2;
742
743
  })(TextInputStyles || {});
743
744
 
744
- // satori/adapters/discord/src/types/device.ts
745
+ // adapters/discord/src/types/device.ts
745
746
  var DeviceType = /* @__PURE__ */ ((DeviceType2) => {
746
747
  DeviceType2["AUDIO_INPUT"] = "audioinput";
747
748
  DeviceType2["AUDIO_OUTPUT"] = "audiooutput";
@@ -749,7 +750,7 @@ var DeviceType = /* @__PURE__ */ ((DeviceType2) => {
749
750
  return DeviceType2;
750
751
  })(DeviceType || {});
751
752
 
752
- // satori/adapters/discord/src/types/emoji.ts
753
+ // adapters/discord/src/types/emoji.ts
753
754
  Internal.define({
754
755
  "/guilds/{guild.id}/emojis": {
755
756
  GET: "listGuildEmojis",
@@ -762,7 +763,7 @@ Internal.define({
762
763
  }
763
764
  });
764
765
 
765
- // satori/adapters/discord/src/types/gateway.ts
766
+ // adapters/discord/src/types/gateway.ts
766
767
  var GatewayOpcode = /* @__PURE__ */ ((GatewayOpcode2) => {
767
768
  GatewayOpcode2[GatewayOpcode2["DISPATCH"] = 0] = "DISPATCH";
768
769
  GatewayOpcode2[GatewayOpcode2["HEARTBEAT"] = 1] = "HEARTBEAT";
@@ -808,7 +809,7 @@ Internal.define({
808
809
  }
809
810
  });
810
811
 
811
- // satori/adapters/discord/src/types/guild-member.ts
812
+ // adapters/discord/src/types/guild-member.ts
812
813
  Internal.define({
813
814
  "/guilds/{guild.id}/members/{user.id}": {
814
815
  GET: "getGuildMember",
@@ -835,7 +836,7 @@ Internal.define({
835
836
  }
836
837
  });
837
838
 
838
- // satori/adapters/discord/src/types/guild-template.ts
839
+ // adapters/discord/src/types/guild-template.ts
839
840
  Internal.define({
840
841
  "/guilds/templates/{template.code}": {
841
842
  GET: "getGuildTemplate",
@@ -852,9 +853,9 @@ Internal.define({
852
853
  }
853
854
  });
854
855
 
855
- // satori/adapters/discord/src/types/guild.ts
856
- var Guild4;
857
- ((Guild7) => {
856
+ // adapters/discord/src/types/guild.ts
857
+ var Guild3;
858
+ ((Guild6) => {
858
859
  let Params;
859
860
  ((Params2) => {
860
861
  let WidgetStyleOptions;
@@ -865,8 +866,8 @@ var Guild4;
865
866
  WidgetStyleOptions2["banner3"] = "banner3";
866
867
  WidgetStyleOptions2["banner4"] = "banner4";
867
868
  })(WidgetStyleOptions = Params2.WidgetStyleOptions || (Params2.WidgetStyleOptions = {}));
868
- })(Params = Guild7.Params || (Guild7.Params = {}));
869
- })(Guild4 || (Guild4 = {}));
869
+ })(Params = Guild6.Params || (Guild6.Params = {}));
870
+ })(Guild3 || (Guild3 = {}));
870
871
  var SystemChannelFlag = /* @__PURE__ */ ((SystemChannelFlag2) => {
871
872
  SystemChannelFlag2[SystemChannelFlag2["SUPPRESS_JOIN_NOTIFICATIONS"] = 1] = "SUPPRESS_JOIN_NOTIFICATIONS";
872
873
  SystemChannelFlag2[SystemChannelFlag2["SUPPRESS_PREMIUM_SUBSCRIPTIONS"] = 2] = "SUPPRESS_PREMIUM_SUBSCRIPTIONS";
@@ -937,7 +938,7 @@ Internal.define({
937
938
  }
938
939
  });
939
940
 
940
- // satori/adapters/discord/src/types/integration.ts
941
+ // adapters/discord/src/types/integration.ts
941
942
  var IntegrationExpireBehavior = /* @__PURE__ */ ((IntegrationExpireBehavior2) => {
942
943
  IntegrationExpireBehavior2[IntegrationExpireBehavior2["REMOVE_ROLE"] = 0] = "REMOVE_ROLE";
943
944
  IntegrationExpireBehavior2[IntegrationExpireBehavior2["KICK"] = 1] = "KICK";
@@ -952,7 +953,7 @@ Internal.define({
952
953
  }
953
954
  });
954
955
 
955
- // satori/adapters/discord/src/types/interaction.ts
956
+ // adapters/discord/src/types/interaction.ts
956
957
  var InteractionType = /* @__PURE__ */ ((InteractionType2) => {
957
958
  InteractionType2[InteractionType2["PING"] = 1] = "PING";
958
959
  InteractionType2[InteractionType2["APPLICATION_COMMAND"] = 2] = "APPLICATION_COMMAND";
@@ -992,7 +993,7 @@ Internal.define({
992
993
  }
993
994
  });
994
995
 
995
- // satori/adapters/discord/src/types/invite.ts
996
+ // adapters/discord/src/types/invite.ts
996
997
  var Invite;
997
998
  ((Invite2) => {
998
999
  let TargetType;
@@ -1018,9 +1019,9 @@ Internal.define({
1018
1019
  }
1019
1020
  });
1020
1021
 
1021
- // satori/adapters/discord/src/types/message.ts
1022
- var Message3;
1023
- ((Message6) => {
1022
+ // adapters/discord/src/types/message.ts
1023
+ var Message2;
1024
+ ((Message4) => {
1024
1025
  let Type;
1025
1026
  ((Type2) => {
1026
1027
  Type2[Type2["DEFAULT"] = 0] = "DEFAULT";
@@ -1046,14 +1047,14 @@ var Message3;
1046
1047
  Type2[Type2["THREAD_STARTER_MESSAGE"] = 21] = "THREAD_STARTER_MESSAGE";
1047
1048
  Type2[Type2["GUILD_INVITE_REMINDER"] = 22] = "GUILD_INVITE_REMINDER";
1048
1049
  Type2[Type2["CONTEXT_MENU_COMMAND"] = 23] = "CONTEXT_MENU_COMMAND";
1049
- })(Type = Message6.Type || (Message6.Type = {}));
1050
+ })(Type = Message4.Type || (Message4.Type = {}));
1050
1051
  let ActivityType2;
1051
1052
  ((ActivityType3) => {
1052
1053
  ActivityType3[ActivityType3["JOIN"] = 1] = "JOIN";
1053
1054
  ActivityType3[ActivityType3["SPECTATE"] = 2] = "SPECTATE";
1054
1055
  ActivityType3[ActivityType3["LISTEN"] = 3] = "LISTEN";
1055
1056
  ActivityType3[ActivityType3["JOIN_REQUEST"] = 5] = "JOIN_REQUEST";
1056
- })(ActivityType2 = Message6.ActivityType || (Message6.ActivityType = {}));
1057
+ })(ActivityType2 = Message4.ActivityType || (Message4.ActivityType = {}));
1057
1058
  let Flag;
1058
1059
  ((Flag2) => {
1059
1060
  Flag2[Flag2["CROSSPOSTED"] = 1] = "CROSSPOSTED";
@@ -1064,8 +1065,8 @@ var Message3;
1064
1065
  Flag2[Flag2["HAS_THREAD"] = 32] = "HAS_THREAD";
1065
1066
  Flag2[Flag2["EPHEMERAL"] = 64] = "EPHEMERAL";
1066
1067
  Flag2[Flag2["LOADING"] = 128] = "LOADING";
1067
- })(Flag = Message6.Flag || (Message6.Flag = {}));
1068
- })(Message3 || (Message3 = {}));
1068
+ })(Flag = Message4.Flag || (Message4.Flag = {}));
1069
+ })(Message2 || (Message2 = {}));
1069
1070
  Internal.define({
1070
1071
  "/channels/{channel.id}/messages": {
1071
1072
  GET: "getChannelMessages",
@@ -1091,7 +1092,7 @@ Internal.define({
1091
1092
  }
1092
1093
  });
1093
1094
 
1094
- // satori/adapters/discord/src/types/presence.ts
1095
+ // adapters/discord/src/types/presence.ts
1095
1096
  var StatusType2 = /* @__PURE__ */ ((StatusType3) => {
1096
1097
  StatusType3["ONLINE"] = "ONLINE";
1097
1098
  StatusType3["DND"] = "DND";
@@ -1119,7 +1120,7 @@ var ActivityFlag = /* @__PURE__ */ ((ActivityFlag2) => {
1119
1120
  return ActivityFlag2;
1120
1121
  })(ActivityFlag || {});
1121
1122
 
1122
- // satori/adapters/discord/src/types/reaction.ts
1123
+ // adapters/discord/src/types/reaction.ts
1123
1124
  Internal.define({
1124
1125
  "/channels/{channel.id}/messages/{message.id}/reactions/{emoji}/@me": {
1125
1126
  PUT: "createReaction",
@@ -1137,7 +1138,7 @@ Internal.define({
1137
1138
  }
1138
1139
  });
1139
1140
 
1140
- // satori/adapters/discord/src/types/role.ts
1141
+ // adapters/discord/src/types/role.ts
1141
1142
  var Permission = /* @__PURE__ */ ((Permission2) => {
1142
1143
  Permission2[Permission2["CREATE_INSTANT_INVITE"] = 1] = "CREATE_INSTANT_INVITE";
1143
1144
  Permission2[Permission2["KICK_MEMBERS"] = 2] = "KICK_MEMBERS";
@@ -1192,7 +1193,7 @@ Internal.define({
1192
1193
  }
1193
1194
  });
1194
1195
 
1195
- // satori/adapters/discord/src/types/scheduled-event.ts
1196
+ // adapters/discord/src/types/scheduled-event.ts
1196
1197
  var GuildScheduledEvent;
1197
1198
  ((GuildScheduledEvent2) => {
1198
1199
  let PrivacyLevel;
@@ -1228,7 +1229,7 @@ Internal.define({
1228
1229
  }
1229
1230
  });
1230
1231
 
1231
- // satori/adapters/discord/src/types/stage-instance.ts
1232
+ // adapters/discord/src/types/stage-instance.ts
1232
1233
  Internal.define({
1233
1234
  "/stage-instances": {
1234
1235
  POST: "createStageInstance"
@@ -1240,7 +1241,7 @@ Internal.define({
1240
1241
  }
1241
1242
  });
1242
1243
 
1243
- // satori/adapters/discord/src/types/sticker.ts
1244
+ // adapters/discord/src/types/sticker.ts
1244
1245
  var Sticker3;
1245
1246
  ((Sticker4) => {
1246
1247
  let Type;
@@ -1273,14 +1274,14 @@ Internal.define({
1273
1274
  }
1274
1275
  });
1275
1276
 
1276
- // satori/adapters/discord/src/types/team.ts
1277
+ // adapters/discord/src/types/team.ts
1277
1278
  var MembershipState = /* @__PURE__ */ ((MembershipState2) => {
1278
1279
  MembershipState2[MembershipState2["INVITED"] = 1] = "INVITED";
1279
1280
  MembershipState2[MembershipState2["ACCEPTED"] = 2] = "ACCEPTED";
1280
1281
  return MembershipState2;
1281
1282
  })(MembershipState || {});
1282
1283
 
1283
- // satori/adapters/discord/src/types/thread.ts
1284
+ // adapters/discord/src/types/thread.ts
1284
1285
  Internal.define({
1285
1286
  "/guilds/{guild.id}/threads/active": {
1286
1287
  GET: "listActiveGuildThreads"
@@ -1317,7 +1318,7 @@ Internal.define({
1317
1318
  }
1318
1319
  });
1319
1320
 
1320
- // satori/adapters/discord/src/types/user.ts
1321
+ // adapters/discord/src/types/user.ts
1321
1322
  var UserFlag = /* @__PURE__ */ ((UserFlag2) => {
1322
1323
  UserFlag2[UserFlag2["NONE"] = 0] = "NONE";
1323
1324
  UserFlag2[UserFlag2["DISCORD_EMPLOYEE"] = 1] = "DISCORD_EMPLOYEE";
@@ -1353,7 +1354,7 @@ Internal.define({
1353
1354
  }
1354
1355
  });
1355
1356
 
1356
- // satori/adapters/discord/src/types/voice.ts
1357
+ // adapters/discord/src/types/voice.ts
1357
1358
  Internal.define({
1358
1359
  "/voice/regions": {
1359
1360
  GET: "listVoiceRegions"
@@ -1369,7 +1370,7 @@ Internal.define({
1369
1370
  }
1370
1371
  });
1371
1372
 
1372
- // satori/adapters/discord/src/types/webhook.ts
1373
+ // adapters/discord/src/types/webhook.ts
1373
1374
  var Webhook2;
1374
1375
  ((Webhook3) => {
1375
1376
  let Type;
@@ -1411,7 +1412,7 @@ Internal.define({
1411
1412
  }
1412
1413
  });
1413
1414
 
1414
- // satori/adapters/discord/src/ws.ts
1415
+ // adapters/discord/src/ws.ts
1415
1416
  var import_satori3 = require("@satorijs/satori");
1416
1417
  var logger = new import_satori3.Logger("discord");
1417
1418
  var WsClient = class extends import_satori3.Adapter.WsClient {
@@ -1499,7 +1500,7 @@ __name(WsClient, "WsClient");
1499
1500
  ]);
1500
1501
  })(WsClient || (WsClient = {}));
1501
1502
 
1502
- // satori/adapters/discord/src/bot.ts
1503
+ // adapters/discord/src/bot.ts
1503
1504
  var DiscordBot = class extends import_satori4.Bot {
1504
1505
  constructor(ctx, config) {
1505
1506
  super(ctx, config);
@@ -1518,32 +1519,10 @@ var DiscordBot = class extends import_satori4.Bot {
1518
1519
  return adaptUser(data);
1519
1520
  }
1520
1521
  async sendMessage(channelId, content, guildId) {
1521
- const fragment = import_satori4.segment.normalize(content);
1522
- const elements = fragment.children;
1523
- content = fragment.toString();
1524
- const session = this.session({
1525
- type: "send",
1526
- author: this,
1527
- channelId,
1528
- elements,
1529
- content,
1530
- guildId,
1531
- subtype: guildId ? "group" : "private"
1532
- });
1533
- if (await this.context.serial(session, "before-send", session))
1534
- return;
1535
- if (!session.content)
1536
- return [];
1537
- const sender = new Sender(this, `/channels/${channelId}/messages`);
1538
- const results = await sender.send(session.content);
1539
- for (const id of results) {
1540
- session.messageId = id;
1541
- this.context.emit(session, "send", session);
1542
- }
1543
- return results;
1522
+ return new DiscordModulator(this, channelId, guildId).send(content);
1544
1523
  }
1545
1524
  async sendPrivateMessage(channelId, content) {
1546
- return this.sendMessage(channelId, content);
1525
+ return new DiscordModulator(this, channelId).send(content);
1547
1526
  }
1548
1527
  async deleteMessage(channelId, messageId) {
1549
1528
  await this.internal.deleteMessage(channelId, messageId);
@@ -1610,19 +1589,19 @@ __name(DiscordBot, "DiscordBot");
1610
1589
  token: import_satori4.Schema.string().description("机器人的用户令牌。").role("secret").required()
1611
1590
  }),
1612
1591
  WsClient.Config,
1613
- Sender.Config,
1592
+ DiscordModulator.Config,
1614
1593
  import_satori4.Quester.createConfig("https://discord.com/api/v10")
1615
1594
  ]);
1616
1595
  })(DiscordBot || (DiscordBot = {}));
1617
1596
  DiscordBot.prototype.platform = "discord";
1618
1597
 
1619
- // satori/adapters/discord/src/index.ts
1598
+ // adapters/discord/src/index.ts
1620
1599
  var src_default = DiscordBot;
1621
1600
  // Annotate the CommonJS export names for ESM import in node:
1622
1601
  0 && (module.exports = {
1623
1602
  Discord,
1624
1603
  DiscordBot,
1625
- Sender,
1604
+ DiscordModulator,
1626
1605
  WsClient,
1627
1606
  adaptAuthor,
1628
1607
  adaptChannel,