disgroove 3.0.0-dev.fd521a8 → 3.0.1-dev.24a02ed

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 (38) hide show
  1. package/LICENSE +9 -9
  2. package/README.md +48 -48
  3. package/dist/lib/Client.d.ts +68 -58
  4. package/dist/lib/Client.js +59 -23
  5. package/dist/lib/constants.d.ts +17 -4
  6. package/dist/lib/constants.js +18 -4
  7. package/dist/lib/gateway/Dispatcher.d.ts +104 -0
  8. package/dist/lib/gateway/Dispatcher.js +472 -0
  9. package/dist/lib/gateway/Shard.d.ts +10 -22
  10. package/dist/lib/gateway/Shard.js +123 -656
  11. package/dist/lib/gateway/Transmitter.d.ts +22 -0
  12. package/dist/lib/gateway/Transmitter.js +93 -0
  13. package/dist/lib/rest/Endpoints.d.ts +3 -0
  14. package/dist/lib/rest/Endpoints.js +10 -3
  15. package/dist/lib/rest/RequestManager.js +21 -7
  16. package/dist/lib/rest/index.js +17 -7
  17. package/dist/lib/transformers/Components.d.ts +3 -1
  18. package/dist/lib/transformers/Components.js +26 -0
  19. package/dist/lib/transformers/Guilds.d.ts +2 -0
  20. package/dist/lib/transformers/Guilds.js +134 -0
  21. package/dist/lib/transformers/Interactions.js +30 -0
  22. package/dist/lib/transformers/Invites.js +2 -2
  23. package/dist/lib/transformers/Presences.d.ts +3 -3
  24. package/dist/lib/types/components.d.ts +36 -4
  25. package/dist/lib/types/gateway-events.d.ts +203 -75
  26. package/dist/lib/types/interaction.d.ts +3 -3
  27. package/dist/lib/types/invite.d.ts +5 -2
  28. package/dist/lib/utils/errors.d.ts +3 -1
  29. package/dist/lib/utils/errors.js +4 -0
  30. package/dist/lib/utils/formatters.js +9 -10
  31. package/dist/lib/utils/index.d.ts +1 -0
  32. package/dist/lib/utils/index.js +18 -7
  33. package/dist/lib/utils/permissions.d.ts +2 -0
  34. package/dist/lib/utils/permissions.js +7 -0
  35. package/dist/package.json +5 -5
  36. package/package.json +6 -6
  37. package/dist/lib/types/message-components.d.ts +0 -450
  38. package/dist/lib/types/message-components.js +0 -2
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
37
  };
@@ -31,623 +41,146 @@ const ws_1 = __importDefault(require("ws"));
31
41
  const constants_1 = require("../constants");
32
42
  const utils_1 = require("../utils");
33
43
  const pkg = __importStar(require("../../package.json"));
34
- const transformers_1 = require("../transformers");
44
+ const Transmitter_1 = require("./Transmitter");
45
+ const Dispatcher_1 = require("./Dispatcher");
35
46
  class Shard {
36
47
  id;
37
- heartbeatInterval;
38
48
  client;
39
- ws;
49
+ heartbeatInterval;
40
50
  sessionId;
41
51
  resumeGatewayURL;
42
52
  sequence;
53
+ ws;
54
+ transmitter;
55
+ dispatcher;
43
56
  constructor(id, client) {
44
57
  this.id = id;
45
- this.heartbeatInterval = null;
46
58
  this.client = client;
47
- this.ws = new ws_1.default("wss://gateway.discord.gg/?v=10&encoding=json", this.client.ws);
59
+ this.heartbeatInterval = null;
48
60
  this.sessionId = null;
49
61
  this.resumeGatewayURL = null;
50
62
  this.sequence = null;
63
+ this.ws = new ws_1.default("wss://gateway.discord.gg/?v=10&encoding=json", this.client.ws);
64
+ this.transmitter = new Transmitter_1.Transmitter(this.ws);
65
+ this.dispatcher = new Dispatcher_1.Dispatcher(this);
51
66
  }
52
67
  /** https://discord.com/developers/docs/topics/gateway#connections */
53
- connect(reconnect) {
54
- if (!this.ws)
55
- return;
56
- this.ws.on("open", () => this.onWebSocketOpen(reconnect));
57
- this.ws.on("message", (data) => this.onWebSocketMessage(data));
58
- this.ws.on("error", (err) => this.onWebSocketError(err));
59
- this.ws.on("close", (code, reason) => this.onWebSocketClose(code, reason));
68
+ connect() {
69
+ if (this.ws) {
70
+ this.ws.on("open", () => this.onWebSocketOpen());
71
+ this.ws.on("message", (data) => this.onWebSocketMessage(data));
72
+ this.ws.on("error", (err) => this.onWebSocketError(err));
73
+ this.ws.on("close", (code, reason) => this.onWebSocketClose(code, reason));
74
+ }
60
75
  }
61
76
  /** https://discord.com/developers/docs/events/gateway#initiating-a-disconnect */
62
- disconnect() {
63
- if (!this.ws)
64
- return;
77
+ disconnect(reconnect) {
65
78
  if (this.heartbeatInterval) {
66
79
  clearInterval(this.heartbeatInterval);
67
80
  this.heartbeatInterval = null;
68
81
  }
69
- if (this.ws.readyState !== ws_1.default.CLOSED) {
70
- this.ws.removeAllListeners();
71
- this.ws.close(1000, "Session Invalidated - Disconnect");
72
- this.ws = null;
73
- }
74
- }
75
- /** https://discord.com/developers/docs/events/gateway#resuming */
76
- reconnect() {
77
- if (this.ws && this.resumeGatewayURL && this.sessionId && this.sequence) {
78
- this.ws.close(1000, "Resume Attempt - Reconnect");
79
- this.ws = new ws_1.default(this.resumeGatewayURL, this.client.ws);
80
- this.connect(true);
81
- }
82
- }
83
- /** https://discord.com/developers/docs/topics/gateway-events#heartbeat */
84
- heartbeat(lastSequence) {
85
- if (!this.ws)
86
- return;
87
- this.ws.send(JSON.stringify({
88
- op: constants_1.GatewayOPCodes.Heartbeat,
89
- d: lastSequence,
90
- }));
91
- }
92
- /** https://discord.com/developers/docs/topics/gateway-events#identify */
93
- identify(options) {
94
- if (!this.ws)
95
- return;
96
- this.ws.send(JSON.stringify({
97
- op: constants_1.GatewayOPCodes.Identify,
98
- d: {
99
- token: options.token,
100
- properties: {
101
- os: options.properties.os,
102
- browser: options.properties.browser,
103
- device: options.properties.device,
104
- },
105
- compress: options.compress,
106
- large_threshold: options.largeThreshold,
107
- shard: options.shard,
108
- presence: options.presence,
109
- intents: options.intents,
110
- },
111
- }));
112
- }
113
- onDispatch(packet) {
114
- this.sequence = packet.s;
115
- this.client.emit("dispatch", packet, this.id);
116
- switch (packet.t) {
117
- case constants_1.GatewayEvents.Ready:
118
- {
119
- this.sessionId = packet.d.session_id;
120
- this.resumeGatewayURL = `${packet.d.resume_gateway_url}?v=10&encoding=json`;
121
- this.client.user = transformers_1.Users.userFromRaw(packet.d.user);
122
- this.client.application = packet.d.application;
123
- this.client.emit("ready");
124
- }
125
- break;
126
- case constants_1.GatewayEvents.Resumed:
127
- this.client.emit("resumed");
128
- break;
129
- case constants_1.GatewayEvents.RateLimited:
130
- switch (packet.d.opcode) {
131
- case constants_1.GatewayOPCodes.RequestGuildMembers: {
132
- this.client.emit("rateLimited", {
133
- opcode: constants_1.GatewayOPCodes.RequestGuildMembers,
134
- retryAfter: packet.d.retry_after,
135
- meta: {
136
- guildId: packet.d.meta.guild_id,
137
- nonce: packet.d.nonce,
138
- },
139
- });
82
+ if (this.ws) {
83
+ if (this.ws.readyState !== ws_1.default.CLOSED) {
84
+ this.ws.removeAllListeners();
85
+ if (reconnect &&
86
+ this.sessionId &&
87
+ this.sequence &&
88
+ this.resumeGatewayURL) {
89
+ if (this.ws.readyState === ws_1.default.OPEN) {
90
+ this.ws.terminate();
91
+ }
92
+ else {
93
+ this.ws.close(1000, "Resume Attempt - Reconnect");
140
94
  }
141
95
  }
142
- break;
143
- case constants_1.GatewayEvents.ApplicationCommandPermissionsUpdate:
144
- this.client.emit("applicationCommandPermissionsUpdate", transformers_1.Guilds.guildApplicationCommandPermissionsFromRaw(packet.d));
145
- break;
146
- case constants_1.GatewayEvents.AutoModerationRuleCreate:
147
- this.client.emit("autoModerationRuleCreate", transformers_1.AutoModeration.autoModerationRuleFromRaw(packet.d));
148
- break;
149
- case constants_1.GatewayEvents.AutoModerationRuleUpdate:
150
- this.client.emit("autoModerationRuleUpdate", transformers_1.AutoModeration.autoModerationRuleFromRaw(packet.d));
151
- break;
152
- case constants_1.GatewayEvents.AutoModerationRuleDelete:
153
- this.client.emit("autoModerationRuleDelete", transformers_1.AutoModeration.autoModerationRuleFromRaw(packet.d));
154
- break;
155
- case constants_1.GatewayEvents.AutoModerationActionExecution:
156
- this.client.emit("autoModerationActionExecution", {
157
- guildId: packet.d.guild_id,
158
- action: {
159
- type: packet.d.action.type,
160
- metadata: {
161
- channelId: packet.d.action.metadata.channel_id,
162
- durationSeconds: packet.d.action.metadata.duration_seconds,
163
- customMessage: packet.d.action.metadata.custom_message,
164
- },
165
- },
166
- ruleId: packet.d.rule_id,
167
- ruleTriggerType: packet.d.rule_trigger_type,
168
- userId: packet.d.user_id,
169
- channelId: packet.d.channel_id,
170
- messageId: packet.d.message_id,
171
- alertSystemMessageId: packet.d.alert_system_message_id,
172
- content: packet.d.content,
173
- matchedKeyword: packet.d.matched_keyword,
174
- matchedContent: packet.d.matched_content,
175
- });
176
- break;
177
- case constants_1.GatewayEvents.ChannelCreate:
178
- this.client.emit("channelCreate", transformers_1.Channels.channelFromRaw(packet.d));
179
- break;
180
- case constants_1.GatewayEvents.ChannelUpdate:
181
- this.client.emit("channelUpdate", transformers_1.Channels.channelFromRaw(packet.d));
182
- break;
183
- case constants_1.GatewayEvents.ChannelDelete:
184
- this.client.emit("channelDelete", transformers_1.Channels.channelFromRaw(packet.d));
185
- break;
186
- case constants_1.GatewayEvents.ChannelPinsUpdate:
187
- this.client.emit("channelPinsUpdate", {
188
- guildId: packet.d.guild_id,
189
- channelId: packet.d.channel_id,
190
- lastPinTimestamp: packet.d.last_pin_timestamp,
191
- });
192
- break;
193
- case constants_1.GatewayEvents.ThreadCreate:
194
- this.client.emit("threadCreate", transformers_1.Channels.channelFromRaw(packet.d));
195
- break;
196
- case constants_1.GatewayEvents.ThreadUpdate:
197
- this.client.emit("threadUpdate", transformers_1.Channels.channelFromRaw(packet.d));
198
- break;
199
- case constants_1.GatewayEvents.ThreadDelete:
200
- this.client.emit("threadDelete", transformers_1.Channels.channelFromRaw(packet.d));
201
- break;
202
- case constants_1.GatewayEvents.ThreadListSync:
203
- this.client.emit("threadListSync", {
204
- guildId: packet.d.guild_id,
205
- channelIds: packet.d.channel_ids,
206
- threads: packet.d.threads.map((thread) => transformers_1.Channels.channelFromRaw(thread)),
207
- members: packet.d.members.map((threadMember) => transformers_1.Channels.threadMemberFromRaw(threadMember)),
208
- });
209
- break;
210
- case constants_1.GatewayEvents.ThreadMemberUpdate:
211
- this.client.emit("threadMemberUpdate", {
212
- id: packet.d.id,
213
- userId: packet.d.user_id,
214
- joinTimestamp: packet.d.join_timestamp,
215
- flags: packet.d.flags,
216
- member: packet.d.member !== undefined
217
- ? transformers_1.Guilds.guildMemberFromRaw(packet.d.member)
218
- : undefined,
219
- guildId: packet.d.guild_id,
220
- });
221
- break;
222
- case constants_1.GatewayEvents.ThreadMembersUpdate:
223
- this.client.emit("threadMembersUpdate", {
224
- id: packet.d.id,
225
- guildId: packet.d.guild_id,
226
- memberCount: packet.d.member_count,
227
- addedMembers: packet.d.members.map((threadMember) => transformers_1.Channels.threadMemberFromRaw(threadMember)),
228
- removedMemberIds: packet.d.removed_member_ids,
229
- });
230
- break;
231
- case constants_1.GatewayEvents.EntitlementCreate:
232
- this.client.emit("entitlementCreate", transformers_1.Entitlements.entitlementFromRaw(packet.d));
233
- break;
234
- case constants_1.GatewayEvents.EntitlementUpdate:
235
- this.client.emit("entitlementUpdate", transformers_1.Entitlements.entitlementFromRaw(packet.d));
236
- break;
237
- case constants_1.GatewayEvents.EntitlementDelete:
238
- this.client.emit("entitlementDelete", transformers_1.Entitlements.entitlementFromRaw(packet.d));
239
- break;
240
- case constants_1.GatewayEvents.GuildCreate:
241
- {
242
- this.client.guildShardMap[packet.d.id] = this.id;
243
- this.client.guilds.set(packet.d.id, transformers_1.Guilds.guildFromRaw(packet.d));
244
- this.client.emit("guildCreate", transformers_1.Guilds.guildFromRaw(packet.d));
245
- }
246
- break;
247
- case constants_1.GatewayEvents.GuildUpdate:
248
- {
249
- this.client.guilds.set(packet.d.id, transformers_1.Guilds.guildFromRaw(packet.d));
250
- this.client.emit("guildUpdate", transformers_1.Guilds.guildFromRaw(packet.d));
96
+ else {
97
+ this.ws.close(1000, "Session Invalidated - Disconnect");
251
98
  }
252
- break;
253
- case constants_1.GatewayEvents.GuildDelete:
254
- {
255
- delete this.client.guildShardMap[packet.d.id];
256
- this.client.guilds.delete(packet.d.id);
257
- this.client.emit("guildDelete", {
258
- id: packet.d.id,
259
- unavailable: packet.d.unavailable,
260
- });
261
- }
262
- break;
263
- case constants_1.GatewayEvents.GuildAuditLogEntryCreate:
264
- this.client.emit("guildAuditLogEntryCreate", {
265
- ...transformers_1.AuditLogs.auditLogEntryFromRaw(packet.d),
266
- guildId: packet.d.guild_id,
267
- });
268
- break;
269
- case constants_1.GatewayEvents.GuildBanAdd:
270
- this.client.emit("guildBanAdd", {
271
- guildId: packet.d.guild_id,
272
- user: transformers_1.Users.userFromRaw(packet.d.user),
273
- });
274
- break;
275
- case constants_1.GatewayEvents.GuildBanRemove:
276
- this.client.emit("guildBanRemove", {
277
- guildId: packet.d.guild_id,
278
- user: transformers_1.Users.userFromRaw(packet.d.user),
279
- });
280
- break;
281
- case constants_1.GatewayEvents.GuildEmojisUpdate:
282
- this.client.emit("guildEmojisUpdate", packet.d.emojis.map((emoji) => transformers_1.Emojis.emojiFromRaw(emoji)), packet.d.guild_id);
283
- break;
284
- case constants_1.GatewayEvents.GuildStickersUpdate:
285
- this.client.emit("guildStickersUpdate", packet.d.stickers.map((sticker) => transformers_1.Stickers.stickerFromRaw(sticker)), packet.d.guild_id);
286
- break;
287
- case constants_1.GatewayEvents.GuildIntegrationsUpdate:
288
- this.client.emit("guildIntegrationsUpdate", packet.d.guild_id);
289
- break;
290
- case constants_1.GatewayEvents.GuildMemberAdd:
291
- this.client.emit("guildMemberAdd", {
292
- ...transformers_1.Guilds.guildMemberFromRaw(packet.d),
293
- guildId: packet.d.guild_id,
294
- });
295
- break;
296
- case constants_1.GatewayEvents.GuildMemberRemove:
297
- this.client.emit("guildMemberRemove", {
298
- guildId: packet.d.guild_id,
299
- user: transformers_1.Users.userFromRaw(packet.d.user),
300
- });
301
- break;
302
- case constants_1.GatewayEvents.GuildMemberUpdate:
303
- this.client.emit("guildMemberUpdate", {
304
- guildId: packet.d.guild_id,
305
- roles: packet.d.roles,
306
- user: transformers_1.Users.userFromRaw(packet.d.user),
307
- nick: packet.d.nick,
308
- avatar: packet.d.avatar,
309
- banner: packet.d.banner,
310
- joinedAt: packet.d.joined_at,
311
- premiumSince: packet.d.premium_since,
312
- deaf: packet.d.deaf,
313
- mute: packet.d.mute,
314
- pending: packet.d.pending,
315
- communicationDisabledUntil: packet.d.communication_disabled_until,
316
- flags: packet.d.flags,
317
- avatarDecorationData: packet.d.avatar_decoration_data !== undefined
318
- ? {
319
- asset: packet.d.asset,
320
- skuId: packet.d.sku_id,
321
- }
322
- : undefined,
323
- });
324
- break;
325
- case constants_1.GatewayEvents.GuildMembersChunk:
326
- this.client.emit("guildMembersChunk", {
327
- guildId: packet.d.guild_id,
328
- members: packet.d.members.map((guildMember) => transformers_1.Guilds.guildMemberFromRaw(guildMember)),
329
- chunkIndex: packet.d.chunk_index,
330
- chunkCount: packet.d.chunk_count,
331
- notFound: packet.d.not_found,
332
- presences: packet.d.presences?.map((presence) => transformers_1.Presences.presenceFromRaw(presence)),
333
- nonce: packet.d.nonce,
334
- });
335
- break;
336
- case constants_1.GatewayEvents.GuildRoleCreate:
337
- this.client.emit("guildRoleCreate", transformers_1.Roles.roleFromRaw(packet.d.role), packet.d.guild_id);
338
- break;
339
- case constants_1.GatewayEvents.GuildRoleUpdate:
340
- this.client.emit("guildRoleUpdate", transformers_1.Roles.roleFromRaw(packet.d.role), packet.d.guild_id);
341
- break;
342
- case constants_1.GatewayEvents.GuildRoleDelete:
343
- this.client.emit("guildRoleDelete", packet.d.role_id, packet.d.guild_id);
344
- break;
345
- case constants_1.GatewayEvents.GuildScheduledEventCreate:
346
- this.client.emit("guildScheduledEventCreate", transformers_1.GuildScheduledEvents.guildScheduledEventFromRaw(packet.d));
347
- break;
348
- case constants_1.GatewayEvents.GuildScheduledEventUpdate:
349
- this.client.emit("guildScheduledEventUpdate", transformers_1.GuildScheduledEvents.guildScheduledEventFromRaw(packet.d));
350
- break;
351
- case constants_1.GatewayEvents.GuildScheduledEventDelete:
352
- this.client.emit("guildScheduledEventDelete", transformers_1.GuildScheduledEvents.guildScheduledEventFromRaw(packet.d));
353
- break;
354
- case constants_1.GatewayEvents.GuildScheduledEventUserAdd:
355
- this.client.emit("guildScheduledEventUserAdd", packet.d.user_id, packet.d.guild_scheduled_event_id, packet.d.guild_id);
356
- break;
357
- case constants_1.GatewayEvents.GuildScheduledEventUserRemove:
358
- this.client.emit("guildScheduledEventUserRemove", packet.d.user_id, packet.d.guild_scheduled_event_id, packet.d.guild_id);
359
- break;
360
- case constants_1.GatewayEvents.GuildSoundboardSoundCreate:
361
- this.client.emit("guildSoundboardSoundCreate", transformers_1.Soundboards.soundboardSoundFromRaw(packet.d));
362
- break;
363
- case constants_1.GatewayEvents.GuildSoundboardSoundUpdate:
364
- this.client.emit("guildSoundboardSoundUpdate", transformers_1.Soundboards.soundboardSoundFromRaw(packet.d));
365
- break;
366
- case constants_1.GatewayEvents.GuildSoundboardSoundDelete:
367
- this.client.emit("guildSoundboardSoundDelete", {
368
- soundId: packet.d.sound_id,
369
- guildId: packet.d.guild_id,
370
- });
371
- break;
372
- case constants_1.GatewayEvents.GuildSoundboardSoundsUpdate:
373
- this.client.emit("guildSoundboardSoundsUpdate", packet.d.soundboard_sounds.map((sound) => transformers_1.Soundboards.soundboardSoundFromRaw(sound)), packet.d.guild_id);
374
- break;
375
- case constants_1.GatewayEvents.SoundboardSounds:
376
- this.client.emit("soundboardSounds", packet.d.soundboard_sounds.map((sound) => transformers_1.Soundboards.soundboardSoundFromRaw(sound)), packet.d.guild_id);
377
- break;
378
- case constants_1.GatewayEvents.IntegrationCreate:
379
- this.client.emit("integrationCreate", {
380
- ...transformers_1.Guilds.integrationFromRaw(packet.d),
381
- guildId: packet.d.guild_id,
382
- });
383
- break;
384
- case constants_1.GatewayEvents.IntegrationUpdate:
385
- this.client.emit("integrationUpdate", {
386
- ...transformers_1.Guilds.integrationFromRaw(packet.d),
387
- guildId: packet.d.guild_id,
388
- });
389
- break;
390
- case constants_1.GatewayEvents.IntegrationDelete:
391
- this.client.emit("integrationDelete", {
392
- id: packet.d.id,
393
- guildId: packet.d.guild_id,
394
- applicationId: packet.d.application_id,
395
- });
396
- break;
397
- case constants_1.GatewayEvents.InteractionCreate:
398
- this.client.emit("interactionCreate", transformers_1.Interactions.interactionFromRaw(packet.d));
399
- break;
400
- case constants_1.GatewayEvents.InviteCreate:
401
- this.client.emit("inviteCreate", {
402
- channelId: packet.d.channel_id,
403
- code: packet.d.code,
404
- createdAt: packet.d.created_at,
405
- guildId: packet.d.guild_id,
406
- inviter: packet.d.inviter !== undefined
407
- ? transformers_1.Users.userFromRaw(packet.d.inviter)
408
- : undefined,
409
- maxAge: packet.d.max_age,
410
- maxUses: packet.d.max_uses,
411
- targetType: packet.d.target_type,
412
- targetUser: packet.d.target_user !== undefined
413
- ? transformers_1.Users.userFromRaw(packet.d.target_user)
414
- : undefined,
415
- targetApplication: packet.d.target_application !== undefined
416
- ? transformers_1.Applications.applicationFromRaw(packet.d.target_application)
417
- : undefined,
418
- temporary: packet.d.temporary,
419
- uses: packet.d.uses,
420
- expiresAt: packet.d.expires_at,
421
- });
422
- break;
423
- case constants_1.GatewayEvents.InviteDelete:
424
- this.client.emit("inviteDelete", {
425
- channelId: packet.d.channel_id,
426
- guildId: packet.d.guild_id,
427
- code: packet.d.code,
428
- });
429
- break;
430
- case constants_1.GatewayEvents.MessageCreate:
431
- this.client.emit("messageCreate", {
432
- ...transformers_1.Messages.messageFromRaw(packet.d),
433
- guildId: packet.d.guild_id,
434
- member: packet.d.member !== undefined
435
- ? transformers_1.Guilds.guildMemberFromRaw(packet.d.member)
436
- : undefined,
437
- mentions: packet.d.mentions.map((mention) => transformers_1.Users.userFromRaw(mention)),
438
- });
439
- break;
440
- case constants_1.GatewayEvents.MessageUpdate:
441
- this.client.emit("messageUpdate", transformers_1.Messages.messageFromRaw(packet.d));
442
- break;
443
- case constants_1.GatewayEvents.MessageDelete:
444
- this.client.emit("messageDelete", {
445
- id: packet.d.id,
446
- channelId: packet.d.channel_id,
447
- guildId: packet.d.guild_id,
448
- });
449
- break;
450
- case constants_1.GatewayEvents.MessageDeleteBulk:
451
- this.client.emit("messageDeleteBulk", {
452
- ids: packet.d.ids,
453
- channelId: packet.d.channel_id,
454
- guildId: packet.d.guild_id,
455
- });
456
- break;
457
- case constants_1.GatewayEvents.MessageReactionAdd:
458
- this.client.emit("messageReactionAdd", {
459
- userId: packet.d.user_id,
460
- channelId: packet.d.user_id,
461
- messageId: packet.d.user_id,
462
- guildId: packet.d.user_id,
463
- member: packet.d.member !== undefined
464
- ? transformers_1.Guilds.guildMemberFromRaw(packet.d.member)
465
- : undefined,
466
- emoji: transformers_1.Emojis.emojiFromRaw(packet.d.emoji),
467
- messageAuthorId: packet.d.message_author_id,
468
- burst: packet.d.burst,
469
- burstColors: packet.d.burst_colors,
470
- type: packet.d.type,
471
- });
472
- break;
473
- case constants_1.GatewayEvents.MessageReactionRemove:
474
- this.client.emit("messageReactionRemove", {
475
- userId: packet.d.user_id,
476
- channelId: packet.d.user_id,
477
- messageId: packet.d.user_id,
478
- guildId: packet.d.user_id,
479
- emoji: transformers_1.Emojis.emojiFromRaw(packet.d.emoji),
480
- burst: packet.d.burst,
481
- type: packet.d.type,
482
- });
483
- break;
484
- case constants_1.GatewayEvents.MessageReactionRemoveAll:
485
- this.client.emit("messageReactionRemoveAll", {
486
- channelId: packet.d.channel_id,
487
- messageId: packet.d.message_id,
488
- guildId: packet.d.guild_id,
489
- });
490
- break;
491
- case constants_1.GatewayEvents.MessageReactionRemoveEmoji:
492
- this.client.emit("messageReactionRemoveEmoji", {
493
- channelId: packet.d.channel_id,
494
- guildId: packet.d.guild_id,
495
- messageId: packet.d.message_id,
496
- emoji: transformers_1.Emojis.emojiFromRaw(packet.d.emoji),
497
- });
498
- break;
499
- case constants_1.GatewayEvents.PresenceUpdate:
500
- this.client.emit("presenceUpdate", transformers_1.Presences.presenceFromRaw(packet.d));
501
- break;
502
- case constants_1.GatewayEvents.StageInstanceCreate:
503
- this.client.emit("stageInstanceCreate", transformers_1.StageInstances.stageInstanceFromRaw(packet.d));
504
- break;
505
- case constants_1.GatewayEvents.StageInstanceUpdate:
506
- this.client.emit("stageInstanceUpdate", transformers_1.StageInstances.stageInstanceFromRaw(packet.d));
507
- break;
508
- case constants_1.GatewayEvents.StageInstanceDelete:
509
- this.client.emit("stageInstanceDelete", transformers_1.StageInstances.stageInstanceFromRaw(packet.d));
510
- break;
511
- case constants_1.GatewayEvents.TypingStart:
512
- this.client.emit("typingStart", {
513
- channelId: packet.d.channel_id,
514
- guildId: packet.d.guild_id,
515
- userId: packet.d.user_id,
516
- timestamp: packet.d.timestamp,
517
- member: packet.d.member !== undefined
518
- ? transformers_1.Guilds.guildMemberFromRaw(packet.d.member)
519
- : undefined,
520
- });
521
- break;
522
- case constants_1.GatewayEvents.UserUpdate:
523
- this.client.emit("userUpdate", transformers_1.Users.userFromRaw(packet.d));
524
- break;
525
- case constants_1.GatewayEvents.VoiceChannelEffectSend:
526
- this.client.emit("voiceChannelEffectSend", {
527
- channelId: packet.d.channel_id,
528
- guildId: packet.d.guild_id,
529
- userId: packet.d.user_id,
530
- emoji: packet.d.emoji !== null
531
- ? transformers_1.Emojis.emojiFromRaw(packet.d.emoji)
532
- : null,
533
- animationType: packet.d.animation_type,
534
- animationId: packet.d.animation_id,
535
- soundId: packet.d.sound_id,
536
- soundVolume: packet.d.sound_volume,
537
- });
538
- break;
539
- case constants_1.GatewayEvents.VoiceStateUpdate:
540
- this.client.emit("voiceStateUpdate", transformers_1.Voice.voiceStateFromRaw(packet.d));
541
- break;
542
- case constants_1.GatewayEvents.VoiceServerUpdate:
543
- {
544
- this.client.emit("voiceServerUpdate", {
545
- token: packet.d.token,
546
- guildId: packet.d.guild_id,
547
- endpoint: packet.d.endpoint,
548
- });
549
- }
550
- break;
551
- case constants_1.GatewayEvents.WebhooksUpdate:
552
- this.client.emit("webhooksUpdate", packet.d.channel_id, packet.d.guild_id);
553
- break;
554
- case constants_1.GatewayEvents.SubscriptionCreate:
555
- this.client.emit("subscriptionCreate", transformers_1.Subscriptions.subscriptionFromRaw(packet.d));
556
- break;
557
- case constants_1.GatewayEvents.SubscriptionUpdate:
558
- this.client.emit("subscriptionUpdate", transformers_1.Subscriptions.subscriptionFromRaw(packet.d));
559
- break;
560
- case constants_1.GatewayEvents.SubscriptionDelete:
561
- this.client.emit("subscriptionDelete", transformers_1.Subscriptions.subscriptionFromRaw(packet.d));
562
- break;
563
- case constants_1.GatewayEvents.MessagePollVoteAdd:
564
- this.client.emit("messagePollVoteAdd", {
565
- userId: packet.d.user_id,
566
- channelId: packet.d.channel_id,
567
- messageId: packet.d.message_id,
568
- guildId: packet.d.guild_id,
569
- answerId: packet.d.answer_id,
570
- });
571
- break;
572
- case constants_1.GatewayEvents.MessagePollVoteRemove:
573
- this.client.emit("messagePollVoteRemove", {
574
- userId: packet.d.user_id,
575
- channelId: packet.d.channel_id,
576
- messageId: packet.d.message_id,
577
- guildId: packet.d.guild_id,
578
- answerId: packet.d.answer_id,
579
- });
580
- break;
99
+ this.ws = null;
100
+ this.transmitter = new Transmitter_1.Transmitter(null);
101
+ }
102
+ if (reconnect &&
103
+ this.sessionId &&
104
+ this.sequence &&
105
+ this.resumeGatewayURL) {
106
+ this.ws = new ws_1.default(this.resumeGatewayURL, this.client.ws);
107
+ this.transmitter = new Transmitter_1.Transmitter(this.ws);
108
+ this.connect();
109
+ }
581
110
  }
582
111
  }
583
- onWebSocketOpen(reconnect) {
584
- if (reconnect) {
585
- this.resume({
586
- token: this.client.token,
587
- sessionId: this.sessionId,
588
- seq: this.sequence,
589
- });
590
- }
591
- else {
592
- this.identify({
593
- token: this.client.token,
594
- properties: {
595
- os: this.client.properties?.os ?? process.platform,
596
- browser: this.client.properties?.browser ?? pkg.name,
597
- device: this.client.properties?.device ?? pkg.name,
598
- },
599
- compress: this.client.compress,
600
- largeThreshold: this.client.largeThreshold,
601
- shard: [this.id, this.client.shardsCount],
602
- presence: this.client.presence !== undefined
603
- ? {
604
- since: this.client.presence.status === constants_1.StatusTypes.Idle
605
- ? Date.now()
606
- : null,
607
- activities: this.client.presence.activities?.map((activity) => ({
608
- name: activity.type === constants_1.ActivityType.Custom
609
- ? "Custom Status"
610
- : activity.name,
611
- type: activity.type,
612
- url: activity.url,
613
- state: activity.state,
614
- })),
615
- status: this.client.presence.status ?? constants_1.StatusTypes.Online,
616
- afk: !!this.client.presence.afk,
617
- }
618
- : undefined,
619
- intents: this.client.intents,
620
- });
621
- }
112
+ identify() {
113
+ this.transmitter.identify({
114
+ token: this.client.token,
115
+ properties: {
116
+ os: this.client.properties?.os ?? process.platform,
117
+ browser: this.client.properties?.browser ?? pkg.name,
118
+ device: this.client.properties?.device ?? pkg.name,
119
+ },
120
+ compress: this.client.compress,
121
+ largeThreshold: this.client.largeThreshold,
122
+ shard: [this.id, this.client.shardsCount],
123
+ presence: this.client.presence !== undefined
124
+ ? {
125
+ since: this.client.presence.status === constants_1.StatusTypes.Idle
126
+ ? Date.now()
127
+ : null,
128
+ activities: this.client.presence.activities?.map((activity) => ({
129
+ name: activity.type === constants_1.ActivityType.Custom
130
+ ? "Custom Status"
131
+ : activity.name,
132
+ type: activity.type,
133
+ url: activity.url,
134
+ state: activity.state,
135
+ })),
136
+ status: this.client.presence.status ?? constants_1.StatusTypes.Online,
137
+ afk: !!this.client.presence.afk,
138
+ }
139
+ : undefined,
140
+ intents: this.client.intents,
141
+ });
622
142
  }
143
+ onWebSocketOpen() { }
623
144
  onWebSocketMessage(data) {
624
145
  const packet = JSON.parse(data.toString());
625
146
  switch (packet.op) {
626
147
  case constants_1.GatewayOPCodes.Dispatch:
627
- this.onDispatch(packet);
148
+ this.sequence = packet.s;
149
+ this.client.emit("dispatch", packet, this.id);
150
+ this.dispatcher.dispatch(packet.t, packet.d);
151
+ break;
152
+ case constants_1.GatewayOPCodes.Heartbeat:
153
+ this.client.emit("heartbeat", this.id);
154
+ this.transmitter.heartbeat(this.sequence);
628
155
  break;
629
156
  case constants_1.GatewayOPCodes.Reconnect:
630
157
  {
631
- this.client.emit("reconnect");
632
- this.reconnect();
158
+ this.client.emit("reconnect", this.id);
159
+ this.disconnect(this.client.reconnect);
633
160
  }
634
161
  break;
635
162
  case constants_1.GatewayOPCodes.InvalidSession:
636
163
  {
637
- this.client.emit("invalidSession");
164
+ this.client.emit("invalidSession", this.id);
638
165
  if (packet.d) {
639
- this.reconnect();
166
+ this.resume();
640
167
  }
641
- else if (this.ws) {
642
- this.ws.close(1000, "Invalid Session - Identify required");
643
- this.ws = new ws_1.default("wss://gateway.discord.gg/?v=10&encoding=json", this.client.ws);
644
- this.connect(false);
168
+ else {
169
+ this.sequence = null;
170
+ this.sessionId = null;
171
+ this.identify();
645
172
  }
646
173
  }
647
174
  break;
648
175
  case constants_1.GatewayOPCodes.Hello:
649
176
  {
650
- this.heartbeatInterval = setInterval(() => this.heartbeat(null), packet.d.heartbeat_interval);
177
+ this.heartbeatInterval = setInterval(() => this.transmitter.heartbeat(this.sequence), packet.d.heartbeat_interval);
178
+ if (this.sessionId && this.sequence && this.resumeGatewayURL) {
179
+ this.resume();
180
+ }
181
+ else {
182
+ this.identify();
183
+ }
651
184
  this.client.emit("hello", packet.d.heartbeat_interval, this.id);
652
185
  }
653
186
  break;
@@ -660,6 +193,7 @@ class Shard {
660
193
  throw err;
661
194
  }
662
195
  onWebSocketClose(code, reason) {
196
+ let reconnect = false;
663
197
  switch (code) {
664
198
  case 1000:
665
199
  break;
@@ -671,86 +205,19 @@ class Shard {
671
205
  case constants_1.GatewayCloseEventCodes.InvalidSequence:
672
206
  case constants_1.GatewayCloseEventCodes.RateLimited:
673
207
  case constants_1.GatewayCloseEventCodes.SessionTimedOut:
674
- this.reconnect();
208
+ reconnect = this.client.reconnect;
675
209
  break;
676
210
  default:
677
211
  throw new utils_1.GatewayError(code, reason.toString());
678
212
  }
679
- }
680
- /** https://discord.com/developers/docs/topics/gateway-events#request-guild-members */
681
- requestGuildMembers(options) {
682
- if (!this.ws)
683
- return;
684
- this.ws.send(JSON.stringify({
685
- op: constants_1.GatewayOPCodes.RequestGuildMembers,
686
- d: {
687
- guild_id: options.guildId,
688
- query: options.query,
689
- limit: options.limit,
690
- presences: options.presences,
691
- user_ids: options.userIds,
692
- nonce: options.nonce,
693
- },
694
- }));
695
- }
696
- /** https://discord.com/developers/docs/topics/gateway-events#request-soundboard-sounds */
697
- requestSoundboardSounds(options) {
698
- if (!this.ws)
699
- return;
700
- this.ws.send(JSON.stringify({
701
- op: constants_1.GatewayOPCodes.RequestSoundboardSounds,
702
- d: {
703
- guild_ids: options.guildIds,
704
- },
705
- }));
706
- }
707
- /** https://discord.com/developers/docs/topics/gateway-events#resume */
708
- resume(options) {
709
- if (!this.ws)
710
- return;
711
- this.ws.send(JSON.stringify({
712
- op: constants_1.GatewayOPCodes.Resume,
713
- d: {
714
- token: options.token,
715
- session_id: options.sessionId,
716
- seq: options.seq,
717
- },
718
- }));
719
- }
720
- /** https://discord.com/developers/docs/topics/gateway-events#update-presence */
721
- updatePresence(options) {
722
- if (!this.ws)
723
- return;
724
- this.ws.send(JSON.stringify({
725
- op: constants_1.GatewayOPCodes.PresenceUpdate,
726
- d: {
727
- since: options.status === constants_1.StatusTypes.Idle ? Date.now() : null,
728
- activities: options.activities?.map((activity) => ({
729
- name: activity.type === constants_1.ActivityType.Custom
730
- ? "Custom Status"
731
- : activity.name,
732
- type: activity.type,
733
- url: activity.url,
734
- state: activity.state,
735
- })),
736
- status: options.status ?? constants_1.StatusTypes.Online,
737
- afk: !!options.afk,
738
- },
739
- }));
740
- }
741
- /** https://discord.com/developers/docs/topics/gateway-events#update-voice-state */
742
- updateVoiceState(options) {
743
- if (!this.ws)
744
- return;
745
- this.ws.send(JSON.stringify({
746
- op: constants_1.GatewayOPCodes.VoiceStateUpdate,
747
- d: {
748
- guild_id: options.guildId,
749
- channel_id: options.channelId,
750
- self_mute: options.selfMute,
751
- self_deaf: options.selfDeaf,
752
- },
753
- }));
213
+ this.disconnect(reconnect);
214
+ }
215
+ resume() {
216
+ this.transmitter.resume({
217
+ token: this.client.token,
218
+ sessionId: this.sessionId,
219
+ seq: this.sequence,
220
+ });
754
221
  }
755
222
  }
756
223
  exports.Shard = Shard;