@satorijs/adapter-discord 4.5.10 → 4.6.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/bot.d.ts CHANGED
@@ -7,8 +7,8 @@ export declare class DiscordBot<C extends Context = Context> extends Bot<C, Disc
7
7
  static MessageEncoder: typeof DiscordMessageEncoder;
8
8
  static inject: string[];
9
9
  http: HTTP;
10
- internal: Internal;
11
- webhooks: Record<string, Webhook>;
10
+ internal: Internal<C>;
11
+ webhooks: Record<string, Webhook | null>;
12
12
  webhookLock: Record<string, Promise<Webhook>>;
13
13
  commands: Universal.Command[];
14
14
  constructor(ctx: C, config: DiscordBot.Config);
@@ -40,15 +40,20 @@ export declare class DiscordBot<C extends Context = Context> extends Bot<C, Disc
40
40
  getChannelList(guildId: string): Promise<{
41
41
  data: Universal.Channel[];
42
42
  }>;
43
- createReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
44
- deleteReaction(channelId: string, messageId: string, emoji: string, userId?: string): Promise<void>;
45
- clearReaction(channelId: string, messageId: string, emoji?: string): Promise<void>;
46
- getReactionList(channelId: string, messageId: string, emoji: string, after?: string): Promise<{
43
+ createReaction(channelId: string, messageId: string, emojiId: string): Promise<void>;
44
+ deleteReaction(channelId: string, messageId: string, emojiId: string, userId?: string): Promise<void>;
45
+ clearReaction(channelId: string, messageId: string, emojiId?: string): Promise<void>;
46
+ getReactionList(channelId: string, messageId: string, emojiId: string, after?: string): Promise<{
47
47
  data: Universal.User[];
48
48
  next: string;
49
49
  }>;
50
50
  setGuildMemberRole(guildId: string, userId: string, roleId: string): Promise<void>;
51
51
  unsetGuildMemberRole(guildId: string, userId: string, roleId: string): Promise<void>;
52
+ getGuildMemberRoleList(guildId: string, userId: string, next?: string): Promise<{
53
+ data: {
54
+ id: string;
55
+ }[];
56
+ }>;
52
57
  getGuildRoleList(guildId: string): Promise<{
53
58
  data: Universal.GuildRole[];
54
59
  }>;
package/lib/index.cjs CHANGED
@@ -18,15 +18,15 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
23
  Discord: () => utils_exports,
24
24
  DiscordBot: () => DiscordBot,
25
25
  DiscordMessageEncoder: () => DiscordMessageEncoder,
26
26
  WsClient: () => WsClient,
27
- default: () => src_default
27
+ default: () => index_default
28
28
  });
29
- module.exports = __toCommonJS(src_exports);
29
+ module.exports = __toCommonJS(index_exports);
30
30
 
31
31
  // src/bot.ts
32
32
  var import_core5 = require("@satorijs/core");
@@ -951,6 +951,7 @@ Internal.define({
951
951
  PATCH: "modifyGuildRolePositions"
952
952
  },
953
953
  "/guilds/{guild.id}/roles/{role.id}": {
954
+ GET: "getGuildRole",
954
955
  PATCH: "modifyGuildRole",
955
956
  DELETE: "deleteGuildRole"
956
957
  }
@@ -1229,8 +1230,8 @@ var decodeUser = /* @__PURE__ */ __name((user) => ({
1229
1230
  var decodeGuildMember = /* @__PURE__ */ __name((member) => ({
1230
1231
  user: member.user && decodeUser(member.user),
1231
1232
  nick: member.nick,
1232
- roles: member.roles,
1233
- joinedAt: member.joined_at && new Date(member.joined_at).valueOf()
1233
+ roles: member.roles?.map((id) => ({ id })),
1234
+ joinedAt: member.joined_at ? new Date(member.joined_at).valueOf() : void 0
1234
1235
  }), "decodeGuildMember");
1235
1236
  var decodeGuild = /* @__PURE__ */ __name((data) => ({
1236
1237
  id: data.id,
@@ -1250,7 +1251,7 @@ var decodeRole = /* @__PURE__ */ __name((role) => ({
1250
1251
  }), "decodeRole");
1251
1252
  var encodeRole = /* @__PURE__ */ __name((role) => ({
1252
1253
  ...role,
1253
- permissions: role.permissions && "" + role.permissions
1254
+ permissions: role.permissions ? "" + role.permissions : void 0
1254
1255
  }), "encodeRole");
1255
1256
  async function decodeMessage(bot, data, message, payload = message, details = true) {
1256
1257
  const { platform } = bot;
@@ -1341,7 +1342,7 @@ async function decodeMessage(bot, data, message, payload = message, details = tr
1341
1342
  message.quote = await bot.getMessage(channel_id, message_id, false);
1342
1343
  }
1343
1344
  message.createdAt = new Date(data.timestamp).valueOf();
1344
- message.updatedAt = data.edited_timestamp && new Date(data.edited_timestamp).valueOf();
1345
+ message.updatedAt = data.edited_timestamp ? new Date(data.edited_timestamp).valueOf() : void 0;
1345
1346
  if (!payload) return message;
1346
1347
  payload.channel = {
1347
1348
  id: data.channel_id,
@@ -1491,11 +1492,21 @@ async function adaptSession(bot, input) {
1491
1492
  session.event.button = {
1492
1493
  id
1493
1494
  };
1495
+ } else if (input.t === "CHANNEL_CREATE") {
1496
+ session.type = "channel-added";
1497
+ session.guildId = input.d.guild_id;
1498
+ session.channelId = input.d.id;
1499
+ session.event.channel = decodeChannel(input.d);
1494
1500
  } else if (input.t === "CHANNEL_UPDATE") {
1495
1501
  session.type = "channel-updated";
1496
1502
  session.guildId = input.d.guild_id;
1497
- session.subtype = input.d.guild_id ? "group" : "private";
1498
1503
  session.channelId = input.d.id;
1504
+ session.event.channel = decodeChannel(input.d);
1505
+ } else if (input.t === "CHANNEL_DELETE") {
1506
+ session.type = "channel-removed";
1507
+ session.guildId = input.d.guild_id;
1508
+ session.channelId = input.d.id;
1509
+ session.event.channel = decodeChannel(input.d);
1499
1510
  } else {
1500
1511
  return;
1501
1512
  }
@@ -1608,9 +1619,9 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
1608
1619
  stack = [new State("message")];
1609
1620
  buffer = "";
1610
1621
  addition = {};
1611
- figure = null;
1622
+ figure;
1612
1623
  mode = "default";
1613
- listType = null;
1624
+ listType;
1614
1625
  rows = [];
1615
1626
  async getUrl() {
1616
1627
  const input = this.options?.session?.discord;
@@ -1657,7 +1668,9 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
1657
1668
  if (this.bot.http.isError(e) && e.response) {
1658
1669
  if (e.response.data?.code === 10015) {
1659
1670
  this.bot.logger.debug("webhook has been deleted, recreating..., %o", e.response.data);
1660
- if (!this.bot.webhookLock[this.channelId]) this.bot.webhooks[this.channelId] = null;
1671
+ if (!this.bot.webhookLock[this.channelId]) {
1672
+ this.bot.webhooks[this.channelId] = null;
1673
+ }
1661
1674
  await this.ensureWebhook();
1662
1675
  return this.post(data, headers);
1663
1676
  } else {
@@ -1708,7 +1721,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
1708
1721
  headers: { accept: type + "/*" },
1709
1722
  timeout: 1e3
1710
1723
  }).then(
1711
- (headers) => headers.get("content-type").startsWith(type),
1724
+ (headers) => headers.get("content-type")?.startsWith(type),
1712
1725
  () => false
1713
1726
  );
1714
1727
  }
@@ -1829,7 +1842,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
1829
1842
  } else if (type === "ul" || type === "ol") {
1830
1843
  this.listType = type;
1831
1844
  await this.render(children);
1832
- this.listType = null;
1845
+ this.listType = void 0;
1833
1846
  } else if (type === "li") {
1834
1847
  if (!this.buffer.endsWith("\n")) this.buffer += "\n";
1835
1848
  if (this.listType === "ol") {
@@ -1837,7 +1850,7 @@ var DiscordMessageEncoder = class extends import_core3.MessageEncoder {
1837
1850
  } else if (this.listType === "ul") {
1838
1851
  this.buffer += "- ";
1839
1852
  }
1840
- this.render(children);
1853
+ await this.render(children);
1841
1854
  this.buffer += "\n";
1842
1855
  } else if (type === "at") {
1843
1856
  if (attrs.id) {
@@ -2027,6 +2040,7 @@ var WsClient = class extends import_core4.Adapter.WsClient {
2027
2040
  return this.bot.http.ws(url + "/?v=10&encoding=json");
2028
2041
  }
2029
2042
  heartbeat() {
2043
+ if (!this.socket) return;
2030
2044
  this.bot.logger.debug(`heartbeat d ${this._d}`);
2031
2045
  this.socket.send(JSON.stringify({
2032
2046
  op: Gateway.Opcode.HEARTBEAT,
@@ -2240,25 +2254,25 @@ var DiscordBot = class extends import_core5.Bot {
2240
2254
  const channels = await this.internal.getGuildChannels(guildId);
2241
2255
  return { data: channels.map(decodeChannel) };
2242
2256
  }
2243
- createReaction(channelId, messageId, emoji) {
2244
- return this.internal.createReaction(channelId, messageId, emoji);
2257
+ createReaction(channelId, messageId, emojiId) {
2258
+ return this.internal.createReaction(channelId, messageId, emojiId);
2245
2259
  }
2246
- deleteReaction(channelId, messageId, emoji, userId) {
2260
+ deleteReaction(channelId, messageId, emojiId, userId) {
2247
2261
  if (!userId) {
2248
- return this.internal.deleteOwnReaction(channelId, messageId, emoji);
2262
+ return this.internal.deleteOwnReaction(channelId, messageId, emojiId);
2249
2263
  } else {
2250
- return this.internal.deleteUserReaction(channelId, messageId, emoji, userId);
2264
+ return this.internal.deleteUserReaction(channelId, messageId, emojiId, userId);
2251
2265
  }
2252
2266
  }
2253
- clearReaction(channelId, messageId, emoji) {
2254
- if (!emoji) {
2267
+ clearReaction(channelId, messageId, emojiId) {
2268
+ if (!emojiId) {
2255
2269
  return this.internal.deleteAllReactions(channelId, messageId);
2256
2270
  } else {
2257
- return this.internal.deleteAllReactionsForEmoji(channelId, messageId, emoji);
2271
+ return this.internal.deleteAllReactionsForEmoji(channelId, messageId, emojiId);
2258
2272
  }
2259
2273
  }
2260
- async getReactionList(channelId, messageId, emoji, after) {
2261
- const data = await this.internal.getReactions(channelId, messageId, emoji, { after, limit: 100 });
2274
+ async getReactionList(channelId, messageId, emojiId, after) {
2275
+ const data = await this.internal.getReactions(channelId, messageId, emojiId, { after, limit: 100 });
2262
2276
  return { data: data.map(decodeUser), next: data[99]?.id };
2263
2277
  }
2264
2278
  setGuildMemberRole(guildId, userId, roleId) {
@@ -2267,6 +2281,10 @@ var DiscordBot = class extends import_core5.Bot {
2267
2281
  unsetGuildMemberRole(guildId, userId, roleId) {
2268
2282
  return this.internal.removeGuildMemberRole(guildId, userId, roleId);
2269
2283
  }
2284
+ async getGuildMemberRoleList(guildId, userId, next) {
2285
+ const data = await this.internal.getGuildMember(guildId, userId);
2286
+ return { data: data.roles.map((id) => ({ id })) };
2287
+ }
2270
2288
  async getGuildRoleList(guildId) {
2271
2289
  const data = await this.internal.getGuildRoles(guildId);
2272
2290
  return { data: data.map(decodeRole) };
@@ -2320,7 +2338,7 @@ var DiscordBot = class extends import_core5.Bot {
2320
2338
  })(DiscordBot || (DiscordBot = {}));
2321
2339
 
2322
2340
  // src/index.ts
2323
- var src_default = DiscordBot;
2341
+ var index_default = DiscordBot;
2324
2342
  // Annotate the CommonJS export names for ESM import in node:
2325
2343
  0 && (module.exports = {
2326
2344
  Discord,
package/lib/message.d.ts CHANGED
@@ -5,9 +5,9 @@ export declare class DiscordMessageEncoder<C extends Context = Context> extends
5
5
  private stack;
6
6
  private buffer;
7
7
  private addition;
8
- private figure;
8
+ private figure?;
9
9
  private mode;
10
- private listType;
10
+ private listType?;
11
11
  private rows;
12
12
  private getUrl;
13
13
  post(data?: any, headers?: any): any;
@@ -5,7 +5,7 @@ export declare namespace Gateway {
5
5
  /** opcode for the payload */
6
6
  op: O;
7
7
  /** event data */
8
- d?: D;
8
+ d: D;
9
9
  /** the event name for this payload */
10
10
  t?: T;
11
11
  /** sequence number, used for resuming sessions and heartbeats */
@@ -1,7 +1,7 @@
1
- import { Dict, HTTP } from '@satorijs/core';
1
+ import { Context, Dict, HTTP } from '@satorijs/core';
2
2
  import { DiscordBot } from '../bot';
3
- export declare class Internal {
3
+ export declare class Internal<C extends Context = Context> {
4
4
  private bot;
5
- constructor(bot: DiscordBot);
5
+ constructor(bot: DiscordBot<C>);
6
6
  static define(routes: Dict<Partial<Record<HTTP.Method, string | string[]>>>): void;
7
7
  }
@@ -215,6 +215,11 @@ declare module './internal' {
215
215
  * @see https://discord.com/developers/docs/resources/guild#modify-guild-role-positions
216
216
  */
217
217
  modifyGuildRolePositions(guild_id: snowflake, param: Role.Params.ModifyPositions): Promise<Role[]>;
218
+ /**
219
+ * Returns a role object for the specified role.
220
+ * @see https://discord.com/developers/docs/resources/guild#get-guild-role
221
+ */
222
+ getGuildRole(guild_id: snowflake, role_id: snowflake): Promise<Role>;
218
223
  /**
219
224
  * Modify a guild role. Requires the MANAGE_ROLES permission. Returns the updated role on success. Fires a Guild Role Update Gateway event.
220
225
  * @see https://discord.com/developers/docs/resources/guild#modify-guild-role
package/lib/utils.d.ts CHANGED
@@ -10,8 +10,8 @@ export declare const decodeGuild: (data: Discord.Guild) => Universal.Guild;
10
10
  export declare const decodeChannel: (data: Discord.Channel) => Universal.Channel;
11
11
  export declare const decodeRole: (role: Discord.Role) => Universal.GuildRole;
12
12
  export declare const encodeRole: (role: Partial<Universal.GuildRole>) => Partial<Discord.Role>;
13
- export declare function decodeMessage(bot: DiscordBot, data: Discord.Message, message: Universal.Message, payload?: Universal.MessageLike, details?: boolean): Promise<Universal.Message>;
14
- export declare function setupMessageGuildId(session: Session, guildId: string): void;
13
+ export declare function decodeMessage<C extends Context = Context>(bot: DiscordBot<C>, data: Discord.Message, message: Universal.Message, payload?: Universal.MessageLike, details?: boolean): Promise<Universal.Message>;
14
+ export declare function setupMessageGuildId(session: Session, guildId?: string): void;
15
15
  export declare function adaptSession<C extends Context>(bot: DiscordBot<C>, input: Discord.Gateway.Payload): Promise<C[typeof import("cordis").Context.session]>;
16
16
  export declare const encodeCommand: (cmd: Universal.Command) => Discord.ApplicationCommand.Params.Create;
17
17
  export declare function encodeCommandOptions(cmd: Universal.Command): Discord.ApplicationCommand.Option[];
package/lib/ws.d.ts CHANGED
@@ -2,9 +2,9 @@ import { Adapter, Context, Schema } from '@satorijs/core';
2
2
  import { DiscordBot } from './bot';
3
3
  export declare class WsClient<C extends Context = Context> extends Adapter.WsClient<C, DiscordBot<C>> {
4
4
  _d: number;
5
- _ping: NodeJS.Timeout;
5
+ _ping?: NodeJS.Timeout;
6
6
  _sessionId: string;
7
- _resumeUrl: string;
7
+ _resumeUrl?: string;
8
8
  prepare(): Promise<WebSocket>;
9
9
  heartbeat(): void;
10
10
  accept(): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@satorijs/adapter-discord",
3
3
  "description": "Discord Adapter for Satorijs",
4
- "version": "4.5.10",
4
+ "version": "4.6.0",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
7
7
  "typings": "lib/index.d.ts",
@@ -33,10 +33,10 @@
33
33
  "chat"
34
34
  ],
35
35
  "devDependencies": {
36
- "@satorijs/core": "^4.3.3",
36
+ "@satorijs/core": "^4.6.0",
37
37
  "cordis": "^3.18.1"
38
38
  },
39
39
  "peerDependencies": {
40
- "@satorijs/core": "^4.3.3"
40
+ "@satorijs/core": "^4.6.0"
41
41
  }
42
42
  }
package/src/bot.ts CHANGED
@@ -12,8 +12,8 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
12
12
  static inject = ['http']
13
13
 
14
14
  public http: HTTP
15
- public internal: Internal
16
- public webhooks: Record<string, Webhook> = {}
15
+ public internal: Internal<C>
16
+ public webhooks: Record<string, Webhook | null> = {}
17
17
  public webhookLock: Record<string, Promise<Webhook>> = {}
18
18
  public commands: Universal.Command[] = []
19
19
 
@@ -122,7 +122,7 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
122
122
  async getGuildMemberList(guildId: string, after?: string) {
123
123
  const users = await this.internal.listGuildMembers(guildId, { after, limit: 1000 })
124
124
  const data = users.map(v => Discord.decodeGuildMember(v))
125
- return { data, next: data[999]?.user.id }
125
+ return { data, next: data[999]?.user!.id }
126
126
  }
127
127
 
128
128
  async getChannel(channelId: string) {
@@ -155,28 +155,28 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
155
155
  return { data: channels.map(Discord.decodeChannel) }
156
156
  }
157
157
 
158
- createReaction(channelId: string, messageId: string, emoji: string) {
159
- return this.internal.createReaction(channelId, messageId, emoji)
158
+ createReaction(channelId: string, messageId: string, emojiId: string) {
159
+ return this.internal.createReaction(channelId, messageId, emojiId)
160
160
  }
161
161
 
162
- deleteReaction(channelId: string, messageId: string, emoji: string, userId?: string) {
162
+ deleteReaction(channelId: string, messageId: string, emojiId: string, userId?: string) {
163
163
  if (!userId) {
164
- return this.internal.deleteOwnReaction(channelId, messageId, emoji)
164
+ return this.internal.deleteOwnReaction(channelId, messageId, emojiId)
165
165
  } else {
166
- return this.internal.deleteUserReaction(channelId, messageId, emoji, userId)
166
+ return this.internal.deleteUserReaction(channelId, messageId, emojiId, userId)
167
167
  }
168
168
  }
169
169
 
170
- clearReaction(channelId: string, messageId: string, emoji?: string) {
171
- if (!emoji) {
170
+ clearReaction(channelId: string, messageId: string, emojiId?: string) {
171
+ if (!emojiId) {
172
172
  return this.internal.deleteAllReactions(channelId, messageId)
173
173
  } else {
174
- return this.internal.deleteAllReactionsForEmoji(channelId, messageId, emoji)
174
+ return this.internal.deleteAllReactionsForEmoji(channelId, messageId, emojiId)
175
175
  }
176
176
  }
177
177
 
178
- async getReactionList(channelId: string, messageId: string, emoji: string, after?: string) {
179
- const data = await this.internal.getReactions(channelId, messageId, emoji, { after, limit: 100 })
178
+ async getReactionList(channelId: string, messageId: string, emojiId: string, after?: string) {
179
+ const data = await this.internal.getReactions(channelId, messageId, emojiId, { after, limit: 100 })
180
180
  return { data: data.map(Discord.decodeUser), next: data[99]?.id }
181
181
  }
182
182
 
@@ -188,6 +188,11 @@ export class DiscordBot<C extends Context = Context> extends Bot<C, DiscordBot.C
188
188
  return this.internal.removeGuildMemberRole(guildId, userId, roleId)
189
189
  }
190
190
 
191
+ async getGuildMemberRoleList(guildId: string, userId: string, next?: string) {
192
+ const data = await this.internal.getGuildMember(guildId, userId)
193
+ return { data: data.roles.map(id => ({ id })) }
194
+ }
195
+
191
196
  async getGuildRoleList(guildId: string) {
192
197
  const data = await this.internal.getGuildRoles(guildId)
193
198
  return { data: data.map(Discord.decodeRole) }
package/src/message.ts CHANGED
@@ -19,9 +19,9 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
19
19
  private stack: State[] = [new State('message')]
20
20
  private buffer: string = ''
21
21
  private addition: Dict = {}
22
- private figure: h = null
22
+ private figure?: h
23
23
  private mode: RenderMode = 'default'
24
- private listType: 'ol' | 'ul' = null
24
+ private listType?: 'ol' | 'ul'
25
25
  private rows: ActionRow[] = []
26
26
  private async getUrl() {
27
27
  const input = this.options?.session?.discord
@@ -73,7 +73,9 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
73
73
  if (this.bot.http.isError(e) && e.response) {
74
74
  if (e.response.data?.code === 10015) {
75
75
  this.bot.logger.debug('webhook has been deleted, recreating..., %o', e.response.data)
76
- if (!this.bot.webhookLock[this.channelId]) this.bot.webhooks[this.channelId] = null
76
+ if (!this.bot.webhookLock[this.channelId]) {
77
+ this.bot.webhooks[this.channelId] = null
78
+ }
77
79
  await this.ensureWebhook()
78
80
  return this.post(data, headers)
79
81
  } else {
@@ -134,7 +136,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
134
136
  headers: { accept: type + '/*' },
135
137
  timeout: 1000,
136
138
  }).then(
137
- (headers) => headers.get('content-type').startsWith(type),
139
+ (headers) => headers.get('content-type')?.startsWith(type),
138
140
  () => false,
139
141
  )
140
142
  }
@@ -260,7 +262,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
260
262
  } else if (type === 'ul' || type === 'ol') {
261
263
  this.listType = type
262
264
  await this.render(children)
263
- this.listType = null
265
+ this.listType = undefined
264
266
  } else if (type === 'li') {
265
267
  if (!this.buffer.endsWith('\n')) this.buffer += '\n'
266
268
  if (this.listType === 'ol') {
@@ -268,7 +270,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
268
270
  } else if (this.listType === 'ul') {
269
271
  this.buffer += '- '
270
272
  }
271
- this.render(children)
273
+ await this.render(children)
272
274
  this.buffer += '\n'
273
275
  } else if (type === 'at') {
274
276
  if (attrs.id) {
@@ -343,7 +345,7 @@ export class DiscordMessageEncoder<C extends Context = Context> extends MessageE
343
345
  if (this.stack[0].type === 'forward' && this.stack[0].fakeMessageMap[attrs.id]?.length >= 1) {
344
346
  // quote to fake message, eg. 1st message has id (in channel or thread), later message quote to it
345
347
  replyId = this.stack[0].fakeMessageMap[attrs.id][0].id
346
- channelId = this.stack[0].fakeMessageMap[attrs.id][0].channel.id
348
+ channelId = this.stack[0].fakeMessageMap[attrs.id][0].channel!.id
347
349
  }
348
350
  const quote = await this.bot.getMessage(channelId, replyId)
349
351
  if (!guildId) {
@@ -6,7 +6,7 @@ export namespace Gateway {
6
6
  /** opcode for the payload */
7
7
  op: O
8
8
  /** event data */
9
- d?: D
9
+ d: D
10
10
  /** the event name for this payload */
11
11
  t?: T
12
12
  /** sequence number, used for resuming sessions and heartbeats */
@@ -1,8 +1,8 @@
1
- import { Dict, HTTP, makeArray } from '@satorijs/core'
1
+ import { Context, Dict, HTTP, makeArray } from '@satorijs/core'
2
2
  import { DiscordBot } from '../bot'
3
3
 
4
- export class Internal {
5
- constructor(private bot: DiscordBot) {}
4
+ export class Internal<C extends Context = Context> {
5
+ constructor(private bot: DiscordBot<C>) {}
6
6
 
7
7
  static define(routes: Dict<Partial<Record<HTTP.Method, string | string[]>>>) {
8
8
  for (const path in routes) {
package/src/types/role.ts CHANGED
@@ -227,6 +227,11 @@ declare module './internal' {
227
227
  * @see https://discord.com/developers/docs/resources/guild#modify-guild-role-positions
228
228
  */
229
229
  modifyGuildRolePositions(guild_id: snowflake, param: Role.Params.ModifyPositions): Promise<Role[]>
230
+ /**
231
+ * Returns a role object for the specified role.
232
+ * @see https://discord.com/developers/docs/resources/guild#get-guild-role
233
+ */
234
+ getGuildRole(guild_id: snowflake, role_id: snowflake): Promise<Role>
230
235
  /**
231
236
  * Modify a guild role. Requires the MANAGE_ROLES permission. Returns the updated role on success. Fires a Guild Role Update Gateway event.
232
237
  * @see https://discord.com/developers/docs/resources/guild#modify-guild-role
@@ -247,6 +252,7 @@ Internal.define({
247
252
  PATCH: 'modifyGuildRolePositions',
248
253
  },
249
254
  '/guilds/{guild.id}/roles/{role.id}': {
255
+ GET: 'getGuildRole',
250
256
  PATCH: 'modifyGuildRole',
251
257
  DELETE: 'deleteGuildRole',
252
258
  },
package/src/utils.ts CHANGED
@@ -28,8 +28,8 @@ export const decodeUser = (user: Discord.User): Universal.User => ({
28
28
  export const decodeGuildMember = (member: Partial<Discord.GuildMember>): Universal.GuildMember => ({
29
29
  user: member.user && decodeUser(member.user),
30
30
  nick: member.nick,
31
- roles: member.roles,
32
- joinedAt: member.joined_at && new Date(member.joined_at).valueOf(),
31
+ roles: member.roles?.map(id => ({ id })),
32
+ joinedAt: member.joined_at ? new Date(member.joined_at).valueOf() : undefined,
33
33
  })
34
34
 
35
35
  export const decodeGuild = (data: Discord.Guild): Universal.Guild => ({
@@ -56,11 +56,11 @@ export const decodeRole = (role: Discord.Role): Universal.GuildRole => ({
56
56
 
57
57
  export const encodeRole = (role: Partial<Universal.GuildRole>): Partial<Discord.Role> => ({
58
58
  ...role,
59
- permissions: role.permissions && '' + role.permissions,
59
+ permissions: role.permissions ? '' + role.permissions : undefined,
60
60
  })
61
61
 
62
- export async function decodeMessage(
63
- bot: DiscordBot,
62
+ export async function decodeMessage<C extends Context = Context>(
63
+ bot: DiscordBot<C>,
64
64
  data: Discord.Message,
65
65
  message: Universal.Message,
66
66
  payload: Universal.MessageLike = message,
@@ -167,11 +167,11 @@ export async function decodeMessage(
167
167
  // THREAD_STARTER_MESSAGE (21) 事件下,message_reference 有 message_id
168
168
  if (details && data.message_reference?.message_id) {
169
169
  const { message_id, channel_id } = data.message_reference
170
- message.quote = await bot.getMessage(channel_id, message_id, false)
170
+ message.quote = await bot.getMessage(channel_id!, message_id, false)
171
171
  }
172
172
 
173
173
  message.createdAt = new Date(data.timestamp).valueOf()
174
- message.updatedAt = data.edited_timestamp && new Date(data.edited_timestamp).valueOf()
174
+ message.updatedAt = data.edited_timestamp ? new Date(data.edited_timestamp).valueOf() : undefined
175
175
  if (!payload) return message
176
176
  payload.channel = {
177
177
  id: data.channel_id,
@@ -183,7 +183,7 @@ export async function decodeMessage(
183
183
  return message
184
184
  }
185
185
 
186
- export function setupMessageGuildId(session: Session, guildId: string) {
186
+ export function setupMessageGuildId(session: Session, guildId?: string) {
187
187
  session.guildId = guildId
188
188
  session.isDirect = !guildId
189
189
  session.subtype = guildId ? 'group' : 'private'
@@ -226,11 +226,11 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
226
226
  // if (!session.content) return
227
227
  } else if (input.t === 'MESSAGE_UPDATE') {
228
228
  session.type = 'message-updated'
229
- const message = await bot._getMessage(input.d.channel_id, input.d.id)
229
+ const message = await bot._getMessage(input.d.channel_id!, input.d.id!)
230
230
  // Unlike creates, message updates may contain only a subset of the full message object payload
231
231
  // https://discord.com/developers/docs/topics/gateway-events#message-update
232
232
  await decodeMessage(bot, message, session.event.message = {}, session.event)
233
- const channel = await bot.internal.getChannel(input.d.channel_id)
233
+ const channel = await bot.internal.getChannel(input.d.channel_id!)
234
234
  setupMessageGuildId(session, channel.guild_id)
235
235
  // if (!session.content) return
236
236
  } else if (input.t === 'MESSAGE_DELETE') {
@@ -279,7 +279,7 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
279
279
  session.subtype = input.d.guild_id ? 'group' : 'private'
280
280
  session.channelId = input.d.channel_id
281
281
  session.guildId = input.d.guild_id
282
- session.userId = session.isDirect ? input.d.user.id : input.d.member.user.id
282
+ session.userId = session.isDirect ? input.d.user!.id : input.d.member!.user!.id
283
283
  session.messageId = input.d.id
284
284
  session.content = ''
285
285
  session.event.argv = decodeArgv(data, command)
@@ -296,7 +296,7 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
296
296
  session.subtype = input.d.guild_id ? 'group' : 'private'
297
297
  session.channelId = input.d.channel_id
298
298
  session.guildId = input.d.guild_id
299
- session.userId = session.isDirect ? input.d.user.id : input.d.member.user.id
299
+ session.userId = session.isDirect ? input.d.user!.id : input.d.member!.user!.id
300
300
  session.messageId = input.d.id
301
301
  session.content = user_input
302
302
  } else if (input.t === 'INTERACTION_CREATE' && input.d.type === Discord.Interaction.Type.MESSAGE_COMPONENT) {
@@ -328,17 +328,27 @@ export async function adaptSession<C extends Context>(bot: DiscordBot<C>, input:
328
328
  session.isDirect = !input.d.guild_id
329
329
  session.channelId = input.d.channel_id
330
330
  session.guildId = input.d.guild_id
331
- session.userId = session.isDirect ? input.d.user.id : input.d.member.user.id
331
+ session.userId = session.isDirect ? input.d.user!.id : input.d.member!.user!.id
332
332
  session.messageId = input.d.id
333
333
  session.content = ''
334
334
  session.event.button = {
335
335
  id,
336
336
  }
337
+ } else if (input.t === 'CHANNEL_CREATE') {
338
+ session.type = 'channel-added'
339
+ session.guildId = input.d.guild_id
340
+ session.channelId = input.d.id
341
+ session.event.channel = decodeChannel(input.d)
337
342
  } else if (input.t === 'CHANNEL_UPDATE') {
338
343
  session.type = 'channel-updated'
339
344
  session.guildId = input.d.guild_id
340
- session.subtype = input.d.guild_id ? 'group' : 'private'
341
345
  session.channelId = input.d.id
346
+ session.event.channel = decodeChannel(input.d)
347
+ } else if (input.t === 'CHANNEL_DELETE') {
348
+ session.type = 'channel-removed'
349
+ session.guildId = input.d.guild_id
350
+ session.channelId = input.d.id
351
+ session.event.channel = decodeChannel(input.d)
342
352
  } else {
343
353
  return
344
354
  }
@@ -441,5 +451,5 @@ export function encodeCommandOptions(cmd: Universal.Command): Discord.Applicatio
441
451
  })
442
452
  }
443
453
  }
444
- return result.sort((a, b) => +b.required - +a.required)
454
+ return result.sort((a, b) => +b.required! - +a.required!)
445
455
  }