@satorijs/adapter-discord 4.0.4 → 4.1.1

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
@@ -100,6 +100,7 @@ var import_satori2 = require("@satorijs/satori");
100
100
 
101
101
  // satori/adapters/discord/src/types/internal.ts
102
102
  var import_satori = require("@satorijs/satori");
103
+ var logger = new import_satori.Logger("discord");
103
104
  var _Internal = class _Internal {
104
105
  constructor(http) {
105
106
  this.http = http;
@@ -130,6 +131,7 @@ var _Internal = class _Internal {
130
131
  throw new Error(`too many arguments for ${path}, received ${raw}`);
131
132
  }
132
133
  try {
134
+ logger.debug(`${method} ${url}`, config);
133
135
  return await this.http(method, url, config);
134
136
  } catch (error) {
135
137
  if (!import_satori.Quester.isAxiosError(error) || !error.response)
@@ -312,7 +314,7 @@ Internal.define({
312
314
 
313
315
  // satori/adapters/discord/src/types/channel.ts
314
316
  var Channel2;
315
- ((Channel10) => {
317
+ ((Channel11) => {
316
318
  let Type;
317
319
  ((Type2) => {
318
320
  Type2[Type2["GUILD_TEXT"] = 0] = "GUILD_TEXT";
@@ -328,7 +330,7 @@ var Channel2;
328
330
  Type2[Type2["GUILD_STAGE_VOICE"] = 13] = "GUILD_STAGE_VOICE";
329
331
  Type2[Type2["GUILD_DIRECTORY"] = 14] = "GUILD_DIRECTORY";
330
332
  Type2[Type2["GUILD_FORUM"] = 15] = "GUILD_FORUM";
331
- })(Type = Channel10.Type || (Channel10.Type = {}));
333
+ })(Type = Channel11.Type || (Channel11.Type = {}));
332
334
  })(Channel2 || (Channel2 = {}));
333
335
  var OverwriteType = /* @__PURE__ */ ((OverwriteType2) => {
334
336
  OverwriteType2[OverwriteType2["ROLE"] = 0] = "ROLE";
@@ -749,7 +751,7 @@ Internal.define({
749
751
 
750
752
  // satori/adapters/discord/src/types/message.ts
751
753
  var Message2;
752
- ((Message4) => {
754
+ ((Message5) => {
753
755
  let Type;
754
756
  ((Type2) => {
755
757
  Type2[Type2["DEFAULT"] = 0] = "DEFAULT";
@@ -779,14 +781,14 @@ var Message2;
779
781
  Type2[Type2["ROLE_SUBSCRIPTION_PURCHASE"] = 25] = "ROLE_SUBSCRIPTION_PURCHASE";
780
782
  Type2[Type2["INTERACTION_PREMIUM_UPSELL"] = 26] = "INTERACTION_PREMIUM_UPSELL";
781
783
  Type2[Type2["GUILD_APPLICATION_PREMIUM_SUBSCRIPTION"] = 32] = "GUILD_APPLICATION_PREMIUM_SUBSCRIPTION";
782
- })(Type = Message4.Type || (Message4.Type = {}));
784
+ })(Type = Message5.Type || (Message5.Type = {}));
783
785
  let ActivityType2;
784
786
  ((ActivityType3) => {
785
787
  ActivityType3[ActivityType3["JOIN"] = 1] = "JOIN";
786
788
  ActivityType3[ActivityType3["SPECTATE"] = 2] = "SPECTATE";
787
789
  ActivityType3[ActivityType3["LISTEN"] = 3] = "LISTEN";
788
790
  ActivityType3[ActivityType3["JOIN_REQUEST"] = 5] = "JOIN_REQUEST";
789
- })(ActivityType2 = Message4.ActivityType || (Message4.ActivityType = {}));
791
+ })(ActivityType2 = Message5.ActivityType || (Message5.ActivityType = {}));
790
792
  let Flag;
791
793
  ((Flag2) => {
792
794
  Flag2[Flag2["CROSSPOSTED"] = 1] = "CROSSPOSTED";
@@ -798,7 +800,7 @@ var Message2;
798
800
  Flag2[Flag2["EPHEMERAL"] = 64] = "EPHEMERAL";
799
801
  Flag2[Flag2["LOADING"] = 128] = "LOADING";
800
802
  Flag2[Flag2["FAILED_TO_MENTION_SOME_ROLES_IN_THREAD"] = 256] = "FAILED_TO_MENTION_SOME_ROLES_IN_THREAD";
801
- })(Flag = Message4.Flag || (Message4.Flag = {}));
803
+ })(Flag = Message5.Flag || (Message5.Flag = {}));
802
804
  })(Message2 || (Message2 = {}));
803
805
  Internal.define({
804
806
  "/channels/{channel.id}/messages": {
@@ -1396,6 +1398,57 @@ async function adaptSession(bot, input) {
1396
1398
  session.messageId = input.d.id;
1397
1399
  session.content = "";
1398
1400
  session.event.argv = decodeArgv(data, command);
1401
+ } else if (input.t === "INTERACTION_CREATE" && input.d.type === Interaction.Type.MODAL_SUBMIT) {
1402
+ const data = input.d.data;
1403
+ if (!data.custom_id.startsWith("input:"))
1404
+ return;
1405
+ const user_input = data.components[0].components[0].value;
1406
+ await bot.internal.createInteractionResponse(input.d.id, input.d.token, {
1407
+ type: Interaction.CallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE
1408
+ });
1409
+ session.type = "interaction/command";
1410
+ session.isDirect = !input.d.guild_id;
1411
+ session.subtype = input.d.guild_id ? "group" : "private";
1412
+ session.channelId = input.d.channel_id;
1413
+ session.guildId = input.d.guild_id;
1414
+ session.userId = session.isDirect ? input.d.user.id : input.d.member.user.id;
1415
+ session.messageId = input.d.id;
1416
+ session.content = user_input;
1417
+ } else if (input.t === "INTERACTION_CREATE" && input.d.type === Interaction.Type.MESSAGE_COMPONENT) {
1418
+ const id = input.d.data.custom_id;
1419
+ if (id.startsWith("input:")) {
1420
+ await bot.internal.createInteractionResponse(input.d.id, input.d.token, {
1421
+ type: Interaction.CallbackType.MODAL,
1422
+ data: {
1423
+ custom_id: id,
1424
+ title: "title",
1425
+ components: [{
1426
+ type: 1 /* ACTION_ROW */,
1427
+ components: [{
1428
+ custom_id: id,
1429
+ type: 4 /* TEXT_INPUT */,
1430
+ label: "auto complete",
1431
+ value: id.slice("input:".length),
1432
+ style: 1
1433
+ }]
1434
+ }]
1435
+ }
1436
+ });
1437
+ } else {
1438
+ await bot.internal.createInteractionResponse(input.d.id, input.d.token, {
1439
+ type: Interaction.CallbackType.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE
1440
+ });
1441
+ }
1442
+ session.type = "interaction/button";
1443
+ session.isDirect = !input.d.guild_id;
1444
+ session.channelId = input.d.channel_id;
1445
+ session.guildId = input.d.guild_id;
1446
+ session.userId = session.isDirect ? input.d.user.id : input.d.member.user.id;
1447
+ session.messageId = input.d.id;
1448
+ session.content = "";
1449
+ session.event.button = {
1450
+ id
1451
+ };
1399
1452
  } else if (input.t === "CHANNEL_UPDATE") {
1400
1453
  session.type = "channel-updated";
1401
1454
  session.guildId = input.d.guild_id;
@@ -1485,7 +1538,7 @@ __name(encodeCommandOptions, "encodeCommandOptions");
1485
1538
  // satori/adapters/discord/src/message.ts
1486
1539
  var import_satori3 = require("@satorijs/satori");
1487
1540
  var import_form_data = __toESM(require("form-data"));
1488
- var logger = new import_satori3.Logger("discord");
1541
+ var logger2 = new import_satori3.Logger("discord");
1489
1542
  var _State = class _State {
1490
1543
  // forward: send the first message and create a thread
1491
1544
  constructor(type) {
@@ -1507,6 +1560,8 @@ var _DiscordMessageEncoder = class _DiscordMessageEncoder extends import_satori3
1507
1560
  figure = null;
1508
1561
  mode = "default";
1509
1562
  listType = null;
1563
+ rows = [];
1564
+ buttonGroupState = false;
1510
1565
  async getUrl() {
1511
1566
  var _a, _b, _c, _d;
1512
1567
  const input = (_b = (_a = this.options) == null ? void 0 : _a.session) == null ? void 0 : _b.discord;
@@ -1553,7 +1608,7 @@ var _DiscordMessageEncoder = class _DiscordMessageEncoder extends import_satori3
1553
1608
  } catch (e) {
1554
1609
  if (import_satori3.Quester.isAxiosError(e) && e.response) {
1555
1610
  if (((_a = e.response.data) == null ? void 0 : _a.code) === 10015) {
1556
- logger.debug("webhook has been deleted, recreating..., %o", e.response.data);
1611
+ logger2.debug("webhook has been deleted, recreating..., %o", e.response.data);
1557
1612
  if (!this.bot.webhookLock[this.channelId])
1558
1613
  this.bot.webhooks[this.channelId] = null;
1559
1614
  await this.ensureWebhook();
@@ -1618,9 +1673,35 @@ var _DiscordMessageEncoder = class _DiscordMessageEncoder extends import_satori3
1618
1673
  const content = this.buffer.trim();
1619
1674
  if (!content)
1620
1675
  return;
1676
+ this.addition.components = this.rows;
1621
1677
  await this.post({ ...this.addition, content });
1622
1678
  this.buffer = "";
1623
1679
  this.addition = {};
1680
+ this.rows = [];
1681
+ }
1682
+ decodeButton(attrs, label) {
1683
+ if (attrs.type === "link") {
1684
+ return {
1685
+ type: 2 /* BUTTON */,
1686
+ url: attrs.href,
1687
+ label,
1688
+ style: 5
1689
+ };
1690
+ } else if (attrs.type === "action") {
1691
+ return {
1692
+ type: 2 /* BUTTON */,
1693
+ custom_id: attrs.id,
1694
+ label,
1695
+ style: 1
1696
+ };
1697
+ } else if (attrs.type === "input") {
1698
+ return {
1699
+ type: 2 /* BUTTON */,
1700
+ custom_id: "input:" + attrs.text,
1701
+ label,
1702
+ style: 1
1703
+ };
1704
+ }
1624
1705
  }
1625
1706
  async visit(element) {
1626
1707
  var _a;
@@ -1795,6 +1876,29 @@ var _DiscordMessageEncoder = class _DiscordMessageEncoder extends import_satori3
1795
1876
  this.stack[1].author = {};
1796
1877
  }
1797
1878
  }
1879
+ } else if (type === "button") {
1880
+ if (this.buttonGroupState) {
1881
+ const last = this.rows[this.rows.length - 1];
1882
+ last.components.push(this.decodeButton(
1883
+ attrs,
1884
+ children.join("")
1885
+ ));
1886
+ } else {
1887
+ this.rows.push({
1888
+ type: 1 /* ACTION_ROW */,
1889
+ components: [
1890
+ this.decodeButton(attrs, children.join(""))
1891
+ ]
1892
+ });
1893
+ }
1894
+ } else if (type === "button-group") {
1895
+ this.buttonGroupState = true;
1896
+ this.rows.push({
1897
+ type: 1 /* ACTION_ROW */,
1898
+ components: []
1899
+ });
1900
+ await this.render(children);
1901
+ this.buttonGroupState = false;
1798
1902
  } else if (type === "message" && attrs.forward) {
1799
1903
  this.stack.unshift(new State("forward"));
1800
1904
  await this.render(children);
@@ -1828,7 +1932,7 @@ var DiscordMessageEncoder = _DiscordMessageEncoder;
1828
1932
 
1829
1933
  // satori/adapters/discord/src/ws.ts
1830
1934
  var import_satori4 = require("@satorijs/satori");
1831
- var logger2 = new import_satori4.Logger("discord");
1935
+ var logger3 = new import_satori4.Logger("discord");
1832
1936
  var _WsClient = class _WsClient extends import_satori4.Adapter.WsClient {
1833
1937
  _d = 0;
1834
1938
  _ping;
@@ -1842,7 +1946,7 @@ var _WsClient = class _WsClient extends import_satori4.Adapter.WsClient {
1842
1946
  return this.bot.http.ws(url + "/?v=10&encoding=json");
1843
1947
  }
1844
1948
  heartbeat() {
1845
- logger2.debug(`heartbeat d ${this._d}`);
1949
+ logger3.debug(`heartbeat d ${this._d}`);
1846
1950
  this.socket.send(JSON.stringify({
1847
1951
  op: Gateway.Opcode.HEARTBEAT,
1848
1952
  d: this._d
@@ -1855,16 +1959,16 @@ var _WsClient = class _WsClient extends import_satori4.Adapter.WsClient {
1855
1959
  try {
1856
1960
  parsed = JSON.parse(data.toString());
1857
1961
  } catch (error) {
1858
- return logger2.warn("cannot parse message", data);
1962
+ return logger3.warn("cannot parse message", data);
1859
1963
  }
1860
- logger2.debug(require("util").inspect(parsed, false, null, true));
1964
+ logger3.debug(require("util").inspect(parsed, false, null, true));
1861
1965
  if (parsed.s) {
1862
1966
  this._d = parsed.s;
1863
1967
  }
1864
1968
  if (parsed.op === Gateway.Opcode.HELLO) {
1865
1969
  this._ping = setInterval(() => this.heartbeat(), parsed.d.heartbeat_interval);
1866
1970
  if (this._sessionId) {
1867
- logger2.debug("resuming");
1971
+ logger3.debug("resuming");
1868
1972
  this.socket.send(JSON.stringify({
1869
1973
  op: Gateway.Opcode.RESUME,
1870
1974
  d: {
@@ -1889,7 +1993,7 @@ var _WsClient = class _WsClient extends import_satori4.Adapter.WsClient {
1889
1993
  if (parsed.d)
1890
1994
  return;
1891
1995
  this._sessionId = "";
1892
- logger2.warn("offline: invalid session");
1996
+ logger3.warn("offline: invalid session");
1893
1997
  (_a = this.socket) == null ? void 0 : _a.close();
1894
1998
  }
1895
1999
  if (parsed.op === Gateway.Opcode.DISPATCH) {
@@ -1902,7 +2006,7 @@ var _WsClient = class _WsClient extends import_satori4.Adapter.WsClient {
1902
2006
  this._sessionId = parsed.d.session_id;
1903
2007
  this._resumeUrl = parsed.d.resume_gateway_url;
1904
2008
  this.bot.user = decodeUser(parsed.d.user);
1905
- logger2.debug("session_id " + this._sessionId);
2009
+ logger3.debug("session_id " + this._sessionId);
1906
2010
  return this.bot.online();
1907
2011
  }
1908
2012
  if (parsed.t === "RESUMED") {
@@ -1913,7 +2017,7 @@ var _WsClient = class _WsClient extends import_satori4.Adapter.WsClient {
1913
2017
  this.bot.dispatch(session);
1914
2018
  }
1915
2019
  if (parsed.op === Gateway.Opcode.RECONNECT) {
1916
- logger2.warn("offline: discord request reconnect");
2020
+ logger3.warn("offline: discord request reconnect");
1917
2021
  (_b = this.socket) == null ? void 0 : _b.close();
1918
2022
  }
1919
2023
  });
@@ -1935,7 +2039,7 @@ var WsClient = _WsClient;
1935
2039
 
1936
2040
  // satori/adapters/discord/src/bot.ts
1937
2041
  var import_package = require("../package.json");
1938
- var logger3 = new import_satori5.Logger("discord");
2042
+ var logger4 = new import_satori5.Logger("discord");
1939
2043
  var _DiscordBot = class _DiscordBot extends import_satori5.Bot {
1940
2044
  http;
1941
2045
  internal;
@@ -2097,7 +2201,7 @@ var _DiscordBot = class _DiscordBot extends import_satori5.Bot {
2097
2201
  this.commands = commands;
2098
2202
  const updates = commands.map(encodeCommand);
2099
2203
  if (updates.length) {
2100
- logger3.debug("update %d command(s)", updates.length);
2204
+ logger4.debug("update %d command(s)", updates.length);
2101
2205
  await this.internal.bulkOverwriteGlobalApplicationCommands(this.selfId, updates);
2102
2206
  }
2103
2207
  }