diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index e680069ba..3c082df9c 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -86,7 +86,7 @@ var _UtilTokenCacher = require("../Util/TokenCacher"); var _UtilTokenCacher2 = _interopRequireDefault(_UtilTokenCacher); -var GATEWAY_VERSION = 4; +var GATEWAY_VERSION = 5; var zlib; var libVersion = require('../../package.json').version; @@ -1806,13 +1806,7 @@ var InternalClient = (function () { this.websocket = new _ws2["default"](url); - this.websocket.onopen = function () { - if (_this36.sessionID) { - _this36.resume(); - } else { - _this36.identify(); - } - }; + this.websocket.onopen = function () {}; this.websocket.onclose = function (event) { _this36.websocket = null; @@ -1889,52 +1883,28 @@ var InternalClient = (function () { _this36.sequence = 0; _this36.identify(); break; + case 10: + console.log(packet); + if (_this36.sessionID) { + _this36.resume(); + } else { + _this36.identify(); + } + _this36.heartbeat(); + _this36.intervals.kai = setInterval(function () { + return _this36.heartbeat(); + }, packet.d.heartbeat_interval); + break; + case 11: + _this36.heartbeatAcked = true; + break; + default: + _this36.client.emit("unknown", packet); + break; } }; }; - InternalClient.prototype.resume = function resume() { - var data = { - op: 6, - d: { - token: this.token, - session_id: this.sessionID, - seq: this.sequence - } - }; - - this.sendWS(data); - }; - - InternalClient.prototype.identify = function identify() { - var data = { - op: 2, - d: { - token: this.token, - v: GATEWAY_VERSION, - compress: this.client.options.compress, - large_threshold: this.client.options.largeThreshold, - properties: { - "$os": process.platform, - "$browser": "discord.js", - "$device": "discord.js", - "$referrer": "", - "$referring_domain": "" - } - } - }; - - if (this.client.options.shard) { - data.d.shard = this.client.options.shard; - } - - this.sendWS(data); - }; - - InternalClient.prototype.heartbeat = function heartbeat() { - this.sendWS({ op: 1, d: Date.now() }); - }; - InternalClient.prototype.processPacket = function processPacket(packet) { var _this37 = this; @@ -1943,9 +1913,8 @@ var InternalClient = (function () { switch (packet.t) { case _Constants.PacketType.RESUME: case _Constants.PacketType.READY: - this.intervals.kai = setInterval(function () { - return _this37.heartbeat(); - }, data.heartbeat_interval); + this.autoReconnectInterval = 1000; + this.state = _ConnectionState2["default"].READY; if (packet.t === _Constants.PacketType.RESUME) { break; @@ -1959,7 +1928,6 @@ var InternalClient = (function () { this.forceFetchCount = {}; this.forceFetchQueue = []; this.forceFetchLength = 1; - this.autoReconnectInterval = 1000; data.guilds.forEach(function (server) { if (!server.unavailable) { @@ -2016,8 +1984,6 @@ var InternalClient = (function () { } } - this.state = _ConnectionState2["default"].READY; - client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process"); client.emit("debug", "ready with " + this.servers.length + " servers, " + this.unavailableServers.length + " unavailable servers, " + this.channels.length + " channels and " + this.users.length + " users cached."); @@ -2060,6 +2026,23 @@ var InternalClient = (function () { client.emit("warn", "message was deleted but channel is not cached"); } break; + case _Constants.PacketType.MESSAGE_DELETE_BULK: + var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id); + if (channel) { + data.ids.forEach(function (id) { + // potentially blank + var msg = channel.messages.get("id", id); + client.emit("messageDeleted", msg, channel); + if (msg) { + channel.messages.remove(msg); + } else { + client.emit("debug", "message was deleted but message is not cached"); + } + }); + } else { + client.emit("warn", "message was deleted but channel is not cached"); + } + break; case _Constants.PacketType.MESSAGE_UPDATE: // format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id); @@ -2670,6 +2653,48 @@ var InternalClient = (function () { } }; + InternalClient.prototype.resume = function resume() { + var data = { + op: 6, + d: { + token: this.token, + session_id: this.sessionID, + seq: this.sequence + } + }; + + this.sendWS(data); + }; + + InternalClient.prototype.identify = function identify() { + var data = { + op: 2, + d: { + token: this.token, + v: GATEWAY_VERSION, + compress: this.client.options.compress, + large_threshold: this.client.options.largeThreshold, + properties: { + "$os": process.platform, + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "", + "$referring_domain": "" + } + } + }; + + if (this.client.options.shard) { + data.d.shard = this.client.options.shard; + } + + this.sendWS(data); + }; + + InternalClient.prototype.heartbeat = function heartbeat() { + this.sendWS({ op: 1, d: Date.now() }); + }; + _createClass(InternalClient, [{ key: "uptime", get: function get() { diff --git a/lib/Constants.js b/lib/Constants.js index bb40cbd59..b6807521d 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -134,6 +134,7 @@ Constants.PacketType = { CHANNEL_UPDATE: "CHANNEL_UPDATE", MESSAGE_CREATE: "MESSAGE_CREATE", MESSAGE_DELETE: "MESSAGE_DELETE", + MESSAGE_DELETE_BULK: "MESSAGE_DELETE_BULK", MESSAGE_UPDATE: "MESSAGE_UPDATE", PRESENCE_UPDATE: "PRESENCE_UPDATE", READY: "READY", diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index a1631e1a3..903b1acc4 100755 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -24,7 +24,7 @@ import Invite from "../Structures/Invite"; import VoiceConnection from "../Voice/VoiceConnection"; import TokenCacher from "../Util/TokenCacher"; -var GATEWAY_VERSION = 4; +var GATEWAY_VERSION = 5; var zlib; var libVersion = require('../../package.json').version; @@ -1578,11 +1578,6 @@ export default class InternalClient { this.websocket = new WebSocket(url); this.websocket.onopen = () => { - if(this.sessionID) { - this.resume(); - } else { - this.identify(); - } }; this.websocket.onclose = (event) => { @@ -1660,59 +1655,34 @@ export default class InternalClient { this.sequence = 0; this.identify(); break; + case 10: + console.log(packet); + if(this.sessionID) { + this.resume(); + } else { + this.identify(); + } + this.heartbeat(); + this.intervals.kai = setInterval(() => this.heartbeat(), packet.d.heartbeat_interval); + break; + case 11: + this.heartbeatAcked = true; + break; + default: + this.client.emit("unknown", packet); + break; } }; } - resume() { - var data = { - op: 6, - d: { - token: this.token, - session_id: this.sessionID, - seq: this.sequence - } - }; - - this.sendWS(data); - } - - identify() { - var data = { - op: 2, - d: { - token: this.token, - v: GATEWAY_VERSION, - compress: this.client.options.compress, - large_threshold : this.client.options.largeThreshold, - properties: { - "$os": process.platform, - "$browser": "discord.js", - "$device": "discord.js", - "$referrer": "", - "$referring_domain": "" - } - } - }; - - if (this.client.options.shard) { - data.d.shard = this.client.options.shard; - } - - this.sendWS(data); - } - - heartbeat() { - this.sendWS({ op: 1, d: Date.now() }); - } - processPacket(packet) { var client = this.client; var data = packet.d; switch (packet.t) { case PacketType.RESUME: case PacketType.READY: - this.intervals.kai = setInterval(() => this.heartbeat(), data.heartbeat_interval); + this.autoReconnectInterval = 1000; + this.state = ConnectionState.READY; if(packet.t === PacketType.RESUME) { break; @@ -1726,7 +1696,6 @@ export default class InternalClient { this.forceFetchCount = {}; this.forceFetchQueue = []; this.forceFetchLength = 1; - this.autoReconnectInterval = 1000; data.guilds.forEach(server => { if (!server.unavailable) { @@ -1778,9 +1747,6 @@ export default class InternalClient { } } - - this.state = ConnectionState.READY; - client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); client.emit("debug", `ready with ${this.servers.length} servers, ${this.unavailableServers.length} unavailable servers, ${this.channels.length} channels and ${this.users.length} users cached.`); @@ -1821,6 +1787,23 @@ export default class InternalClient { client.emit("warn", "message was deleted but channel is not cached"); } break; + case PacketType.MESSAGE_DELETE_BULK: + var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id); + if (channel) { + data.ids.forEach((id) => { + // potentially blank + var msg = channel.messages.get("id", id); + client.emit("messageDeleted", msg, channel); + if (msg) { + channel.messages.remove(msg); + } else { + client.emit("debug", "message was deleted but message is not cached"); + } + }); + } else { + client.emit("warn", "message was deleted but channel is not cached"); + } + break; case PacketType.MESSAGE_UPDATE: // format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id); @@ -2391,4 +2374,46 @@ export default class InternalClient { break; } } + + resume() { + var data = { + op: 6, + d: { + token: this.token, + session_id: this.sessionID, + seq: this.sequence + } + }; + + this.sendWS(data); + } + + identify() { + var data = { + op: 2, + d: { + token: this.token, + v: GATEWAY_VERSION, + compress: this.client.options.compress, + large_threshold : this.client.options.largeThreshold, + properties: { + "$os": process.platform, + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "", + "$referring_domain": "" + } + } + }; + + if (this.client.options.shard) { + data.d.shard = this.client.options.shard; + } + + this.sendWS(data); + } + + heartbeat() { + this.sendWS({ op: 1, d: Date.now() }); + } } diff --git a/src/Constants.js b/src/Constants.js index 4e142d5c9..dffa52204 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -87,6 +87,7 @@ Constants.PacketType = { CHANNEL_UPDATE : "CHANNEL_UPDATE", MESSAGE_CREATE : "MESSAGE_CREATE", MESSAGE_DELETE : "MESSAGE_DELETE", + MESSAGE_DELETE_BULK : "MESSAGE_DELETE_BULK", MESSAGE_UPDATE : "MESSAGE_UPDATE", PRESENCE_UPDATE : "PRESENCE_UPDATE", READY : "READY",