Attempting gateway v4

This commit is contained in:
abalabahaha
2016-09-18 07:59:35 +09:00
parent 3e39d54933
commit e3c7fd70e1
4 changed files with 1579 additions and 1461 deletions

View File

@@ -86,6 +86,7 @@ var _UtilTokenCacher = require("../Util/TokenCacher");
var _UtilTokenCacher2 = _interopRequireDefault(_UtilTokenCacher); var _UtilTokenCacher2 = _interopRequireDefault(_UtilTokenCacher);
var GATEWAY_VERSION = 4;
var zlib; var zlib;
var libVersion = require('../../package.json').version; var libVersion = require('../../package.json').version;
@@ -1795,45 +1796,29 @@ var InternalClient = (function () {
InternalClient.prototype.createWS = function createWS(url) { InternalClient.prototype.createWS = function createWS(url) {
var _this36 = this; var _this36 = this;
var self = this;
var client = self.client;
if (this.websocket) { if (this.websocket) {
return false; return false;
} }
if (!url.endsWith("/")) {
url += "/";
}
url += "?encoding=json&v=" + GATEWAY_VERSION;
this.websocket = new _ws2["default"](url); this.websocket = new _ws2["default"](url);
this.websocket.onopen = function () { this.websocket.onopen = function () {
var data = { if (_this36.sessionID) {
op: 2, _this36.resume();
d: { } else {
token: self.token, _this36.identify();
v: 3,
compress: self.client.options.compress,
large_threshold: self.client.options.largeThreshold,
properties: {
"$os": process.platform,
"$browser": "discord.js",
"$device": "discord.js",
"$referrer": "",
"$referring_domain": ""
} }
}
};
if (self.client.options.shard) {
data.d.shard = self.client.options.shard;
}
self.sendWS(data);
}; };
this.websocket.onclose = function (event) { this.websocket.onclose = function (event) {
self.websocket = null; _this36.websocket = null;
self.state = _ConnectionState2["default"].DISCONNECTED; _this36.state = _ConnectionState2["default"].DISCONNECTED;
if (event && event.code) { if (event && event.code) {
client.emit("warn", "WS close: " + event.code); _this36.client.emit("warn", "WS close: " + event.code);
var err; var err;
if (event.code === 4001) { if (event.code === 4001) {
err = new Error("Gateway received invalid OP code"); err = new Error("Gateway received invalid OP code");
@@ -1848,7 +1833,7 @@ var InternalClient = (function () {
}if (event.code === 4006 || event.code === 4009) { }if (event.code === 4006 || event.code === 4009) {
err = new Error("Invalid session"); err = new Error("Invalid session");
} else if (event.code === 4007) { } else if (event.code === 4007) {
_this36.seq = 0; _this36.sequence = 0;
err = new Error("Invalid sequence number"); err = new Error("Invalid sequence number");
} else if (event.code === 4008) { } else if (event.code === 4008) {
err = new Error("Gateway connection was ratelimited"); err = new Error("Gateway connection was ratelimited");
@@ -1856,17 +1841,17 @@ var InternalClient = (function () {
err = new Error("Invalid shard key"); err = new Error("Invalid shard key");
} }
if (err) { if (err) {
client.emit("error", err); _this36.client.emit("error", err);
} }
} }
self.disconnected(_this36.client.options.autoReconnect); _this36.disconnected(_this36.client.options.autoReconnect);
}; };
this.websocket.onerror = function (e) { this.websocket.onerror = function (e) {
client.emit("error", e); _this36.client.emit("error", e);
self.websocket = null; _this36.websocket = null;
self.state = _ConnectionState2["default"].DISCONNECTED; _this36.state = _ConnectionState2["default"].DISCONNECTED;
self.disconnected(_this36.client.options.autoReconnect); _this36.disconnected(_this36.client.options.autoReconnect);
}; };
this.websocket.onmessage = function (e) { this.websocket.onmessage = function (e) {
@@ -1875,108 +1860,183 @@ var InternalClient = (function () {
e.data = zlib.inflateSync(e.data).toString(); e.data = zlib.inflateSync(e.data).toString();
} }
var packet, data; var packet;
try { try {
packet = JSON.parse(e.data); packet = JSON.parse(e.data);
data = packet.d;
} catch (e) { } catch (e) {
client.emit("error", e); _this36.client.emit("error", e);
return; return;
} }
client.emit("raw", packet); _this36.client.emit("raw", packet);
switch (packet.t) {
if (packet.s) {
_this36.sequence = packet.s;
}
switch (packet.op) {
case 0:
_this36.processPacket(packet);
break;
case 1:
_this36.heartbeat();
break;
case 7:
_this36.disconnected(true);
break;
case 9:
_this36.sessionID = null;
_this36.sequence = 0;
_this36.identify();
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;
var client = this.client;
var data = packet.d;
switch (packet.t) {
case _Constants.PacketType.RESUME:
case _Constants.PacketType.READY: case _Constants.PacketType.READY:
var startTime = Date.now(); this.intervals.kai = setInterval(function () {
self.intervals.kai = setInterval(function () { return _this37.heartbeat();
return self.sendWS({ op: 1, d: Date.now() });
}, data.heartbeat_interval); }, data.heartbeat_interval);
self.user = self.users.add(new _StructuresUser2["default"](data.user, client)); if (packet.t === _Constants.PacketType.RESUME) {
break;
}
_this36.forceFetchCount = {}; this.sessionID = data.session_id;
_this36.forceFetchQueue = []; var startTime = Date.now();
_this36.forceFetchLength = 1;
_this36.autoReconnectInterval = 1000; this.user = this.users.add(new _StructuresUser2["default"](data.user, client));
_this36.sessionID = data.session_id;
this.forceFetchCount = {};
this.forceFetchQueue = [];
this.forceFetchLength = 1;
this.autoReconnectInterval = 1000;
data.guilds.forEach(function (server) { data.guilds.forEach(function (server) {
if (!server.unavailable) { if (!server.unavailable) {
server = self.servers.add(new _StructuresServer2["default"](server, client)); server = _this37.servers.add(new _StructuresServer2["default"](server, client));
if (self.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) { if (_this37.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); _this37.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
} }
} else { } else {
client.emit("debug", "server " + server.id + " was unavailable, could not create (ready)"); client.emit("debug", "server " + server.id + " was unavailable, could not create (ready)");
self.unavailableServers.add(server); _this37.unavailableServers.add(server);
} }
}); });
data.private_channels.forEach(function (pm) { data.private_channels.forEach(function (pm) {
self.private_channels.add(new _StructuresPMChannel2["default"](pm, client)); _this37.private_channels.add(new _StructuresPMChannel2["default"](pm, client));
}); });
if (!data.user.bot) { if (!data.user.bot) {
// bots dont have friends // bots dont have friends
data.relationships.forEach(function (friend) { data.relationships.forEach(function (friend) {
if (friend.type === 1) { if (friend.type === 1) {
// is a friend // is a friend
self.friends.add(new _StructuresUser2["default"](friend.user, client)); _this37.friends.add(new _StructuresUser2["default"](friend.user, client));
} else if (friend.type === 2) { } else if (friend.type === 2) {
// incoming friend requests // incoming friend requests
self.blocked_users.add(new _StructuresUser2["default"](friend.user, client)); _this37.blocked_users.add(new _StructuresUser2["default"](friend.user, client));
} else if (friend.type === 3) { } else if (friend.type === 3) {
// incoming friend requests // incoming friend requests
self.incoming_friend_requests.add(new _StructuresUser2["default"](friend.user, client)); _this37.incoming_friend_requests.add(new _StructuresUser2["default"](friend.user, client));
} else if (friend.type === 4) { } else if (friend.type === 4) {
// outgoing friend requests // outgoing friend requests
self.outgoing_friend_requests.add(new _StructuresUser2["default"](friend.user, client)); _this37.outgoing_friend_requests.add(new _StructuresUser2["default"](friend.user, client));
} else { } else {
client.emit("warn", "unknown friend type " + friend.type); client.emit("warn", "unknown friend type " + friend.type);
} }
}); });
} else { } else {
self.friends = null; this.friends = null;
self.blocked_users = null; this.blocked_users = null;
self.incoming_friend_requests = null; this.incoming_friend_requests = null;
self.outgoing_friend_requests = null; this.outgoing_friend_requests = null;
} }
// add notes to users // add notes to users
if (data.notes) { if (data.notes) {
for (note in data.notes) { for (note in data.notes) {
var user = self.users.get("id", note); var user = this.users.get("id", note);
if (user) { if (user) {
var newUser = user; var newUser = user;
newUser.note = data.notes[note]; newUser.note = data.notes[note];
self.users.update(user, newUser); this.users.update(user, newUser);
} else { } else {
client.emit("warn", "note in ready packet but user not cached"); client.emit("warn", "note in ready packet but user not cached");
} }
} }
} }
self.state = _ConnectionState2["default"].READY; this.state = _ConnectionState2["default"].READY;
client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process"); client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process");
client.emit("debug", "ready with " + self.servers.length + " servers, " + self.unavailableServers.length + " unavailable servers, " + self.channels.length + " channels and " + self.users.length + " users cached."); client.emit("debug", "ready with " + this.servers.length + " servers, " + this.unavailableServers.length + " unavailable servers, " + this.channels.length + " channels and " + this.users.length + " users cached.");
self.restartServerCreateTimeout(); this.restartServerCreateTimeout();
break; break;
case _Constants.PacketType.MESSAGE_CREATE: case _Constants.PacketType.MESSAGE_CREATE:
// format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format // format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (channel) { if (channel) {
var msg = channel.messages.add(new _StructuresMessage2["default"](data, channel, client)); var msg = channel.messages.add(new _StructuresMessage2["default"](data, channel, client));
channel.lastMessageID = msg.id; channel.lastMessageID = msg.id;
if (self.messageAwaits[channel.id + msg.author.id]) { if (this.messageAwaits[channel.id + msg.author.id]) {
self.messageAwaits[channel.id + msg.author.id].map(function (fn) { this.messageAwaits[channel.id + msg.author.id].map(function (fn) {
return fn(msg); return fn(msg);
}); });
self.messageAwaits[channel.id + msg.author.id] = null; this.messageAwaits[channel.id + msg.author.id] = null;
client.emit("message", msg, true); //2nd param is isAwaitedMessage client.emit("message", msg, true); //2nd param is isAwaitedMessage
} else { } else {
client.emit("message", msg); client.emit("message", msg);
@@ -1986,7 +2046,7 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.MESSAGE_DELETE: case _Constants.PacketType.MESSAGE_DELETE:
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (channel) { if (channel) {
// potentially blank // potentially blank
var msg = channel.messages.get("id", data.id); var msg = channel.messages.get("id", data.id);
@@ -2002,7 +2062,7 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.MESSAGE_UPDATE: case _Constants.PacketType.MESSAGE_UPDATE:
// format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format // format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (channel) { if (channel) {
// potentially blank // potentially blank
var msg = channel.messages.get("id", data.id); var msg = channel.messages.get("id", data.id);
@@ -2032,28 +2092,28 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_CREATE: case _Constants.PacketType.SERVER_CREATE:
var server = self.servers.get("id", data.id); var server = this.servers.get("id", data.id);
if (!server) { if (!server) {
if (!data.unavailable) { if (!data.unavailable) {
server = self.servers.add(new _StructuresServer2["default"](data, client)); server = this.servers.add(new _StructuresServer2["default"](data, client));
if (client.readyTime) { if (client.readyTime) {
client.emit("serverCreated", server); client.emit("serverCreated", server);
} }
if (self.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) { if (this.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); this.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
} }
var unavailable = self.unavailableServers.get("id", server.id); var unavailable = this.unavailableServers.get("id", server.id);
if (unavailable) { if (unavailable) {
self.unavailableServers.remove(unavailable); this.unavailableServers.remove(unavailable);
} }
self.restartServerCreateTimeout(); this.restartServerCreateTimeout();
} else { } else {
client.emit("debug", "server was unavailable, could not create"); client.emit("debug", "server was unavailable, could not create");
} }
} }
break; break;
case _Constants.PacketType.SERVER_DELETE: case _Constants.PacketType.SERVER_DELETE:
var server = self.servers.get("id", data.id); var server = this.servers.get("id", data.id);
if (server) { if (server) {
if (!data.unavailable) { if (!data.unavailable) {
client.emit("serverDeleted", server); client.emit("serverDeleted", server);
@@ -2072,10 +2132,10 @@ var InternalClient = (function () {
var channel = _ref7; var channel = _ref7;
self.channels.remove(channel); this.channels.remove(channel);
} }
self.servers.remove(server); this.servers.remove(server);
for (var _iterator8 = server.members, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { for (var _iterator8 = server.members, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {
var _ref8; var _ref8;
@@ -2092,7 +2152,7 @@ var InternalClient = (function () {
var user = _ref8; var user = _ref8;
var found = false; var found = false;
for (var _iterator9 = self.servers, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { for (var _iterator9 = this.servers, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {
var _ref9; var _ref9;
if (_isArray9) { if (_isArray9) {
@@ -2112,19 +2172,19 @@ var InternalClient = (function () {
} }
} }
if (!found) { if (!found) {
self.users.remove(user); this.users.remove(user);
} }
} }
} else { } else {
client.emit("debug", "server was unavailable, could not update"); client.emit("debug", "server was unavailable, could not update");
} }
self.buckets["bot:msg:guild:" + packet.d.id] = self.buckets["dmsg:" + packet.d.id] = self.buckets["bdmsg:" + packet.d.id] = self.buckets["guild_member:" + packet.d.id] = self.buckets["guild_member_nick:" + packet.d.id] = undefined; this.buckets["bot:msg:guild:" + packet.d.id] = this.buckets["dmsg:" + packet.d.id] = this.buckets["bdmsg:" + packet.d.id] = this.buckets["guild_member:" + packet.d.id] = this.buckets["guild_member_nick:" + packet.d.id] = undefined;
} else { } else {
client.emit("warn", "server was deleted but it was not in the cache"); client.emit("warn", "server was deleted but it was not in the cache");
} }
break; break;
case _Constants.PacketType.SERVER_UPDATE: case _Constants.PacketType.SERVER_UPDATE:
var server = self.servers.get("id", data.id); var server = this.servers.get("id", data.id);
if (server) { if (server) {
// server exists // server exists
data.members = data.members || []; data.members = data.members || [];
@@ -2138,31 +2198,31 @@ var InternalClient = (function () {
client.emit("debug", "received server update but server already updated"); client.emit("debug", "received server update but server already updated");
} else { } else {
client.emit("serverUpdated", new _StructuresServer2["default"](server, client), newserver); client.emit("serverUpdated", new _StructuresServer2["default"](server, client), newserver);
self.servers.update(server, newserver); this.servers.update(server, newserver);
} }
} else if (!server) { } else if (!server) {
client.emit("warn", "server was updated but it was not in the cache"); client.emit("warn", "server was updated but it was not in the cache");
self.servers.add(new _StructuresServer2["default"](data, client)); this.servers.add(new _StructuresServer2["default"](data, client));
client.emit("serverCreated", server); client.emit("serverCreated", server);
} }
break; break;
case _Constants.PacketType.CHANNEL_CREATE: case _Constants.PacketType.CHANNEL_CREATE:
var channel = self.channels.get("id", data.id); var channel = this.channels.get("id", data.id);
if (!channel) { if (!channel) {
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var chan = null; var chan = null;
if (data.type === "text") { if (data.type === "text") {
chan = self.channels.add(new _StructuresTextChannel2["default"](data, client, server)); chan = this.channels.add(new _StructuresTextChannel2["default"](data, client, server));
} else { } else {
chan = self.channels.add(new _StructuresVoiceChannel2["default"](data, client, server)); chan = this.channels.add(new _StructuresVoiceChannel2["default"](data, client, server));
} }
client.emit("channelCreated", server.channels.add(chan)); client.emit("channelCreated", server.channels.add(chan));
} else if (data.is_private) { } else if (data.is_private) {
client.emit("channelCreated", self.private_channels.add(new _StructuresPMChannel2["default"](data, client))); client.emit("channelCreated", this.private_channels.add(new _StructuresPMChannel2["default"](data, client)));
} else { } else {
client.emit("warn", "channel created but server does not exist"); client.emit("warn", "channel created but server does not exist");
} }
@@ -2172,15 +2232,15 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.CHANNEL_DELETE: case _Constants.PacketType.CHANNEL_DELETE:
var channel = self.channels.get("id", data.id) || self.private_channels.get("id", data.id); var channel = this.channels.get("id", data.id) || this.private_channels.get("id", data.id);
if (channel) { if (channel) {
if (channel.server) { if (channel.server) {
// accounts for PMs // accounts for PMs
channel.server.channels.remove(channel); channel.server.channels.remove(channel);
self.channels.remove(channel); this.channels.remove(channel);
} else { } else {
self.private_channels.remove(channel); this.private_channels.remove(channel);
} }
client.emit("channelDeleted", channel); client.emit("channelDeleted", channel);
@@ -2189,12 +2249,12 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.CHANNEL_UPDATE: case _Constants.PacketType.CHANNEL_UPDATE:
var channel = self.channels.get("id", data.id) || self.private_channels.get("id", data.id); var channel = this.channels.get("id", data.id) || this.private_channels.get("id", data.id);
if (channel) { if (channel) {
if (channel instanceof _StructuresPMChannel2["default"]) { if (channel instanceof _StructuresPMChannel2["default"]) {
//PM CHANNEL //PM CHANNEL
client.emit("channelUpdated", new _StructuresPMChannel2["default"](channel, client), self.private_channels.update(channel, new _StructuresPMChannel2["default"](data, client))); client.emit("channelUpdated", new _StructuresPMChannel2["default"](channel, client), this.private_channels.update(channel, new _StructuresPMChannel2["default"](data, client)));
} else { } else {
if (channel.server) { if (channel.server) {
if (channel.type === "text") { if (channel.type === "text") {
@@ -2203,14 +2263,14 @@ var InternalClient = (function () {
chan.messages = channel.messages; chan.messages = channel.messages;
client.emit("channelUpdated", channel, chan); client.emit("channelUpdated", channel, chan);
channel.server.channels.update(channel, chan); channel.server.channels.update(channel, chan);
self.channels.update(channel, chan); this.channels.update(channel, chan);
} else { } else {
//VOICE CHANNEL //VOICE CHANNEL
data.members = channel.members; data.members = channel.members;
var chan = new _StructuresVoiceChannel2["default"](data, client, channel.server); var chan = new _StructuresVoiceChannel2["default"](data, client, channel.server);
client.emit("channelUpdated", channel, chan); client.emit("channelUpdated", channel, chan);
channel.server.channels.update(channel, chan); channel.server.channels.update(channel, chan);
self.channels.update(channel, chan); this.channels.update(channel, chan);
} }
} else { } else {
client.emit("warn", "channel updated but server non-existant"); client.emit("warn", "channel updated but server non-existant");
@@ -2221,7 +2281,7 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_ROLE_CREATE: case _Constants.PacketType.SERVER_ROLE_CREATE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
client.emit("serverRoleCreated", server.roles.add(new _StructuresRole2["default"](data.role, server, client)), server); client.emit("serverRoleCreated", server.roles.add(new _StructuresRole2["default"](data.role, server, client)), server);
} else { } else {
@@ -2229,7 +2289,7 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_ROLE_DELETE: case _Constants.PacketType.SERVER_ROLE_DELETE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var role = server.roles.get("id", data.role_id); var role = server.roles.get("id", data.role_id);
if (role) { if (role) {
@@ -2243,7 +2303,7 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_ROLE_UPDATE: case _Constants.PacketType.SERVER_ROLE_UPDATE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var role = server.roles.get("id", data.role.id); var role = server.roles.get("id", data.role.id);
if (role) { if (role) {
@@ -2258,7 +2318,7 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_MEMBER_ADD: case _Constants.PacketType.SERVER_MEMBER_ADD:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
server.memberMap[data.user.id] = { server.memberMap[data.user.id] = {
@@ -2273,15 +2333,15 @@ var InternalClient = (function () {
server.memberCount++; server.memberCount++;
client.emit("serverNewMember", server, server.members.add(self.users.add(new _StructuresUser2["default"](data.user, client)))); client.emit("serverNewMember", server, server.members.add(this.users.add(new _StructuresUser2["default"](data.user, client))));
} else { } else {
client.emit("warn", "server member added but server doesn't exist in cache"); client.emit("warn", "server member added but server doesn't exist in cache");
} }
break; break;
case _Constants.PacketType.SERVER_MEMBER_REMOVE: case _Constants.PacketType.SERVER_MEMBER_REMOVE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var user = self.users.get("id", data.user.id); var user = this.users.get("id", data.user.id);
if (user) { if (user) {
client.emit("serverMemberRemoved", server, user); client.emit("serverMemberRemoved", server, user);
server.memberMap[data.user.id] = null; server.memberMap[data.user.id] = null;
@@ -2295,9 +2355,9 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_MEMBER_UPDATE: case _Constants.PacketType.SERVER_MEMBER_UPDATE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var user = self.users.add(new _StructuresUser2["default"](data.user, client)); var user = this.users.add(new _StructuresUser2["default"](data.user, client));
if (user) { if (user) {
var oldMember = null; var oldMember = null;
if (server.memberMap[data.user.id]) { if (server.memberMap[data.user.id]) {
@@ -2328,8 +2388,8 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.PRESENCE_UPDATE: case _Constants.PacketType.PRESENCE_UPDATE:
var user = self.users.add(new _StructuresUser2["default"](data.user, client)); var user = this.users.add(new _StructuresUser2["default"](data.user, client));
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (user && server) { if (user && server) {
@@ -2347,7 +2407,7 @@ var InternalClient = (function () {
if (!presenceUser.equalsStrict(user)) { if (!presenceUser.equalsStrict(user)) {
client.emit("presence", user, presenceUser); client.emit("presence", user, presenceUser);
self.users.update(user, presenceUser); this.users.update(user, presenceUser);
} }
} else { } else {
client.emit("warn", "presence update but user/server not in cache"); client.emit("warn", "presence update but user/server not in cache");
@@ -2356,7 +2416,7 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.USER_UPDATE: case _Constants.PacketType.USER_UPDATE:
var user = self.users.get("id", data.id); var user = this.users.get("id", data.id);
if (user) { if (user) {
@@ -2364,12 +2424,12 @@ var InternalClient = (function () {
data.id = data.id || user.id; data.id = data.id || user.id;
data.avatar = data.avatar || user.avatar; data.avatar = data.avatar || user.avatar;
data.discriminator = data.discriminator || user.discriminator; data.discriminator = data.discriminator || user.discriminator;
_this36.email = data.email || _this36.email; this.email = data.email || this.email;
var presenceUser = new _StructuresUser2["default"](data, client); var presenceUser = new _StructuresUser2["default"](data, client);
client.emit("presence", user, presenceUser); client.emit("presence", user, presenceUser);
self.users.update(user, presenceUser); this.users.update(user, presenceUser);
} else { } else {
client.emit("warn", "user update but user not in cache (this should never happen)"); client.emit("warn", "user update but user not in cache (this should never happen)");
} }
@@ -2377,8 +2437,8 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.TYPING: case _Constants.PacketType.TYPING:
var user = self.users.get("id", data.user_id); var user = this.users.get("id", data.user_id);
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (user && channel) { if (user && channel) {
if (user.typing.since) { if (user.typing.since) {
@@ -2402,8 +2462,8 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_BAN_ADD: case _Constants.PacketType.SERVER_BAN_ADD:
var user = self.users.get("id", data.user.id); var user = this.users.get("id", data.user.id);
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (user && server) { if (user && server) {
client.emit("userBanned", user, server); client.emit("userBanned", user, server);
@@ -2412,8 +2472,8 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.SERVER_BAN_REMOVE: case _Constants.PacketType.SERVER_BAN_REMOVE:
var user = self.users.get("id", data.user.id); var user = this.users.get("id", data.user.id);
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (user && server) { if (user && server) {
client.emit("userUnbanned", user, server); client.emit("userUnbanned", user, server);
@@ -2422,10 +2482,10 @@ var InternalClient = (function () {
} }
break; break;
case _Constants.PacketType.USER_NOTE_UPDATE: case _Constants.PacketType.USER_NOTE_UPDATE:
if (_this36.user.bot) { if (this.user.bot) {
return; return;
} }
var user = self.users.get("id", data.id); var user = this.users.get("id", data.id);
var oldNote = user.note; var oldNote = user.note;
var note = data.note || null; var note = data.note || null;
@@ -2436,21 +2496,21 @@ var InternalClient = (function () {
client.emit("noteUpdated", user, oldNote); client.emit("noteUpdated", user, oldNote);
self.users.update(user, updatedUser); this.users.update(user, updatedUser);
} else { } else {
client.emit("warn", "note updated but user not in cache"); client.emit("warn", "note updated but user not in cache");
} }
break; break;
case _Constants.PacketType.VOICE_STATE_UPDATE: case _Constants.PacketType.VOICE_STATE_UPDATE:
var user = self.users.get("id", data.user_id); var user = this.users.get("id", data.user_id);
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
var connection = self.voiceConnections.get("server", server); var connection = this.voiceConnections.get("server", server);
if (user && server) { if (user && server) {
if (data.channel_id) { if (data.channel_id) {
// in voice channel // in voice channel
var channel = self.channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id);
if (channel && channel.type === "voice") { if (channel && channel.type === "voice") {
server.eventVoiceStateUpdate(channel, user, data); server.eventVoiceStateUpdate(channel, user, data);
} else { } else {
@@ -2464,13 +2524,13 @@ var InternalClient = (function () {
client.emit("warn", "voice state update but user or server not in cache"); client.emit("warn", "voice state update but user or server not in cache");
} }
if (user && user.id === self.user.id) { if (user && user.id === this.user.id) {
// only for detecting self user movements for connections. // only for detecting self user movements for connections.
var connection = self.voiceConnections.get("server", server); var connection = this.voiceConnections.get("server", server);
// existing connection, perhaps channel moved // existing connection, perhaps channel moved
if (connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id) { if (connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id) {
// moved, update info // moved, update info
connection.voiceChannel = self.channels.get("id", data.channel_id); connection.voiceChannel = this.channels.get("id", data.channel_id);
client.emit("voiceMoved", connection.voiceChannel); // Moved to a new channel client.emit("voiceMoved", connection.voiceChannel); // Moved to a new channel
} }
} }
@@ -2478,7 +2538,7 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.SERVER_MEMBERS_CHUNK: case _Constants.PacketType.SERVER_MEMBERS_CHUNK:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
@@ -2507,15 +2567,15 @@ var InternalClient = (function () {
joinedAt: Date.parse(user.joined_at), joinedAt: Date.parse(user.joined_at),
nick: user.nick || null nick: user.nick || null
}; };
server.members.add(self.users.add(new _StructuresUser2["default"](user.user, client))); server.members.add(this.users.add(new _StructuresUser2["default"](user.user, client)));
} }
if (self.forceFetchCount.hasOwnProperty(server.id)) { if (this.forceFetchCount.hasOwnProperty(server.id)) {
if (self.forceFetchCount[server.id] <= 1) { if (this.forceFetchCount[server.id] <= 1) {
delete self.forceFetchCount[server.id]; delete this.forceFetchCount[server.id];
self.checkReady(); this.checkReady();
} else { } else {
self.forceFetchCount[server.id]--; this.forceFetchCount[server.id]--;
} }
} }
@@ -2526,81 +2586,81 @@ var InternalClient = (function () {
break; break;
case _Constants.PacketType.FRIEND_ADD: case _Constants.PacketType.FRIEND_ADD:
if (_this36.user.bot) { if (this.user.bot) {
return; return;
} }
if (data.type === 1) { if (data.type === 1) {
// accepted/got accepted a friend request // accepted/got accepted a friend request
var inUser = self.incoming_friend_requests.get("id", data.id); var inUser = this.incoming_friend_requests.get("id", data.id);
if (inUser) { if (inUser) {
// client accepted another user // client accepted another user
self.incoming_friend_requests.remove(self.friends.add(new _StructuresUser2["default"](data.user, client))); this.incoming_friend_requests.remove(this.friends.add(new _StructuresUser2["default"](data.user, client)));
return; return;
} }
var outUser = self.outgoing_friend_requests.get("id", data.id); var outUser = this.outgoing_friend_requests.get("id", data.id);
if (outUser) { if (outUser) {
// another user accepted the client // another user accepted the client
self.outgoing_friend_requests.remove(self.friends.add(new _StructuresUser2["default"](data.user, client))); this.outgoing_friend_requests.remove(this.friends.add(new _StructuresUser2["default"](data.user, client)));
client.emit("friendRequestAccepted", outUser); client.emit("friendRequestAccepted", outUser);
return; return;
} }
} else if (data.type === 2) { } else if (data.type === 2) {
// client received block // client received block
self.blocked_users.add(new _StructuresUser2["default"](data.user, client)); this.blocked_users.add(new _StructuresUser2["default"](data.user, client));
} else if (data.type === 3) { } else if (data.type === 3) {
// client received friend request // client received friend request
client.emit("friendRequestReceived", self.incoming_friend_requests.add(new _StructuresUser2["default"](data.user, client))); client.emit("friendRequestReceived", this.incoming_friend_requests.add(new _StructuresUser2["default"](data.user, client)));
} else if (data.type === 4) { } else if (data.type === 4) {
// client sent friend request // client sent friend request
self.outgoing_friend_requests.add(new _StructuresUser2["default"](data.user, client)); this.outgoing_friend_requests.add(new _StructuresUser2["default"](data.user, client));
} }
break; break;
case _Constants.PacketType.FRIEND_REMOVE: case _Constants.PacketType.FRIEND_REMOVE:
if (_this36.user.bot) { if (this.user.bot) {
return; return;
} }
var user = self.friends.get("id", data.id); var user = this.friends.get("id", data.id);
if (user) { if (user) {
self.friends.remove(user); this.friends.remove(user);
client.emit("friendRemoved", user); client.emit("friendRemoved", user);
return; return;
} }
user = self.blocked_users.get("id", data.id); user = this.blocked_users.get("id", data.id);
if (user) { if (user) {
// they rejected friend request // they rejected friend request
self.blocked_users.remove(user); this.blocked_users.remove(user);
return; return;
} }
user = self.incoming_friend_requests.get("id", data.id); user = this.incoming_friend_requests.get("id", data.id);
if (user) { if (user) {
// they rejected outgoing friend request OR client user manually deleted incoming thru web client/other clients // they rejected outgoing friend request OR client user manually deleted incoming thru web client/other clients
var rejectedUser = self.outgoing_friend_requests.get("id", user.id); var rejectedUser = this.outgoing_friend_requests.get("id", user.id);
if (rejectedUser) { if (rejectedUser) {
// other person rejected outgoing // other person rejected outgoing
client.emit("friendRequestRejected", self.outgoing_friend_requests.remove(rejectedUser)); client.emit("friendRequestRejected", this.outgoing_friend_requests.remove(rejectedUser));
return; return;
} }
// incoming deleted manually // incoming deleted manually
self.incoming_friend_requests.remove(user); this.incoming_friend_requests.remove(user);
return; return;
} }
user = self.outgoing_friend_requests.get("id", data.id); user = this.outgoing_friend_requests.get("id", data.id);
if (user) { if (user) {
// client cancelled incoming friend request OR client user manually deleted outgoing thru web client/other clients // client cancelled incoming friend request OR client user manually deleted outgoing thru web client/other clients
var incomingCancel = self.incoming_friend_requests.get("id", user.id); var incomingCancel = this.incoming_friend_requests.get("id", user.id);
if (incomingCancel) { if (incomingCancel) {
// client cancelled incoming // client cancelled incoming
self.incoming_friend_requests.remove(user); this.incoming_friend_requests.remove(user);
return; return;
} }
// outgoing deleted manually // outgoing deleted manually
self.outgoing_friend_requests.remove(user); this.outgoing_friend_requests.remove(user);
return; return;
} }
break; break;
@@ -2609,7 +2669,6 @@ var InternalClient = (function () {
break; break;
} }
}; };
};
_createClass(InternalClient, [{ _createClass(InternalClient, [{
key: "uptime", key: "uptime",

View File

@@ -137,6 +137,7 @@ Constants.PacketType = {
MESSAGE_UPDATE: "MESSAGE_UPDATE", MESSAGE_UPDATE: "MESSAGE_UPDATE",
PRESENCE_UPDATE: "PRESENCE_UPDATE", PRESENCE_UPDATE: "PRESENCE_UPDATE",
READY: "READY", READY: "READY",
RESUME: "RESUME",
SERVER_BAN_ADD: "GUILD_BAN_ADD", SERVER_BAN_ADD: "GUILD_BAN_ADD",
SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE", SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE",
SERVER_CREATE: "GUILD_CREATE", SERVER_CREATE: "GUILD_CREATE",

View File

@@ -24,6 +24,7 @@ import Invite from "../Structures/Invite";
import VoiceConnection from "../Voice/VoiceConnection"; import VoiceConnection from "../Voice/VoiceConnection";
import TokenCacher from "../Util/TokenCacher"; import TokenCacher from "../Util/TokenCacher";
var GATEWAY_VERSION = 4;
var zlib; var zlib;
var libVersion = require('../../package.json').version; var libVersion = require('../../package.json').version;
@@ -1566,45 +1567,29 @@ export default class InternalClient {
} }
createWS(url) { createWS(url) {
var self = this;
var client = self.client;
if (this.websocket) { if (this.websocket) {
return false; return false;
} }
if(!url.endsWith("/")) {
url += "/";
}
url += "?encoding=json&v=" + GATEWAY_VERSION;
this.websocket = new WebSocket(url); this.websocket = new WebSocket(url);
this.websocket.onopen = () => { this.websocket.onopen = () => {
var data = { if(this.sessionID) {
op: 2, this.resume();
d: { } else {
token: self.token, this.identify();
v: 3,
compress: self.client.options.compress,
large_threshold : self.client.options.largeThreshold,
properties: {
"$os": process.platform,
"$browser": "discord.js",
"$device": "discord.js",
"$referrer": "",
"$referring_domain": ""
} }
}
};
if (self.client.options.shard) {
data.d.shard = self.client.options.shard;
}
self.sendWS(data);
}; };
this.websocket.onclose = (event) => { this.websocket.onclose = (event) => {
self.websocket = null; this.websocket = null;
self.state = ConnectionState.DISCONNECTED; this.state = ConnectionState.DISCONNECTED;
if(event && event.code) { if(event && event.code) {
client.emit("warn", "WS close: " + event.code); this.client.emit("warn", "WS close: " + event.code);
var err; var err;
if(event.code === 4001) { if(event.code === 4001) {
err = new Error("Gateway received invalid OP code"); err = new Error("Gateway received invalid OP code");
@@ -1619,7 +1604,7 @@ export default class InternalClient {
} if(event.code === 4006 || event.code === 4009) { } if(event.code === 4006 || event.code === 4009) {
err = new Error("Invalid session"); err = new Error("Invalid session");
} else if(event.code === 4007) { } else if(event.code === 4007) {
this.seq = 0; this.sequence = 0;
err = new Error("Invalid sequence number"); err = new Error("Invalid sequence number");
} else if(event.code === 4008) { } else if(event.code === 4008) {
err = new Error("Gateway connection was ratelimited"); err = new Error("Gateway connection was ratelimited");
@@ -1627,17 +1612,17 @@ export default class InternalClient {
err = new Error("Invalid shard key"); err = new Error("Invalid shard key");
} }
if(err) { if(err) {
client.emit("error", err); this.client.emit("error", err);
} }
} }
self.disconnected(this.client.options.autoReconnect); this.disconnected(this.client.options.autoReconnect);
}; };
this.websocket.onerror = e => { this.websocket.onerror = e => {
client.emit("error", e); this.client.emit("error", e);
self.websocket = null; this.websocket = null;
self.state = ConnectionState.DISCONNECTED; this.state = ConnectionState.DISCONNECTED;
self.disconnected(this.client.options.autoReconnect); this.disconnected(this.client.options.autoReconnect);
}; };
this.websocket.onmessage = e => { this.websocket.onmessage = e => {
@@ -1646,74 +1631,147 @@ export default class InternalClient {
e.data = zlib.inflateSync(e.data).toString(); e.data = zlib.inflateSync(e.data).toString();
} }
var packet, data; var packet;
try { try {
packet = JSON.parse(e.data); packet = JSON.parse(e.data);
data = packet.d;
} catch (e) { } catch (e) {
client.emit("error", e); this.client.emit("error", e);
return; return;
} }
client.emit("raw", packet); this.client.emit("raw", packet);
if(packet.s) {
this.sequence = packet.s;
}
switch(packet.op) {
case 0:
this.processPacket(packet);
break;
case 1:
this.heartbeat();
break;
case 7:
this.disconnected(true);
break;
case 9:
this.sessionID = null;
this.sequence = 0;
this.identify();
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) { switch (packet.t) {
case PacketType.RESUME:
case PacketType.READY: case PacketType.READY:
var startTime = Date.now(); this.intervals.kai = setInterval(() => this.heartbeat(), data.heartbeat_interval);
self.intervals.kai = setInterval(() => self.sendWS({ op: 1, d: Date.now() }), data.heartbeat_interval);
self.user = self.users.add(new User(data.user, client)); if(packet.t === PacketType.RESUME) {
break;
}
this.sessionID = data.session_id;
var startTime = Date.now();
this.user = this.users.add(new User(data.user, client));
this.forceFetchCount = {}; this.forceFetchCount = {};
this.forceFetchQueue = []; this.forceFetchQueue = [];
this.forceFetchLength = 1; this.forceFetchLength = 1;
this.autoReconnectInterval = 1000; this.autoReconnectInterval = 1000;
this.sessionID = data.session_id;
data.guilds.forEach(server => { data.guilds.forEach(server => {
if (!server.unavailable) { if (!server.unavailable) {
server = self.servers.add(new Server(server, client)); server = this.servers.add(new Server(server, client));
if (self.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) { if (this.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); this.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
} }
} else { } else {
client.emit("debug", "server " + server.id + " was unavailable, could not create (ready)"); client.emit("debug", "server " + server.id + " was unavailable, could not create (ready)");
self.unavailableServers.add(server); this.unavailableServers.add(server);
} }
}); });
data.private_channels.forEach(pm => { data.private_channels.forEach(pm => {
self.private_channels.add(new PMChannel(pm, client)); this.private_channels.add(new PMChannel(pm, client));
}); });
if (!data.user.bot) { // bots dont have friends if (!data.user.bot) { // bots dont have friends
data.relationships.forEach(friend => { data.relationships.forEach(friend => {
if (friend.type === 1) { // is a friend if (friend.type === 1) { // is a friend
self.friends.add(new User(friend.user, client)); this.friends.add(new User(friend.user, client));
} else if (friend.type === 2) { // incoming friend requests } else if (friend.type === 2) { // incoming friend requests
self.blocked_users.add(new User(friend.user, client)); this.blocked_users.add(new User(friend.user, client));
} else if (friend.type === 3) { // incoming friend requests } else if (friend.type === 3) { // incoming friend requests
self.incoming_friend_requests.add(new User(friend.user, client)); this.incoming_friend_requests.add(new User(friend.user, client));
} else if (friend.type === 4) { // outgoing friend requests } else if (friend.type === 4) { // outgoing friend requests
self.outgoing_friend_requests.add(new User(friend.user, client)); this.outgoing_friend_requests.add(new User(friend.user, client));
} else { } else {
client.emit("warn", "unknown friend type " + friend.type); client.emit("warn", "unknown friend type " + friend.type);
} }
}); });
} else { } else {
self.friends = null; this.friends = null;
self.blocked_users = null; this.blocked_users = null;
self.incoming_friend_requests = null; this.incoming_friend_requests = null;
self.outgoing_friend_requests = null; this.outgoing_friend_requests = null;
} }
// add notes to users // add notes to users
if(data.notes) { if(data.notes) {
for(note in data.notes) { for(note in data.notes) {
var user = self.users.get("id", note); var user = this.users.get("id", note);
if(user) { if(user) {
var newUser = user; var newUser = user;
newUser.note = data.notes[note]; newUser.note = data.notes[note];
self.users.update(user, newUser); this.users.update(user, newUser);
} else { } else {
client.emit("warn", "note in ready packet but user not cached"); client.emit("warn", "note in ready packet but user not cached");
} }
@@ -1721,25 +1779,25 @@ export default class InternalClient {
} }
self.state = ConnectionState.READY; this.state = ConnectionState.READY;
client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`);
client.emit("debug", `ready with ${self.servers.length} servers, ${self.unavailableServers.length} unavailable servers, ${self.channels.length} channels and ${self.users.length} users cached.`); client.emit("debug", `ready with ${this.servers.length} servers, ${this.unavailableServers.length} unavailable servers, ${this.channels.length} channels and ${this.users.length} users cached.`);
self.restartServerCreateTimeout(); this.restartServerCreateTimeout();
break; break;
case PacketType.MESSAGE_CREATE: case PacketType.MESSAGE_CREATE:
// format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format // format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (channel) { if (channel) {
var msg = channel.messages.add(new Message(data, channel, client)); var msg = channel.messages.add(new Message(data, channel, client));
channel.lastMessageID = msg.id; channel.lastMessageID = msg.id;
if (self.messageAwaits[channel.id + msg.author.id]) { if (this.messageAwaits[channel.id + msg.author.id]) {
self.messageAwaits[channel.id + msg.author.id].map( fn => fn(msg) ); this.messageAwaits[channel.id + msg.author.id].map( fn => fn(msg) );
self.messageAwaits[channel.id + msg.author.id] = null; this.messageAwaits[channel.id + msg.author.id] = null;
client.emit("message", msg, true); //2nd param is isAwaitedMessage client.emit("message", msg, true); //2nd param is isAwaitedMessage
} else { } else {
client.emit("message", msg); client.emit("message", msg);
@@ -1749,7 +1807,7 @@ export default class InternalClient {
} }
break; break;
case PacketType.MESSAGE_DELETE: case PacketType.MESSAGE_DELETE:
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (channel) { if (channel) {
// potentially blank // potentially blank
var msg = channel.messages.get("id", data.id); var msg = channel.messages.get("id", data.id);
@@ -1765,7 +1823,7 @@ export default class InternalClient {
break; break;
case PacketType.MESSAGE_UPDATE: case PacketType.MESSAGE_UPDATE:
// format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format // format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (channel) { if (channel) {
// potentially blank // potentially blank
var msg = channel.messages.get("id", data.id); var msg = channel.messages.get("id", data.id);
@@ -1795,64 +1853,64 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_CREATE: case PacketType.SERVER_CREATE:
var server = self.servers.get("id", data.id); var server = this.servers.get("id", data.id);
if (!server) { if (!server) {
if (!data.unavailable) { if (!data.unavailable) {
server = self.servers.add(new Server(data, client)); server = this.servers.add(new Server(data, client));
if (client.readyTime) { if (client.readyTime) {
client.emit("serverCreated", server); client.emit("serverCreated", server);
} }
if (self.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) { if (this.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); this.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
} }
var unavailable = self.unavailableServers.get("id", server.id); var unavailable = this.unavailableServers.get("id", server.id);
if (unavailable) { if (unavailable) {
self.unavailableServers.remove(unavailable); this.unavailableServers.remove(unavailable);
} }
self.restartServerCreateTimeout(); this.restartServerCreateTimeout();
} else { } else {
client.emit("debug", "server was unavailable, could not create"); client.emit("debug", "server was unavailable, could not create");
} }
} }
break; break;
case PacketType.SERVER_DELETE: case PacketType.SERVER_DELETE:
var server = self.servers.get("id", data.id); var server = this.servers.get("id", data.id);
if (server) { if (server) {
if (!data.unavailable) { if (!data.unavailable) {
client.emit("serverDeleted", server); client.emit("serverDeleted", server);
for (var channel of server.channels) { for (var channel of server.channels) {
self.channels.remove(channel); this.channels.remove(channel);
} }
self.servers.remove(server); this.servers.remove(server);
for (var user of server.members) { for (var user of server.members) {
var found = false; var found = false;
for (var s of self.servers) { for (var s of this.servers) {
if (s.members.get("id", user.id)) { if (s.members.get("id", user.id)) {
found = true; found = true;
break; break;
} }
} }
if (!found) { if (!found) {
self.users.remove(user); this.users.remove(user);
} }
} }
} else { } else {
client.emit("debug", "server was unavailable, could not update"); client.emit("debug", "server was unavailable, could not update");
} }
self.buckets["bot:msg:guild:" + packet.d.id] = this.buckets["bot:msg:guild:" + packet.d.id] =
self.buckets["dmsg:" + packet.d.id] = this.buckets["dmsg:" + packet.d.id] =
self.buckets["bdmsg:" + packet.d.id] = this.buckets["bdmsg:" + packet.d.id] =
self.buckets["guild_member:" + packet.d.id] = this.buckets["guild_member:" + packet.d.id] =
self.buckets["guild_member_nick:" + packet.d.id] = undefined; this.buckets["guild_member_nick:" + packet.d.id] = undefined;
} else { } else {
client.emit("warn", "server was deleted but it was not in the cache"); client.emit("warn", "server was deleted but it was not in the cache");
} }
break; break;
case PacketType.SERVER_UPDATE: case PacketType.SERVER_UPDATE:
var server = self.servers.get("id", data.id); var server = this.servers.get("id", data.id);
if (server) { if (server) {
// server exists // server exists
data.members = data.members || []; data.members = data.members || [];
@@ -1866,31 +1924,31 @@ export default class InternalClient {
client.emit("debug", "received server update but server already updated"); client.emit("debug", "received server update but server already updated");
} else { } else {
client.emit("serverUpdated", new Server(server, client), newserver); client.emit("serverUpdated", new Server(server, client), newserver);
self.servers.update(server, newserver); this.servers.update(server, newserver);
} }
} else if (!server) { } else if (!server) {
client.emit("warn", "server was updated but it was not in the cache"); client.emit("warn", "server was updated but it was not in the cache");
self.servers.add(new Server(data, client)); this.servers.add(new Server(data, client));
client.emit("serverCreated", server); client.emit("serverCreated", server);
} }
break; break;
case PacketType.CHANNEL_CREATE: case PacketType.CHANNEL_CREATE:
var channel = self.channels.get("id", data.id); var channel = this.channels.get("id", data.id);
if (!channel) { if (!channel) {
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var chan = null; var chan = null;
if (data.type === "text") { if (data.type === "text") {
chan = self.channels.add(new TextChannel(data, client, server)); chan = this.channels.add(new TextChannel(data, client, server));
} else { } else {
chan = self.channels.add(new VoiceChannel(data, client, server)); chan = this.channels.add(new VoiceChannel(data, client, server));
} }
client.emit("channelCreated", server.channels.add(chan)); client.emit("channelCreated", server.channels.add(chan));
} else if (data.is_private) { } else if (data.is_private) {
client.emit("channelCreated", self.private_channels.add(new PMChannel(data, client))); client.emit("channelCreated", this.private_channels.add(new PMChannel(data, client)));
} else { } else {
client.emit("warn", "channel created but server does not exist"); client.emit("warn", "channel created but server does not exist");
} }
@@ -1901,14 +1959,14 @@ export default class InternalClient {
break; break;
case PacketType.CHANNEL_DELETE: case PacketType.CHANNEL_DELETE:
var channel = self.channels.get("id", data.id) || self.private_channels.get("id", data.id); var channel = this.channels.get("id", data.id) || this.private_channels.get("id", data.id);
if (channel) { if (channel) {
if (channel.server) { // accounts for PMs if (channel.server) { // accounts for PMs
channel.server.channels.remove(channel); channel.server.channels.remove(channel);
self.channels.remove(channel); this.channels.remove(channel);
} else { } else {
self.private_channels.remove(channel); this.private_channels.remove(channel);
} }
client.emit("channelDeleted", channel); client.emit("channelDeleted", channel);
@@ -1918,13 +1976,13 @@ export default class InternalClient {
} }
break; break;
case PacketType.CHANNEL_UPDATE: case PacketType.CHANNEL_UPDATE:
var channel = self.channels.get("id", data.id) || self.private_channels.get("id", data.id); var channel = this.channels.get("id", data.id) || this.private_channels.get("id", data.id);
if (channel) { if (channel) {
if (channel instanceof PMChannel) { if (channel instanceof PMChannel) {
//PM CHANNEL //PM CHANNEL
client.emit("channelUpdated", new PMChannel(channel, client), client.emit("channelUpdated", new PMChannel(channel, client),
self.private_channels.update(channel, new PMChannel(data, client))); this.private_channels.update(channel, new PMChannel(data, client)));
} else { } else {
if (channel.server) { if (channel.server) {
if (channel.type === "text") { if (channel.type === "text") {
@@ -1933,14 +1991,14 @@ export default class InternalClient {
chan.messages = channel.messages; chan.messages = channel.messages;
client.emit("channelUpdated", channel, chan); client.emit("channelUpdated", channel, chan);
channel.server.channels.update(channel, chan); channel.server.channels.update(channel, chan);
self.channels.update(channel, chan); this.channels.update(channel, chan);
} else { } else {
//VOICE CHANNEL //VOICE CHANNEL
data.members = channel.members; data.members = channel.members;
var chan = new VoiceChannel(data, client, channel.server); var chan = new VoiceChannel(data, client, channel.server);
client.emit("channelUpdated", channel, chan); client.emit("channelUpdated", channel, chan);
channel.server.channels.update(channel, chan); channel.server.channels.update(channel, chan);
self.channels.update(channel, chan); this.channels.update(channel, chan);
} }
} else { } else {
client.emit("warn", "channel updated but server non-existant"); client.emit("warn", "channel updated but server non-existant");
@@ -1952,7 +2010,7 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_ROLE_CREATE: case PacketType.SERVER_ROLE_CREATE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
client.emit("serverRoleCreated", server.roles.add(new Role(data.role, server, client)), server); client.emit("serverRoleCreated", server.roles.add(new Role(data.role, server, client)), server);
} else { } else {
@@ -1960,7 +2018,7 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_ROLE_DELETE: case PacketType.SERVER_ROLE_DELETE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var role = server.roles.get("id", data.role_id); var role = server.roles.get("id", data.role_id);
if (role) { if (role) {
@@ -1974,7 +2032,7 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_ROLE_UPDATE: case PacketType.SERVER_ROLE_UPDATE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var role = server.roles.get("id", data.role.id); var role = server.roles.get("id", data.role.id);
if (role) { if (role) {
@@ -1989,7 +2047,7 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_MEMBER_ADD: case PacketType.SERVER_MEMBER_ADD:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
server.memberMap[data.user.id] = { server.memberMap[data.user.id] = {
@@ -2007,7 +2065,7 @@ export default class InternalClient {
client.emit( client.emit(
"serverNewMember", "serverNewMember",
server, server,
server.members.add(self.users.add(new User(data.user, client))) server.members.add(this.users.add(new User(data.user, client)))
); );
} else { } else {
@@ -2015,9 +2073,9 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_MEMBER_REMOVE: case PacketType.SERVER_MEMBER_REMOVE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var user = self.users.get("id", data.user.id); var user = this.users.get("id", data.user.id);
if (user) { if (user) {
client.emit("serverMemberRemoved", server, user); client.emit("serverMemberRemoved", server, user);
server.memberMap[data.user.id] = null; server.memberMap[data.user.id] = null;
@@ -2031,9 +2089,9 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_MEMBER_UPDATE: case PacketType.SERVER_MEMBER_UPDATE:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
var user = self.users.add(new User(data.user, client)); var user = this.users.add(new User(data.user, client));
if (user) { if (user) {
var oldMember = null; var oldMember = null;
if (server.memberMap[data.user.id]) { if (server.memberMap[data.user.id]) {
@@ -2064,8 +2122,8 @@ export default class InternalClient {
break; break;
case PacketType.PRESENCE_UPDATE: case PacketType.PRESENCE_UPDATE:
var user = self.users.add(new User(data.user, client)); var user = this.users.add(new User(data.user, client));
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (user && server) { if (user && server) {
@@ -2083,7 +2141,7 @@ export default class InternalClient {
if (!presenceUser.equalsStrict(user)) { if (!presenceUser.equalsStrict(user)) {
client.emit("presence", user, presenceUser); client.emit("presence", user, presenceUser);
self.users.update(user, presenceUser); this.users.update(user, presenceUser);
} }
} else { } else {
@@ -2093,7 +2151,7 @@ export default class InternalClient {
break; break;
case PacketType.USER_UPDATE: case PacketType.USER_UPDATE:
var user = self.users.get("id", data.id); var user = this.users.get("id", data.id);
if (user) { if (user) {
@@ -2106,7 +2164,7 @@ export default class InternalClient {
var presenceUser = new User(data, client); var presenceUser = new User(data, client);
client.emit("presence", user, presenceUser); client.emit("presence", user, presenceUser);
self.users.update(user, presenceUser); this.users.update(user, presenceUser);
} else { } else {
client.emit("warn", "user update but user not in cache (this should never happen)"); client.emit("warn", "user update but user not in cache (this should never happen)");
@@ -2115,8 +2173,8 @@ export default class InternalClient {
break; break;
case PacketType.TYPING: case PacketType.TYPING:
var user = self.users.get("id", data.user_id); var user = this.users.get("id", data.user_id);
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (user && channel) { if (user && channel) {
if (user.typing.since) { if (user.typing.since) {
@@ -2141,8 +2199,8 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_BAN_ADD: case PacketType.SERVER_BAN_ADD:
var user = self.users.get("id", data.user.id); var user = this.users.get("id", data.user.id);
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (user && server) { if (user && server) {
client.emit("userBanned", user, server); client.emit("userBanned", user, server);
@@ -2151,8 +2209,8 @@ export default class InternalClient {
} }
break; break;
case PacketType.SERVER_BAN_REMOVE: case PacketType.SERVER_BAN_REMOVE:
var user = self.users.get("id", data.user.id); var user = this.users.get("id", data.user.id);
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (user && server) { if (user && server) {
client.emit("userUnbanned", user, server); client.emit("userUnbanned", user, server);
@@ -2164,7 +2222,7 @@ export default class InternalClient {
if(this.user.bot) { if(this.user.bot) {
return; return;
} }
var user = self.users.get("id", data.id); var user = this.users.get("id", data.id);
var oldNote = user.note; var oldNote = user.note;
var note = data.note || null; var note = data.note || null;
@@ -2175,22 +2233,22 @@ export default class InternalClient {
client.emit("noteUpdated", user, oldNote); client.emit("noteUpdated", user, oldNote);
self.users.update(user, updatedUser); this.users.update(user, updatedUser);
} else { } else {
client.emit("warn", "note updated but user not in cache"); client.emit("warn", "note updated but user not in cache");
} }
break; break;
case PacketType.VOICE_STATE_UPDATE: case PacketType.VOICE_STATE_UPDATE:
var user = self.users.get("id", data.user_id); var user = this.users.get("id", data.user_id);
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
var connection = self.voiceConnections.get("server", server); var connection = this.voiceConnections.get("server", server);
if (user && server) { if (user && server) {
if (data.channel_id) { if (data.channel_id) {
// in voice channel // in voice channel
var channel = self.channels.get("id", data.channel_id); var channel = this.channels.get("id", data.channel_id);
if (channel && channel.type === "voice") { if (channel && channel.type === "voice") {
server.eventVoiceStateUpdate(channel, user, data); server.eventVoiceStateUpdate(channel, user, data);
} else { } else {
@@ -2205,12 +2263,12 @@ export default class InternalClient {
client.emit("warn", "voice state update but user or server not in cache"); client.emit("warn", "voice state update but user or server not in cache");
} }
if (user && user.id === self.user.id) { // only for detecting self user movements for connections. if (user && user.id === this.user.id) { // only for detecting self user movements for connections.
var connection = self.voiceConnections.get("server", server); var connection = this.voiceConnections.get("server", server);
// existing connection, perhaps channel moved // existing connection, perhaps channel moved
if (connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id) { if (connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id) {
// moved, update info // moved, update info
connection.voiceChannel = self.channels.get("id", data.channel_id); connection.voiceChannel = this.channels.get("id", data.channel_id);
client.emit("voiceMoved", connection.voiceChannel); // Moved to a new channel client.emit("voiceMoved", connection.voiceChannel); // Moved to a new channel
} }
} }
@@ -2218,7 +2276,7 @@ export default class InternalClient {
break; break;
case PacketType.SERVER_MEMBERS_CHUNK: case PacketType.SERVER_MEMBERS_CHUNK:
var server = self.servers.get("id", data.guild_id); var server = this.servers.get("id", data.guild_id);
if (server) { if (server) {
@@ -2234,15 +2292,15 @@ export default class InternalClient {
joinedAt: Date.parse(user.joined_at), joinedAt: Date.parse(user.joined_at),
nick: user.nick || null nick: user.nick || null
}; };
server.members.add(self.users.add(new User(user.user, client))); server.members.add(this.users.add(new User(user.user, client)));
} }
if (self.forceFetchCount.hasOwnProperty(server.id)) { if (this.forceFetchCount.hasOwnProperty(server.id)) {
if (self.forceFetchCount[server.id] <= 1) { if (this.forceFetchCount[server.id] <= 1) {
delete self.forceFetchCount[server.id]; delete this.forceFetchCount[server.id];
self.checkReady(); this.checkReady();
} else { } else {
self.forceFetchCount[server.id]--; this.forceFetchCount[server.id]--;
} }
} }
@@ -2258,73 +2316,73 @@ export default class InternalClient {
return; return;
} }
if (data.type === 1) { // accepted/got accepted a friend request if (data.type === 1) { // accepted/got accepted a friend request
var inUser = self.incoming_friend_requests.get("id", data.id); var inUser = this.incoming_friend_requests.get("id", data.id);
if (inUser) { if (inUser) {
// client accepted another user // client accepted another user
self.incoming_friend_requests.remove(self.friends.add(new User(data.user, client))); this.incoming_friend_requests.remove(this.friends.add(new User(data.user, client)));
return; return;
} }
var outUser = self.outgoing_friend_requests.get("id", data.id); var outUser = this.outgoing_friend_requests.get("id", data.id);
if (outUser) { if (outUser) {
// another user accepted the client // another user accepted the client
self.outgoing_friend_requests.remove(self.friends.add(new User(data.user, client))); this.outgoing_friend_requests.remove(this.friends.add(new User(data.user, client)));
client.emit("friendRequestAccepted", outUser); client.emit("friendRequestAccepted", outUser);
return; return;
} }
} else if (data.type === 2) { } else if (data.type === 2) {
// client received block // client received block
self.blocked_users.add(new User(data.user, client)); this.blocked_users.add(new User(data.user, client));
} else if (data.type === 3) { } else if (data.type === 3) {
// client received friend request // client received friend request
client.emit("friendRequestReceived", self.incoming_friend_requests.add(new User(data.user, client))); client.emit("friendRequestReceived", this.incoming_friend_requests.add(new User(data.user, client)));
} else if (data.type === 4) { } else if (data.type === 4) {
// client sent friend request // client sent friend request
self.outgoing_friend_requests.add(new User(data.user, client)); this.outgoing_friend_requests.add(new User(data.user, client));
} }
break; break;
case PacketType.FRIEND_REMOVE: case PacketType.FRIEND_REMOVE:
if (this.user.bot) { if (this.user.bot) {
return; return;
} }
var user = self.friends.get("id", data.id); var user = this.friends.get("id", data.id);
if (user) { if (user) {
self.friends.remove(user); this.friends.remove(user);
client.emit("friendRemoved", user); client.emit("friendRemoved", user);
return; return;
} }
user = self.blocked_users.get("id", data.id); user = this.blocked_users.get("id", data.id);
if (user) { // they rejected friend request if (user) { // they rejected friend request
self.blocked_users.remove(user); this.blocked_users.remove(user);
return; return;
} }
user = self.incoming_friend_requests.get("id", data.id); user = this.incoming_friend_requests.get("id", data.id);
if (user) { // they rejected outgoing friend request OR client user manually deleted incoming thru web client/other clients if (user) { // they rejected outgoing friend request OR client user manually deleted incoming thru web client/other clients
var rejectedUser = self.outgoing_friend_requests.get("id", user.id); var rejectedUser = this.outgoing_friend_requests.get("id", user.id);
if (rejectedUser) { if (rejectedUser) {
// other person rejected outgoing // other person rejected outgoing
client.emit("friendRequestRejected", self.outgoing_friend_requests.remove(rejectedUser)); client.emit("friendRequestRejected", this.outgoing_friend_requests.remove(rejectedUser));
return; return;
} }
// incoming deleted manually // incoming deleted manually
self.incoming_friend_requests.remove(user); this.incoming_friend_requests.remove(user);
return; return;
} }
user = self.outgoing_friend_requests.get("id", data.id); user = this.outgoing_friend_requests.get("id", data.id);
if (user) { // client cancelled incoming friend request OR client user manually deleted outgoing thru web client/other clients if (user) { // client cancelled incoming friend request OR client user manually deleted outgoing thru web client/other clients
var incomingCancel = self.incoming_friend_requests.get("id", user.id); var incomingCancel = this.incoming_friend_requests.get("id", user.id);
if (incomingCancel) { if (incomingCancel) {
// client cancelled incoming // client cancelled incoming
self.incoming_friend_requests.remove(user); this.incoming_friend_requests.remove(user);
return; return;
} }
// outgoing deleted manually // outgoing deleted manually
self.outgoing_friend_requests.remove(user); this.outgoing_friend_requests.remove(user);
return; return;
} }
break; break;
@@ -2332,6 +2390,5 @@ export default class InternalClient {
client.emit("unknown", packet); client.emit("unknown", packet);
break; break;
} }
};
} }
} }

View File

@@ -90,6 +90,7 @@ Constants.PacketType = {
MESSAGE_UPDATE : "MESSAGE_UPDATE", MESSAGE_UPDATE : "MESSAGE_UPDATE",
PRESENCE_UPDATE : "PRESENCE_UPDATE", PRESENCE_UPDATE : "PRESENCE_UPDATE",
READY : "READY", READY : "READY",
RESUME : "RESUME",
SERVER_BAN_ADD : "GUILD_BAN_ADD", SERVER_BAN_ADD : "GUILD_BAN_ADD",
SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE", SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE",
SERVER_CREATE : "GUILD_CREATE", SERVER_CREATE : "GUILD_CREATE",