diff --git a/src/client/websocket/WebSocketManager.js b/src/client/websocket/WebSocketManager.js index 8c2f532f2..23dbadce8 100644 --- a/src/client/websocket/WebSocketManager.js +++ b/src/client/websocket/WebSocketManager.js @@ -1,5 +1,6 @@ 'use strict'; +const EventEmitter = require('events'); const { Error: DJSError } = require('../../errors'); const Collection = require('../../util/Collection'); const Util = require('../../util/Util'); @@ -21,9 +22,14 @@ const UNRECOVERABLE_CLOSE_CODES = [4004, 4010, 4011]; /** * The WebSocket manager for this client. + * This class forwards raw dispatch events, + * read more about it here {@link https://discordapp.com/developers/docs/topics/gateway} + * @extends EventEmitter */ -class WebSocketManager { +class WebSocketManager extends EventEmitter { constructor(client) { + super(); + /** * The client that instantiated this WebSocketManager * @type {Client} diff --git a/src/client/websocket/WebSocketShard.js b/src/client/websocket/WebSocketShard.js index 814edb03e..67d494e2c 100644 --- a/src/client/websocket/WebSocketShard.js +++ b/src/client/websocket/WebSocketShard.js @@ -257,6 +257,7 @@ class WebSocketShard extends EventEmitter { try { packet = WebSocket.unpack(this.inflate.result); this.manager.client.emit(Events.RAW, packet, this.id); + if (packet.op === OPCodes.DISPATCH) this.manager.emit(packet.t, packet.d, this.id); } catch (err) { this.manager.client.emit(Events.SHARD_ERROR, err, this.id); return; diff --git a/typings/index.d.ts b/typings/index.d.ts index dd117d172..4a57b1ec9 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1291,7 +1291,7 @@ declare module 'discord.js' { constructor(id: string, token: string, options?: ClientOptions); } - export class WebSocketManager { + export class WebSocketManager extends EventEmitter { constructor(client: Client); private totalShards: number | string; private shardQueue: Set; @@ -1306,6 +1306,8 @@ declare module 'discord.js' { public status: Status; public readonly ping: number; + public on(event: WSEventType, listener: (data: any, shardID: number) => void): this; + public once(event: WSEventType, listener: (data: any, shardID: number) => void): this; private debug(message: string, shard?: WebSocketShard): void; private connect(): Promise; private createShards(): Promise;