seyfert 4.5.0 → 5.0.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.
Files changed (230) hide show
  1. package/lib/api/Routes/cdn.d.ts +2 -2
  2. package/lib/api/Routes/guilds.d.ts +2 -2
  3. package/lib/api/Routes/invites.d.ts +2 -2
  4. package/lib/api/api.d.ts +20 -8
  5. package/lib/api/api.js +198 -44
  6. package/lib/api/shared.d.ts +30 -1
  7. package/lib/api/utils/constants.d.ts +1 -1
  8. package/lib/api/utils/constants.js +1 -1
  9. package/lib/api/utils/utils.d.ts +2 -1
  10. package/lib/api/utils/utils.js +1 -1
  11. package/lib/builders/Attachment.d.ts +1 -1
  12. package/lib/builders/Attachment.js +30 -8
  13. package/lib/builders/MediaGallery.d.ts +2 -2
  14. package/lib/builders/MediaGallery.js +10 -0
  15. package/lib/builders/Modal.d.ts +18 -8
  16. package/lib/builders/Modal.js +36 -7
  17. package/lib/builders/Poll.js +18 -0
  18. package/lib/builders/RadioGroup.d.ts +4 -3
  19. package/lib/builders/RadioGroup.js +24 -3
  20. package/lib/builders/SelectMenu.d.ts +8 -6
  21. package/lib/builders/SelectMenu.js +24 -3
  22. package/lib/builders/types.d.ts +3 -2
  23. package/lib/cache/adapters/default.d.ts +1 -1
  24. package/lib/cache/adapters/default.js +23 -26
  25. package/lib/cache/adapters/limited.d.ts +1 -0
  26. package/lib/cache/adapters/limited.js +47 -33
  27. package/lib/cache/index.d.ts +19 -25
  28. package/lib/cache/index.js +58 -6
  29. package/lib/cache/resources/bans.d.ts +1 -1
  30. package/lib/cache/resources/bans.js +4 -4
  31. package/lib/cache/resources/channels.d.ts +1 -1
  32. package/lib/cache/resources/channels.js +4 -4
  33. package/lib/cache/resources/default/base.d.ts +1 -1
  34. package/lib/cache/resources/default/base.js +8 -8
  35. package/lib/cache/resources/default/guild-based.d.ts +5 -5
  36. package/lib/cache/resources/default/guild-based.js +29 -16
  37. package/lib/cache/resources/default/guild-related.d.ts +5 -5
  38. package/lib/cache/resources/default/guild-related.js +14 -14
  39. package/lib/cache/resources/emojis.d.ts +1 -1
  40. package/lib/cache/resources/emojis.js +4 -4
  41. package/lib/cache/resources/guilds.js +28 -15
  42. package/lib/cache/resources/members.d.ts +1 -1
  43. package/lib/cache/resources/members.js +6 -6
  44. package/lib/cache/resources/messages.d.ts +7 -2
  45. package/lib/cache/resources/messages.js +43 -20
  46. package/lib/cache/resources/overwrites.d.ts +1 -1
  47. package/lib/cache/resources/overwrites.js +5 -8
  48. package/lib/cache/resources/roles.d.ts +1 -1
  49. package/lib/cache/resources/roles.js +4 -4
  50. package/lib/cache/resources/stickers.d.ts +1 -1
  51. package/lib/cache/resources/stickers.js +4 -4
  52. package/lib/cache/resources/users.js +4 -4
  53. package/lib/cache/resources/voice-states.d.ts +1 -1
  54. package/lib/cache/resources/voice-states.js +4 -4
  55. package/lib/client/base.d.ts +83 -24
  56. package/lib/client/base.js +594 -39
  57. package/lib/client/client.d.ts +28 -3
  58. package/lib/client/client.js +33 -9
  59. package/lib/client/collectors.d.ts +9 -8
  60. package/lib/client/collectors.js +19 -52
  61. package/lib/client/httpclient.d.ts +3 -0
  62. package/lib/client/index.d.ts +3 -1
  63. package/lib/client/index.js +4 -0
  64. package/lib/client/intents.d.ts +3 -0
  65. package/lib/client/intents.js +9 -0
  66. package/lib/client/plugins/api.d.ts +4 -0
  67. package/lib/client/plugins/api.js +550 -0
  68. package/lib/client/plugins/errors.d.ts +25 -0
  69. package/lib/client/plugins/errors.js +79 -0
  70. package/lib/client/plugins/order.d.ts +10 -0
  71. package/lib/client/plugins/order.js +32 -0
  72. package/lib/client/plugins/registry.d.ts +273 -0
  73. package/lib/client/plugins/registry.js +868 -0
  74. package/lib/client/plugins/shared.d.ts +23 -0
  75. package/lib/client/plugins/shared.js +193 -0
  76. package/lib/client/plugins/types.d.ts +398 -0
  77. package/lib/client/plugins/types.js +8 -0
  78. package/lib/client/plugins.d.ts +78 -0
  79. package/lib/client/plugins.js +558 -0
  80. package/lib/client/transformers.d.ts +33 -33
  81. package/lib/client/workerclient.d.ts +10 -1
  82. package/lib/client/workerclient.js +27 -17
  83. package/lib/collection.d.ts +10 -8
  84. package/lib/collection.js +19 -25
  85. package/lib/commands/applications/chat.d.ts +20 -18
  86. package/lib/commands/applications/chat.js +39 -14
  87. package/lib/commands/applications/chatcontext.d.ts +23 -15
  88. package/lib/commands/applications/chatcontext.js +23 -2
  89. package/lib/commands/applications/entryPoint.d.ts +4 -3
  90. package/lib/commands/applications/entryPoint.js +1 -1
  91. package/lib/commands/applications/entrycontext.d.ts +7 -9
  92. package/lib/commands/applications/entrycontext.js +3 -1
  93. package/lib/commands/applications/menu.d.ts +4 -3
  94. package/lib/commands/applications/menucontext.d.ts +7 -9
  95. package/lib/commands/applications/menucontext.js +3 -1
  96. package/lib/commands/applications/options.d.ts +23 -23
  97. package/lib/commands/applications/shared.d.ts +39 -17
  98. package/lib/commands/decorators.d.ts +50 -38
  99. package/lib/commands/decorators.js +15 -5
  100. package/lib/commands/handle.d.ts +19 -8
  101. package/lib/commands/handle.js +224 -143
  102. package/lib/commands/handler.d.ts +21 -8
  103. package/lib/commands/handler.js +157 -69
  104. package/lib/commands/index.d.ts +1 -0
  105. package/lib/commands/optionresolver.d.ts +2 -2
  106. package/lib/common/it/colors.js +12 -2
  107. package/lib/common/it/error.d.ts +9 -0
  108. package/lib/common/it/error.js +8 -0
  109. package/lib/common/it/fake-promise.d.ts +4 -0
  110. package/lib/common/it/fake-promise.js +10 -0
  111. package/lib/common/it/formatter.d.ts +14 -11
  112. package/lib/common/it/formatter.js +4 -3
  113. package/lib/common/it/logger.d.ts +7 -1
  114. package/lib/common/it/logger.js +24 -6
  115. package/lib/common/it/utils.d.ts +6 -8
  116. package/lib/common/it/utils.js +44 -42
  117. package/lib/common/shorters/application.d.ts +3 -3
  118. package/lib/common/shorters/application.js +3 -2
  119. package/lib/common/shorters/bans.d.ts +8 -4
  120. package/lib/common/shorters/bans.js +13 -5
  121. package/lib/common/shorters/channels.d.ts +4 -4
  122. package/lib/common/shorters/channels.js +4 -4
  123. package/lib/common/shorters/emojis.js +1 -0
  124. package/lib/common/shorters/guilds.d.ts +8 -8
  125. package/lib/common/shorters/guilds.js +14 -31
  126. package/lib/common/shorters/interaction.d.ts +1 -1
  127. package/lib/common/shorters/invites.d.ts +201 -201
  128. package/lib/common/shorters/members.d.ts +7 -7
  129. package/lib/common/shorters/members.js +13 -14
  130. package/lib/common/shorters/messages.d.ts +2 -2
  131. package/lib/common/shorters/soundboard.d.ts +5 -5
  132. package/lib/common/shorters/users.d.ts +1 -1
  133. package/lib/common/shorters/webhook.d.ts +3 -2
  134. package/lib/common/shorters/webhook.js +0 -7
  135. package/lib/common/types/options.d.ts +4 -0
  136. package/lib/common/types/util.d.ts +8 -0
  137. package/lib/common/types/write.d.ts +2 -1
  138. package/lib/components/BaseSelectMenuComponent.d.ts +1 -1
  139. package/lib/components/BaseSelectMenuComponent.js +1 -1
  140. package/lib/components/ButtonComponent.d.ts +3 -3
  141. package/lib/components/ChannelSelectMenuComponent.d.ts +2 -2
  142. package/lib/components/File.d.ts +1 -1
  143. package/lib/components/MediaGallery.d.ts +1 -1
  144. package/lib/components/MentionableSelectMenuComponent.d.ts +1 -1
  145. package/lib/components/RoleSelectMenuComponent.d.ts +1 -1
  146. package/lib/components/Separator.d.ts +1 -1
  147. package/lib/components/StringSelectMenuComponent.d.ts +1 -1
  148. package/lib/components/TextInputComponent.d.ts +1 -1
  149. package/lib/components/Thumbnail.d.ts +1 -1
  150. package/lib/components/UserSelectMenuComponent.d.ts +1 -1
  151. package/lib/components/componentcommand.d.ts +8 -7
  152. package/lib/components/componentcontext.d.ts +24 -36
  153. package/lib/components/componentcontext.js +7 -17
  154. package/lib/components/handler.d.ts +17 -7
  155. package/lib/components/handler.js +108 -49
  156. package/lib/components/index.d.ts +1 -0
  157. package/lib/components/index.js +1 -0
  158. package/lib/components/interactioncontext.d.ts +45 -0
  159. package/lib/components/interactioncontext.js +93 -0
  160. package/lib/components/modalcommand.d.ts +5 -4
  161. package/lib/components/modalcontext.d.ts +39 -20
  162. package/lib/components/modalcontext.js +59 -6
  163. package/lib/events/event.d.ts +9 -3
  164. package/lib/events/handler.d.ts +51 -6
  165. package/lib/events/handler.js +165 -36
  166. package/lib/events/hooks/application_command.d.ts +1 -1
  167. package/lib/events/hooks/auto_moderation.d.ts +2 -2
  168. package/lib/events/hooks/guild.d.ts +150 -150
  169. package/lib/events/hooks/interactions.d.ts +1 -1
  170. package/lib/events/hooks/invite.d.ts +20 -20
  171. package/lib/events/hooks/message.d.ts +27 -27
  172. package/lib/events/hooks/presence.d.ts +11 -11
  173. package/lib/events/hooks/soundboard.d.ts +6 -6
  174. package/lib/events/hooks/stage.d.ts +2 -2
  175. package/lib/events/hooks/subscriptions.d.ts +3 -3
  176. package/lib/events/hooks/thread.d.ts +30 -30
  177. package/lib/events/hooks/voice.d.ts +3 -4
  178. package/lib/events/hooks/voice.js +2 -1
  179. package/lib/events/utils.d.ts +4 -0
  180. package/lib/events/utils.js +59 -0
  181. package/lib/index.d.ts +9 -4
  182. package/lib/index.js +13 -8
  183. package/lib/langs/handler.d.ts +14 -11
  184. package/lib/langs/handler.js +46 -9
  185. package/lib/langs/router.d.ts +10 -3
  186. package/lib/structures/Application.d.ts +1 -1
  187. package/lib/structures/Emoji.d.ts +3 -3
  188. package/lib/structures/Emoji.js +2 -2
  189. package/lib/structures/Guild.d.ts +154 -154
  190. package/lib/structures/GuildBan.d.ts +4 -4
  191. package/lib/structures/GuildBan.js +3 -3
  192. package/lib/structures/GuildMember.d.ts +7 -7
  193. package/lib/structures/GuildMember.js +28 -7
  194. package/lib/structures/GuildRole.d.ts +1 -1
  195. package/lib/structures/GuildRole.js +2 -2
  196. package/lib/structures/Interaction.d.ts +11 -9
  197. package/lib/structures/Interaction.js +33 -12
  198. package/lib/structures/Message.d.ts +21 -14
  199. package/lib/structures/Message.js +29 -14
  200. package/lib/structures/User.d.ts +1 -1
  201. package/lib/structures/VoiceState.d.ts +4 -0
  202. package/lib/structures/VoiceState.js +13 -1
  203. package/lib/structures/Webhook.d.ts +9 -1
  204. package/lib/structures/Webhook.js +4 -1
  205. package/lib/structures/channels.d.ts +148 -134
  206. package/lib/structures/channels.js +27 -26
  207. package/lib/structures/extra/BitField.d.ts +4 -4
  208. package/lib/structures/extra/BitField.js +20 -4
  209. package/lib/structures/extra/DiscordBase.js +1 -1
  210. package/lib/structures/extra/Permissions.d.ts +2 -4
  211. package/lib/structures/extra/Permissions.js +1 -17
  212. package/lib/types/payloads/_interactions/responses.d.ts +2 -2
  213. package/lib/types/payloads/components.d.ts +4 -4
  214. package/lib/websocket/SharedTypes.d.ts +4 -4
  215. package/lib/websocket/constants/index.d.ts +1 -1
  216. package/lib/websocket/constants/index.js +3 -2
  217. package/lib/websocket/discord/events/memberUpdate.js +2 -2
  218. package/lib/websocket/discord/heartbeater.d.ts +1 -0
  219. package/lib/websocket/discord/heartbeater.js +7 -0
  220. package/lib/websocket/discord/shard.d.ts +2 -2
  221. package/lib/websocket/discord/shard.js +15 -13
  222. package/lib/websocket/discord/sharder.d.ts +8 -7
  223. package/lib/websocket/discord/sharder.js +25 -5
  224. package/lib/websocket/discord/shared.d.ts +19 -6
  225. package/lib/websocket/discord/socket/custom.js +5 -0
  226. package/lib/websocket/discord/worker.d.ts +1 -0
  227. package/lib/websocket/discord/worker.js +2 -0
  228. package/lib/websocket/discord/workermanager.d.ts +25 -11
  229. package/lib/websocket/discord/workermanager.js +41 -10
  230. package/package.json +12 -16
@@ -8,10 +8,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.DirectoryChannel = exports.NewsChannel = exports.CategoryChannel = exports.ThreadChannel = exports.ForumChannel = exports.MediaChannel = exports.StageChannel = exports.VoiceChannel = exports.DMChannel = exports.TextGuildChannel = exports.WebhookChannelMethods = exports.WebhookGuildMethods = exports.VoiceChannelMethods = exports.ThreadOnlyMethods = exports.TopicableGuildChannel = exports.TextBaseGuildChannel = exports.MessagesMethods = exports.BaseGuildChannel = exports.BaseChannel = exports.BaseNoEditableChannel = void 0;
10
10
  exports.channelFrom = channelFrom;
11
- const __1 = require("..");
12
11
  const builders_1 = require("../builders");
13
- const client_1 = require("../client");
14
- const common_1 = require("../common");
12
+ const transformers_1 = require("../client/transformers");
13
+ const formatter_1 = require("../common/it/formatter");
14
+ const utils_1 = require("../common/it/utils");
15
15
  const mixer_1 = require("../deps/mixer");
16
16
  const types_1 = require("../types");
17
17
  const DiscordBase_1 = require("./extra/DiscordBase");
@@ -24,7 +24,7 @@ class BaseNoEditableChannel extends DiscordBase_1.DiscordBase {
24
24
  }
25
25
  /** The URL to the channel */
26
26
  get url() {
27
- return __1.Formatter.channelLink(this.id);
27
+ return formatter_1.Formatter.channelLink(this.id);
28
28
  }
29
29
  fetch(mode = 'flow') {
30
30
  switch (mode) {
@@ -39,7 +39,7 @@ class BaseNoEditableChannel extends DiscordBase_1.DiscordBase {
39
39
  return this.client.channels.delete(this.id, { reason });
40
40
  }
41
41
  toString() {
42
- return __1.Formatter.channelMention(this.id);
42
+ return formatter_1.Formatter.channelMention(this.id);
43
43
  }
44
44
  isStage() {
45
45
  return this.type === types_1.ChannelType.GuildStageVoice;
@@ -77,6 +77,12 @@ class BaseNoEditableChannel extends DiscordBase_1.DiscordBase {
77
77
  isGuildTextable() {
78
78
  return !this.isDM() && this.isTextable();
79
79
  }
80
+ isNamed() {
81
+ return typeof this.name === 'string';
82
+ }
83
+ isGuild() {
84
+ return !this.isDM();
85
+ }
80
86
  isThreadOnly() {
81
87
  return this.isForum() || this.isMedia();
82
88
  }
@@ -148,7 +154,7 @@ class BaseGuildChannel extends BaseChannel {
148
154
  }
149
155
  }
150
156
  get url() {
151
- return __1.Formatter.channelLink(this.id, this.guildId);
157
+ return formatter_1.Formatter.channelLink(this.id, this.guildId);
152
158
  }
153
159
  setPosition(position, reason) {
154
160
  return this.edit({ position }, reason);
@@ -211,7 +217,7 @@ class MessagesMethods extends DiscordBase_1.DiscordBase {
211
217
  const payload = {
212
218
  allowed_mentions: self.options?.allowedMentions,
213
219
  ...body,
214
- embeds: body.embeds?.map(x => (x instanceof builders_1.Embed ? x.toJSON() : x)),
220
+ embeds: body.embeds?.map(x => ('toJSON' in x ? x.toJSON() : x)),
215
221
  components: body.components?.map(x => ('toJSON' in x ? x.toJSON() : x)) ?? undefined,
216
222
  poll: poll ? (poll instanceof builders_1.PollBuilder ? poll.toJSON() : poll) : undefined,
217
223
  };
@@ -251,32 +257,32 @@ exports.TextBaseGuildChannel = TextBaseGuildChannel = __decorate([
251
257
  function channelFrom(data, client) {
252
258
  switch (data.type) {
253
259
  case types_1.ChannelType.GuildStageVoice:
254
- return client_1.Transformers.StageChannel(client, data);
260
+ return transformers_1.Transformers.StageChannel(client, data);
255
261
  case types_1.ChannelType.GuildMedia:
256
- return client_1.Transformers.MediaChannel(client, data);
262
+ return transformers_1.Transformers.MediaChannel(client, data);
257
263
  case types_1.ChannelType.DM:
258
- return client_1.Transformers.DMChannel(client, data);
264
+ return transformers_1.Transformers.DMChannel(client, data);
259
265
  case types_1.ChannelType.GuildForum:
260
- return client_1.Transformers.ForumChannel(client, data);
266
+ return transformers_1.Transformers.ForumChannel(client, data);
261
267
  case types_1.ChannelType.AnnouncementThread:
262
268
  case types_1.ChannelType.PrivateThread:
263
269
  case types_1.ChannelType.PublicThread:
264
- return client_1.Transformers.ThreadChannel(client, data);
270
+ return transformers_1.Transformers.ThreadChannel(client, data);
265
271
  case types_1.ChannelType.GuildDirectory:
266
- return client_1.Transformers.DirectoryChannel(client, data);
272
+ return transformers_1.Transformers.DirectoryChannel(client, data);
267
273
  case types_1.ChannelType.GuildVoice:
268
- return client_1.Transformers.VoiceChannel(client, data);
274
+ return transformers_1.Transformers.VoiceChannel(client, data);
269
275
  case types_1.ChannelType.GuildText:
270
- return client_1.Transformers.TextGuildChannel(client, data);
276
+ return transformers_1.Transformers.TextGuildChannel(client, data);
271
277
  case types_1.ChannelType.GuildCategory:
272
- return client_1.Transformers.CategoryChannel(client, data);
278
+ return transformers_1.Transformers.CategoryChannel(client, data);
273
279
  case types_1.ChannelType.GuildAnnouncement:
274
- return client_1.Transformers.NewsChannel(client, data);
280
+ return transformers_1.Transformers.NewsChannel(client, data);
275
281
  default: {
276
282
  if ('guild_id' in data) {
277
- return client_1.Transformers.BaseGuildChannel(client, data);
283
+ return transformers_1.Transformers.BaseGuildChannel(client, data);
278
284
  }
279
- return client_1.Transformers.BaseChannel(client, data);
285
+ return transformers_1.Transformers.BaseChannel(client, data);
280
286
  }
281
287
  }
282
288
  }
@@ -335,19 +341,14 @@ class VoiceChannelMethods extends DiscordBase_1.DiscordBase {
335
341
  states() {
336
342
  if (!this.guildId)
337
343
  return this.cache.adapter.isAsync ? Promise.resolve([]) : [];
338
- return (0, common_1.fakePromise)(this.cache.voiceStates?.values(this.guildId) ??
344
+ return (0, utils_1.fakePromise)(this.cache.voiceStates?.values(this.guildId) ??
339
345
  (this.cache.adapter.isAsync ? Promise.resolve([]) : [])).then(states => {
340
346
  return states.filter(state => state.channelId === this.id);
341
347
  });
342
348
  }
343
349
  async members(force) {
344
- const collection = new __1.Collection();
345
350
  const states = await this.states();
346
- for (const state of states) {
347
- const member = await state.member(force);
348
- collection.set(member.id, member);
349
- }
350
- return collection;
351
+ return await Promise.all(states.map(state => state.member(force)));
351
352
  }
352
353
  }
353
354
  exports.VoiceChannelMethods = VoiceChannelMethods;
@@ -1,4 +1,4 @@
1
- export type BitFieldResolvable<T extends object> = keyof T | bigint;
1
+ export type BitFieldResolvable<T extends object> = keyof T | number | bigint | string;
2
2
  export declare class BitField<T extends object> {
3
3
  static None: bigint;
4
4
  Flags: Record<string, bigint>;
@@ -6,12 +6,12 @@ export declare class BitField<T extends object> {
6
6
  constructor(bitfields?: BitFieldResolvable<T>);
7
7
  set bits(bits: BitFieldResolvable<T>);
8
8
  get bits(): bigint;
9
- has(bits: BitFieldResolvable<T>[]): boolean;
9
+ has(bits: BitFieldResolvable<T> | BitFieldResolvable<T>[]): boolean;
10
10
  missings(bits: BitFieldResolvable<T>[]): bigint[];
11
11
  equals(other: BitFieldResolvable<T>[]): boolean;
12
- keys(bits?: BitFieldResolvable<T>[]): string[];
12
+ keys(bits?: BitFieldResolvable<T>[]): (keyof T)[];
13
13
  values(bits?: BitFieldResolvable<T>[]): bigint[];
14
14
  add(bits: BitFieldResolvable<T>[]): bigint;
15
15
  remove(bits: BitFieldResolvable<T>[]): bigint;
16
- resolve(bits: BitFieldResolvable<T> | BitFieldResolvable<T>[]): bigint;
16
+ resolve(bits: BitFieldResolvable<T> | BitFieldResolvable<T>[], _flags?: Record<string, bigint>): bigint;
17
17
  }
@@ -16,7 +16,8 @@ class BitField {
16
16
  return this.bit;
17
17
  }
18
18
  has(bits) {
19
- const bitsResolved = bits.map(bit => this.resolve(bit));
19
+ const data = Array.isArray(bits) ? bits : [bits];
20
+ const bitsResolved = data.map(bit => this.resolve(bit));
20
21
  return bitsResolved.every(bit => (this.bits & bit) === bit);
21
22
  }
22
23
  missings(bits) {
@@ -60,21 +61,36 @@ class BitField {
60
61
  }
61
62
  return this.bits;
62
63
  }
63
- resolve(bits) {
64
+ resolve(bits, _flags) {
65
+ const flags = _flags ?? this.Flags;
64
66
  let bitsResult = 0n;
65
67
  for (const bit of Array.isArray(bits) ? bits : [bits]) {
66
68
  switch (typeof bit) {
67
69
  case 'string':
68
- bitsResult |= this.resolve([this.Flags[bit]]);
70
+ if (Object.hasOwn(flags, bit)) {
71
+ bitsResult |= flags[bit];
72
+ }
73
+ else if (/^\d+$/.test(bit)) {
74
+ bitsResult |= BigInt(bit);
75
+ }
76
+ else {
77
+ throw new TypeError(`Cannot resolve bitfield: ${bit}`);
78
+ }
69
79
  break;
70
80
  case 'number':
81
+ if (!Number.isSafeInteger(bit) || bit < 0) {
82
+ throw new TypeError(`Cannot resolve bitfield: ${bit}`);
83
+ }
71
84
  bitsResult |= BigInt(bit);
72
85
  break;
73
86
  case 'bigint':
87
+ if (bit < 0n) {
88
+ throw new TypeError(`Cannot resolve bitfield: ${bit}`);
89
+ }
74
90
  bitsResult |= bit;
75
91
  break;
76
92
  default:
77
- throw new TypeError(`Cannot resolve permission: ${typeof bit === 'symbol' ? String(bit) : bit}`);
93
+ throw new TypeError(`Cannot resolve bitfield: ${typeof bit === 'symbol' ? String(bit) : bit}`);
78
94
  }
79
95
  }
80
96
  return bitsResult;
@@ -16,7 +16,7 @@ class DiscordBase extends Base_1.Base {
16
16
  * Create a timestamp for the current object.
17
17
  */
18
18
  get createdTimestamp() {
19
- return Number((0, utils_1.snowflakeToTimestamp)(this.id));
19
+ return (0, utils_1.snowflakeToTimestamp)(this.id);
20
20
  }
21
21
  /**
22
22
  * createdAt gets the creation Date instace of the current object.
@@ -57,10 +57,8 @@ export declare class PermissionsBitField extends BitField<typeof PermissionFlags
57
57
  };
58
58
  static All: bigint;
59
59
  constructor(bitfields?: BitFieldResolvable<typeof PermissionFlagsBits> | BitFieldResolvable<typeof PermissionFlagsBits>[]);
60
- keys: (bits?: BitFieldResolvable<typeof PermissionFlagsBits>[]) => (keyof typeof PermissionFlagsBits)[];
61
- has(bits: BitFieldResolvable<typeof PermissionFlagsBits>[]): boolean;
62
- strictHas(bits: BitFieldResolvable<typeof PermissionFlagsBits>[]): boolean;
63
- resolve<T extends typeof PermissionFlagsBits>(bits: BitFieldResolvable<T> | BitFieldResolvable<T>[]): bigint;
60
+ has(bits: BitFieldResolvable<typeof PermissionFlagsBits> | BitFieldResolvable<typeof PermissionFlagsBits>[]): boolean;
61
+ strictHas(bits: BitFieldResolvable<typeof PermissionFlagsBits> | BitFieldResolvable<typeof PermissionFlagsBits>[]): boolean;
64
62
  static resolve<T extends typeof PermissionFlagsBits>(bits: BitFieldResolvable<T> | BitFieldResolvable<T>[]): bigint;
65
63
  toString(): string;
66
64
  }
@@ -17,24 +17,8 @@ class PermissionsBitField extends BitField_1.BitField {
17
17
  strictHas(bits) {
18
18
  return super.has(bits);
19
19
  }
20
- resolve(bits) {
21
- return (Array.isArray(bits) ? bits : [bits]).reduce((acc, cur) => acc | PermissionsBitField.resolve([cur]), BitField_1.BitField.None);
22
- }
23
20
  static resolve(bits) {
24
- let bitsResult = 0n;
25
- for (const bit of Array.isArray(bits) ? bits : [bits]) {
26
- switch (typeof bit) {
27
- case 'string':
28
- bitsResult |= PermissionsBitField.resolve(types_1.PermissionFlagsBits[bit]);
29
- break;
30
- case 'bigint':
31
- bitsResult |= bit;
32
- break;
33
- default:
34
- throw new TypeError(`Cannot resolve permission: ${typeof bit === 'symbol' ? String(bit) : bit}`);
35
- }
36
- }
37
- return bitsResult;
21
+ return BitField_1.BitField.prototype.resolve(bits, types_1.PermissionFlagsBits);
38
22
  }
39
23
  toString() {
40
24
  return this.bit.toString();
@@ -86,8 +86,8 @@ export declare enum InteractionResponseType {
86
86
  * https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-interaction-callback-data-structure
87
87
  */
88
88
  export type APIInteractionResponseCallbackData = Omit<RESTPostAPIWebhookWithTokenJSONBody, 'avatar_url' | 'username'>;
89
- export interface APICommandAutocompleteInteractionResponseCallbackData {
90
- choices?: APIApplicationCommandOptionChoice[];
89
+ export interface APICommandAutocompleteInteractionResponseCallbackData<ValueType extends number | string = number | string> {
90
+ choices?: APIApplicationCommandOptionChoice<ValueType>[];
91
91
  }
92
92
  /**
93
93
  * https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-response-object-modal
@@ -222,11 +222,11 @@ export interface APIBaseAutoPopulatedSelectMenuComponent<T extends ComponentType
222
222
  /**
223
223
  * https://discord.com/developers/docs/interactions/message-components#select-menus
224
224
  */
225
- export interface APIStringSelectComponent extends APIBaseSelectMenuComponent<ComponentType.StringSelect> {
225
+ export interface APIStringSelectComponent<Value extends string = string> extends APIBaseSelectMenuComponent<ComponentType.StringSelect> {
226
226
  /**
227
227
  * Specified choices in a select menu; max 25
228
228
  */
229
- options: APISelectMenuOption[];
229
+ options: APISelectMenuOption<Value>[];
230
230
  /**
231
231
  * Whether the string select is required to answer in a modal
232
232
  *
@@ -278,7 +278,7 @@ export type APISelectMenuComponent = APIChannelSelectComponent | APIMentionableS
278
278
  /**
279
279
  * https://discord.com/developers/docs/interactions/message-components#select-menu-object-select-option-structure
280
280
  */
281
- export interface APISelectMenuOption {
281
+ export interface APISelectMenuOption<Value extends string = string> {
282
282
  /**
283
283
  * The user-facing name of the option (max 100 chars)
284
284
  */
@@ -286,7 +286,7 @@ export interface APISelectMenuOption {
286
286
  /**
287
287
  * The dev-defined value of the option (max 100 chars)
288
288
  */
289
- value: string;
289
+ value: Value;
290
290
  /**
291
291
  * An additional description of the option (max 100 chars)
292
292
  */
@@ -1,5 +1,5 @@
1
1
  import type { RestToKeys } from '../common';
2
- import type { APIAuditLogEntry, APIAutoModerationRule, APIChannel, APIEntitlement, APIGuild, APIGuildMember, APIGuildScheduledEvent, APIStageInstance, APISubscription, APIUser, GatewayActivity, GatewayAutoModerationActionExecutionDispatchData, GatewayChannelPinsUpdateDispatchData, GatewayChannelUpdateDispatchData, GatewayDispatchEvents, GatewayEntitlementCreateDispatchData, GatewayGuildBanAddDispatchData, GatewayGuildBanRemoveDispatchData, GatewayGuildCreateDispatchData, GatewayGuildDeleteDispatchData, GatewayGuildEmojisUpdateDispatchData, GatewayGuildIntegrationsUpdateDispatchData, GatewayGuildMemberAddDispatchData, GatewayGuildMemberRemoveDispatchData, GatewayGuildMembersChunkDispatchData, GatewayGuildMemberUpdateDispatchData, GatewayGuildRoleCreateDispatchData, GatewayGuildRoleDeleteDispatchData, GatewayGuildRoleUpdateDispatchData, GatewayGuildScheduledEventUserRemoveDispatchData, GatewayGuildSoundboardSoundDeleteDispatchData, GatewayGuildSoundboardSoundsUpdateDispatchData, GatewayGuildStickersUpdateDispatchData, GatewayIntegrationCreateDispatchData, GatewayIntegrationDeleteDispatchData, GatewayInteractionCreateDispatchData, GatewayInviteCreateDispatchData, GatewayInviteDeleteDispatchData, GatewayMessageCreateDispatchData, GatewayMessageDeleteBulkDispatchData, GatewayMessageDeleteDispatchData, GatewayMessagePollVoteDispatchData, GatewayMessageReactionAddDispatchData, GatewayMessageReactionRemoveAllDispatchData, GatewayMessageReactionRemoveDispatchData, GatewayMessageReactionRemoveEmojiDispatchData, GatewayMessageUpdateDispatchData, GatewayPresenceUpdateData, GatewayPresenceUpdateDispatchData, GatewayReadyDispatchData, GatewayRequestGuildMembersDataWithQuery, GatewayRequestGuildMembersDataWithUserIds, GatewaySoundboardSoundsDispatchData, GatewayThreadCreateDispatchData, GatewayThreadDeleteDispatchData, GatewayThreadListSyncDispatchData, GatewayThreadMembersUpdateDispatchData, GatewayThreadMemberUpdateDispatchData, GatewayTypingStartDispatchData, GatewayUserUpdateDispatchData, GatewayVoiceChannelEffectSendDispachData, GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateData, GatewayWebhooksUpdateDispatchData, PresenceUpdateStatus } from '../types';
2
+ import type { APIAuditLogEntry, APIAutoModerationRule, APIChannel, APIEntitlement, APIGuild, APIGuildMember, APIGuildScheduledEvent, APIStageInstance, APISubscription, APIUser, GatewayActivity, GatewayAutoModerationActionExecutionDispatchData, GatewayChannelPinsUpdateDispatchData, GatewayChannelUpdateDispatchData, GatewayDispatchEvents, GatewayEntitlementCreateDispatchData, GatewayGuildBanAddDispatchData, GatewayGuildBanRemoveDispatchData, GatewayGuildCreateDispatchData, GatewayGuildDeleteDispatchData, GatewayGuildEmojisUpdateDispatchData, GatewayGuildIntegrationsUpdateDispatchData, GatewayGuildMemberAddDispatchData, GatewayGuildMemberRemoveDispatchData, GatewayGuildMembersChunkDispatchData, GatewayGuildMemberUpdateDispatchData, GatewayGuildRoleCreateDispatchData, GatewayGuildRoleDeleteDispatchData, GatewayGuildRoleUpdateDispatchData, GatewayGuildScheduledEventUserRemoveDispatchData, GatewayGuildSoundboardSoundDeleteDispatchData, GatewayGuildSoundboardSoundsUpdateDispatchData, GatewayGuildStickersUpdateDispatchData, GatewayIntegrationCreateDispatchData, GatewayIntegrationDeleteDispatchData, GatewayInteractionCreateDispatchData, GatewayInviteCreateDispatchData, GatewayInviteDeleteDispatchData, GatewayMessageCreateDispatchData, GatewayMessageDeleteBulkDispatchData, GatewayMessageDeleteDispatchData, GatewayMessagePollVoteDispatchData, GatewayMessageReactionAddDispatchData, GatewayMessageReactionRemoveAllDispatchData, GatewayMessageReactionRemoveDispatchData, GatewayMessageReactionRemoveEmojiDispatchData, GatewayMessageUpdateDispatchData, GatewayPresenceUpdateData, GatewayPresenceUpdateDispatchData, GatewayReadyDispatchData, GatewayRequestGuildMembersDataWithQuery, GatewayRequestGuildMembersDataWithUserIds, GatewaySoundboardSoundsDispatchData, GatewayThreadCreateDispatchData, GatewayThreadDeleteDispatchData, GatewayThreadListSyncDispatchData, GatewayThreadMembersUpdateDispatchData, GatewayThreadMemberUpdateDispatchData, GatewayThreadUpdateDispatchData, GatewayTypingStartDispatchData, GatewayUserUpdateDispatchData, GatewayVoiceChannelEffectSendDispachData, GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateData, GatewayWebhooksUpdateDispatchData, PresenceUpdateStatus } from '../types';
3
3
  import type { APISoundboardSound } from '../types/payloads/soundboard';
4
4
  /** https://discord.com/developers/docs/topics/gateway-events#update-presence */
5
5
  export interface StatusUpdate {
@@ -41,7 +41,7 @@ export interface Events {
41
41
  [GatewayDispatchEvents.AutoModerationActionExecution]: GatewayAutoModerationActionExecutionDispatchData;
42
42
  [GatewayDispatchEvents.ThreadCreate]: GatewayThreadCreateDispatchData;
43
43
  [GatewayDispatchEvents.ThreadDelete]: GatewayThreadDeleteDispatchData;
44
- [GatewayDispatchEvents.ThreadUpdate]: GatewayThreadDeleteDispatchData;
44
+ [GatewayDispatchEvents.ThreadUpdate]: GatewayThreadUpdateDispatchData;
45
45
  [GatewayDispatchEvents.ThreadListSync]: GatewayThreadListSyncDispatchData;
46
46
  [GatewayDispatchEvents.ThreadMemberUpdate]: GatewayThreadMemberUpdateDispatchData;
47
47
  [GatewayDispatchEvents.ThreadMembersUpdate]: GatewayThreadMembersUpdateDispatchData;
@@ -119,7 +119,7 @@ export type ChannelSameEvents = RestToKeys<[
119
119
  GatewayDispatchEvents.ChannelDelete,
120
120
  GatewayDispatchEvents.ChannelUpdate
121
121
  ]>;
122
- export type AutoModetaractionRuleEvents = RestToKeys<[
122
+ export type AutoModerationRuleEvents = RestToKeys<[
123
123
  APIAutoModerationRule,
124
124
  GatewayDispatchEvents.AutoModerationRuleCreate,
125
125
  GatewayDispatchEvents.AutoModerationRuleDelete,
@@ -141,7 +141,7 @@ export type SoundboardSoundsEvents = RestToKeys<[
141
141
  GatewayDispatchEvents.GuildSoundboardSoundCreate,
142
142
  GatewayDispatchEvents.GuildSoundboardSoundUpdate
143
143
  ]>;
144
- export type NormalizeEvents = Events & AutoModetaractionRuleEvents & ChannelSameEvents & GuildScheduledSameEvents & GuildScheduledUserSameEvents & IntegrationSameEvents & EntitlementEvents & PollVoteSameEvents & StageSameEvents & SubscriptionEvents & SoundboardSoundsEvents & {
144
+ export type NormalizeEvents = Events & AutoModerationRuleEvents & ChannelSameEvents & GuildScheduledSameEvents & GuildScheduledUserSameEvents & IntegrationSameEvents & EntitlementEvents & PollVoteSameEvents & StageSameEvents & SubscriptionEvents & SoundboardSoundsEvents & {
145
145
  RAW: GatewayDispatchEvents;
146
146
  };
147
147
  export type GatewayEvents = {
@@ -23,4 +23,4 @@ export interface IdentifyProperties {
23
23
  */
24
24
  device: string;
25
25
  }
26
- export { COMPRESS, ShardManagerDefaults, WorkerManagerDefaults, properties };
26
+ export { COMPRESS, properties, ShardManagerDefaults, WorkerManagerDefaults };
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.properties = exports.WorkerManagerDefaults = exports.ShardManagerDefaults = exports.COMPRESS = void 0;
3
+ exports.WorkerManagerDefaults = exports.ShardManagerDefaults = exports.properties = exports.COMPRESS = void 0;
4
4
  const COMPRESS = false;
5
5
  exports.COMPRESS = COMPRESS;
6
- const propertiesVersion = 'Seyfert v4.5.0 (https://seyfert.dev)';
6
+ const propertiesVersion = 'Seyfert v5.0.0 (https://seyfert.dev)';
7
7
  const properties = {
8
8
  os: process.platform,
9
9
  browser: propertiesVersion,
@@ -26,6 +26,7 @@ const ShardManagerDefaults = {
26
26
  exports.ShardManagerDefaults = ShardManagerDefaults;
27
27
  const WorkerManagerDefaults = {
28
28
  ...ShardManagerDefaults,
29
+ mode: 'threads',
29
30
  shardsPerWorker: 16,
30
31
  };
31
32
  exports.WorkerManagerDefaults = WorkerManagerDefaults;
@@ -9,8 +9,8 @@ class MemberUpdateHandler {
9
9
  return true;
10
10
  }
11
11
  const data = this.guildMemberUpdate.get(member.user.id);
12
- if (this.usersEqual(data.member.user, member.user)) {
13
- return this.membersEquals(data.member, member);
12
+ if (this.usersEqual(data.member.user, member.user) && this.membersEquals(data.member, member)) {
13
+ return false;
14
14
  }
15
15
  clearTimeout(data.timeout);
16
16
  this.setMember(member);
@@ -14,4 +14,5 @@ export declare class Heartbeater {
14
14
  constructor(sendMethod: (workerId: number, data: WorkerHeartbeaterMessages) => Awaitable<void>, interval: number);
15
15
  register(workerId: number, recreate: (workerId: number) => Awaitable<void>): void;
16
16
  acknowledge(workerId: number): void;
17
+ unregister(workerId: number): void;
17
18
  }
@@ -31,5 +31,12 @@ class Heartbeater {
31
31
  return;
32
32
  heartbeat.ack = true;
33
33
  }
34
+ unregister(workerId) {
35
+ const heartbeat = this.store.get(workerId);
36
+ if (!heartbeat)
37
+ return;
38
+ clearInterval(heartbeat.interval);
39
+ this.store.delete(workerId);
40
+ }
34
41
  }
35
42
  exports.Heartbeater = Heartbeater;
@@ -1,4 +1,4 @@
1
- import { Logger, type MakeRequired } from '../../common';
1
+ import { Logger, type MakePresent } from '../../common';
2
2
  import { type APIGuildMember, type GatewayGuildMembersChunkPresence, type GatewayReceivePayload, type GatewaySendPayload } from '../../types';
3
3
  import type { GatewayRequestGuildMembersDataWithQuery, GatewayRequestGuildMembersDataWithUserIds } from '../../types/gateway';
4
4
  import { DynamicBucket } from '../structures';
@@ -27,7 +27,7 @@ export declare class Shard {
27
27
  bucket: DynamicBucket;
28
28
  offlineSendQueue: ((_?: unknown) => void)[];
29
29
  pendingGuilds?: Set<string>;
30
- options: MakeRequired<ShardOptions, 'properties' | 'ratelimitOptions' | 'reconnectTimeout' | 'connectionTimeout'>;
30
+ options: MakePresent<ShardOptions, 'properties' | 'ratelimitOptions' | 'reconnectTimeout' | 'connectionTimeout'>;
31
31
  isReady: boolean;
32
32
  connectionTimeout?: NodeJS.Timeout;
33
33
  private requestGuildMembersChunk;
@@ -96,7 +96,7 @@ class Shard {
96
96
  this.handleMessage(data);
97
97
  };
98
98
  this.websocket.onclose = (event) => this.handleClosed(event);
99
- this.websocket.onerror = (event) => this.logger.error(event);
99
+ this.websocket.onerror = (event) => this.logger.error(`Shard #${this.id}`, event);
100
100
  this.websocket.onopen = () => {
101
101
  this.isConnecting = false;
102
102
  this.heart.ack = true;
@@ -104,14 +104,16 @@ class Shard {
104
104
  };
105
105
  }
106
106
  async send(force, message) {
107
- this.debugger?.info(`[Shard #${this.id}] Sending: ${types_1.GatewayOpcodes[message.op]} ${JSON.stringify(message.d, (_, value) => {
108
- if (typeof value === 'string')
109
- return value.replaceAll(this.options.token, v => {
110
- const split = v.split('.');
111
- return `${split[0]}.${'*'.repeat(split[1].length)}.${'*'.repeat(split[2].length)}`;
112
- });
113
- return value;
114
- }, 1)}`);
107
+ if (this.debugger) {
108
+ this.debugger.info(`[Shard #${this.id}] Sending: ${types_1.GatewayOpcodes[message.op]} ${JSON.stringify(message.d, (_, value) => {
109
+ if (typeof value === 'string')
110
+ return value.replaceAll(this.options.token, v => {
111
+ const split = v.split('.');
112
+ return `${split[0]}.${'*'.repeat(split[1].length)}.${'*'.repeat(split[2].length)}`;
113
+ });
114
+ return value;
115
+ }, 1)}`);
116
+ }
115
117
  await this.checkOffline(force);
116
118
  await this.bucket.acquire(force);
117
119
  await this.checkOffline(force);
@@ -220,7 +222,7 @@ class Shard {
220
222
  case types_1.GatewayOpcodes.InvalidSession: {
221
223
  if (packet.d) {
222
224
  if (!this.resumable) {
223
- return this.logger.fatal('This is a completely unexpected error message.');
225
+ return this.logger.fatal(`Shard #${this.id} received a non-resumable InvalidSession, cannot resume.`);
224
226
  }
225
227
  return this.resume();
226
228
  }
@@ -383,7 +385,7 @@ class Shard {
383
385
  this.isReady = false;
384
386
  clearInterval(this.heart.nodeInterval);
385
387
  clearTimeout(this.heart.ackTimeout);
386
- this.logger.warn(`${shared_1.ShardSocketCloseCodes[close.code] ?? types_1.GatewayCloseCodes[close.code] ?? close.code} (${close.code})`, close.reason);
388
+ this.logger.warn(`Shard #${this.id} closed: ${shared_1.ShardSocketCloseCodes[close.code] ?? types_1.GatewayCloseCodes[close.code] ?? close.code} (${close.code})`, close.reason);
387
389
  try {
388
390
  switch (close.code) {
389
391
  case shared_1.ShardSocketCloseCodes.Shutdown:
@@ -424,11 +426,11 @@ class Shard {
424
426
  case types_1.GatewayCloseCodes.InvalidIntents:
425
427
  case types_1.GatewayCloseCodes.InvalidShard:
426
428
  case types_1.GatewayCloseCodes.ShardingRequired:
427
- this.logger.fatal('Cannot reconnect');
429
+ this.logger.fatal(`Shard #${this.id} cannot reconnect`);
428
430
  break;
429
431
  default:
430
432
  {
431
- this.logger.warn('Unknown close code, trying to reconnect anyways');
433
+ this.logger.warn(`Shard #${this.id} unknown close code (${close.code}), trying to reconnect anyways`);
432
434
  await this.reconnect();
433
435
  }
434
436
  break;
@@ -1,4 +1,4 @@
1
- import { Logger, type MakeRequired } from '../../common';
1
+ import { Logger, type MakePresent, type MakeRequired } from '../../common';
2
2
  import type { MakeDeepPartial } from '../../common/types/util';
3
3
  import { type GatewaySendPayload, type GatewayUpdatePresence, type GatewayVoiceStateUpdate } from '../../types';
4
4
  import { ShardManagerDefaults } from '../constants';
@@ -7,7 +7,7 @@ import { Shard } from './shard';
7
7
  import { type ShardData, type ShardManagerOptions, ShardSocketCloseCodes } from './shared';
8
8
  export declare class ShardManager extends Map<number, Shard> {
9
9
  connectQueue: ConnectQueue;
10
- options: MakeRequired<ShardManagerOptions, keyof typeof ShardManagerDefaults>;
10
+ options: MakePresent<ShardManagerOptions, keyof typeof ShardManagerDefaults>;
11
11
  debugger?: Logger;
12
12
  constructor(options: MakeDeepPartial<ShardManagerOptions, 'resharding'>);
13
13
  get totalShards(): number;
@@ -24,11 +24,12 @@ export declare class ShardManager extends Map<number, Shard> {
24
24
  forceIdentify(shardId: number): Promise<void>;
25
25
  disconnect(shardId: number, code?: ShardSocketCloseCodes): void | undefined;
26
26
  disconnectAll(code?: ShardSocketCloseCodes): void;
27
- setShardPresence(shardId: number, payload: GatewayUpdatePresence['d']): void;
27
+ setShardPresence(shardId: number, payload: GatewayUpdatePresence['d']): Promise<boolean>;
28
28
  setPresence(payload: GatewayUpdatePresence['d']): void;
29
- joinVoice(guild_id: string, channel_id: string, options: Pick<GatewayVoiceStateUpdate['d'], 'self_deaf' | 'self_mute'>): void;
30
- leaveVoice(guild_id: string): void;
31
- requestChannelInfo(guild_id: string, fields: ('status' | 'voice_start_time')[]): void;
32
- send<T extends GatewaySendPayload>(shardId: number, payload: T): void;
29
+ joinVoice(guild_id: string, channel_id: string, options: Pick<GatewayVoiceStateUpdate['d'], 'self_deaf' | 'self_mute'>): Promise<boolean>;
30
+ leaveVoice(guild_id: string): Promise<boolean>;
31
+ requestChannelInfo(guild_id: string, fields: ('status' | 'voice_start_time')[]): Promise<boolean>;
32
+ send<T extends GatewaySendPayload>(shardId: number, payload: T): Promise<boolean>;
33
+ private resolveSendPayload;
33
34
  resume(shardId: number, shardData: MakeRequired<ShardData>): unknown;
34
35
  }
@@ -69,7 +69,7 @@ class ShardManager extends Map {
69
69
  properties: this.options.properties,
70
70
  debugger: this.debugger,
71
71
  compress: this.options.compress ?? false,
72
- presence: this.options.presence?.(shardId, -1),
72
+ presence: this.options.presence?.(shardId),
73
73
  connectionTimeout: this.options.connectionTimeout,
74
74
  reconnectTimeout: this.options.reconnectTimeout,
75
75
  });
@@ -229,15 +229,35 @@ class ShardManager extends Map {
229
229
  },
230
230
  });
231
231
  }
232
- send(shardId, payload) {
232
+ async send(shardId, payload) {
233
+ const resolvedPayload = await this.resolveSendPayload(shardId, payload);
234
+ if (!resolvedPayload)
235
+ return false;
233
236
  if (workerData?.__USING_WATCHER__) {
234
- return parentPort?.postMessage({
237
+ if (!parentPort) {
238
+ throw new common_1.SeyfertError('INTERNAL_ERROR', {
239
+ metadata: { detail: 'Cannot send shard payload without a watcher parent port' },
240
+ });
241
+ }
242
+ parentPort.postMessage({
235
243
  type: 'SEND_TO_SHARD',
236
244
  shardId,
237
- payload,
245
+ payload: resolvedPayload,
238
246
  });
247
+ return true;
248
+ }
249
+ const shard = this.get(shardId);
250
+ if (!shard) {
251
+ throw new common_1.SeyfertError('INTERNAL_ERROR', { metadata: { detail: `Shard #${shardId} doesn't exist` } });
239
252
  }
240
- this.get(shardId)?.send(false, payload);
253
+ await shard.send(false, resolvedPayload);
254
+ return true;
255
+ }
256
+ async resolveSendPayload(shardId, payload) {
257
+ const result = await this.options.handleSendPayload?.(shardId, payload);
258
+ if (result === null)
259
+ return null;
260
+ return (result ?? payload);
241
261
  }
242
262
  resume(shardId, shardData) {
243
263
  if (this.has(shardId))
@@ -1,6 +1,6 @@
1
1
  import type { InternalRuntimeConfig, InternalRuntimeConfigHTTP } from '../../client/base';
2
2
  import type { Awaitable, DeepPartial, Logger } from '../../common';
3
- import type { APIGatewayBotInfo, GatewayDispatchPayload, GatewayIntentBits, GatewayPresenceUpdateData } from '../../types';
3
+ import type { APIGatewayBotInfo, GatewayDispatchPayload, GatewayIntentBits, GatewayPresenceUpdateData, GatewaySendPayload } from '../../types';
4
4
  import type { IdentifyProperties } from '../constants';
5
5
  import type { WorkerMessages } from './worker';
6
6
  export interface ShardDisconnectData {
@@ -30,6 +30,7 @@ export interface ShardManagerOptions extends ShardDetails {
30
30
  * The payload handlers for messages on the shard.
31
31
  */
32
32
  handlePayload(shardId: number, packet: GatewayDispatchPayload): unknown;
33
+ handleSendPayload?(shardId: number, payload: GatewaySendPayload): Awaitable<GatewaySendPayload | null | undefined | void>;
33
34
  onShardDisconnect?(data: ShardDisconnectData): Awaitable<unknown>;
34
35
  onShardReconnect?(data: ShardReconnectData): Awaitable<unknown>;
35
36
  /**
@@ -39,7 +40,7 @@ export interface ShardManagerOptions extends ShardDetails {
39
40
  /**
40
41
  * Set a presence.
41
42
  */
42
- presence?: (shardId: number, workerId: number) => GatewayPresenceUpdateData;
43
+ presence?: (shardId: number) => GatewayPresenceUpdateData;
43
44
  compress?: boolean;
44
45
  resharding?: {
45
46
  /**
@@ -56,9 +57,7 @@ export interface CustomManagerAdapter {
56
57
  postMessage(workerId: number, body: unknown): Awaitable<unknown>;
57
58
  spawn(workerData: WorkerData, env: Record<string, any>): Awaitable<unknown>;
58
59
  }
59
- export interface WorkerManagerOptions extends Omit<ShardManagerOptions, 'handlePayload' | 'properties'> {
60
- mode: 'threads' | 'clusters' | 'custom';
61
- adapter?: CustomManagerAdapter;
60
+ interface WorkerManagerOptionsBase extends Omit<ShardManagerOptions, 'handlePayload' | 'presence' | 'properties'> {
62
61
  workers?: number;
63
62
  /**
64
63
  * @default 16
@@ -67,12 +66,25 @@ export interface WorkerManagerOptions extends Omit<ShardManagerOptions, 'handleP
67
66
  workerProxy?: boolean;
68
67
  /** @default 15000 */
69
68
  heartbeaterInterval?: number;
70
- path: string;
71
69
  handlePayload?(shardId: number, workerId: number, packet: GatewayDispatchPayload): any;
70
+ presence?: (shardId: number, workerId: number) => GatewayPresenceUpdateData;
72
71
  handleWorkerMessage?(message: WorkerMessages): any;
73
72
  properties?: DeepPartial<NonNullable<ShardManagerOptions['properties']>>;
74
73
  getRC?(): Awaitable<InternalRuntimeConfig | InternalRuntimeConfigHTTP>;
75
74
  }
75
+ export type WorkerManagerOptions = (WorkerManagerOptionsBase & {
76
+ mode?: 'threads';
77
+ path: string;
78
+ adapter?: CustomManagerAdapter;
79
+ }) | (WorkerManagerOptionsBase & {
80
+ mode: 'clusters';
81
+ path: string;
82
+ adapter?: CustomManagerAdapter;
83
+ }) | (WorkerManagerOptionsBase & {
84
+ mode: 'custom';
85
+ adapter: CustomManagerAdapter;
86
+ path?: string;
87
+ });
76
88
  export interface ShardData {
77
89
  /** resume seq to resume connections */
78
90
  resume_seq: number | null;
@@ -148,3 +160,4 @@ export interface WorkerData {
148
160
  __USING_WATCHER__?: boolean;
149
161
  resharding: boolean;
150
162
  }
163
+ export {};