disgroove 3.0.0-dev.72bf12 → 3.0.0-dev.7dc321a

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