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 GATEWAY_VERSION = 4;
var zlib;
var libVersion = require('../../package.json').version;
@@ -1795,45 +1796,29 @@ var InternalClient = (function () {
InternalClient.prototype.createWS = function createWS(url) {
var _this36 = this;
var self = this;
var client = self.client;
if (this.websocket) {
return false;
}
if (!url.endsWith("/")) {
url += "/";
}
url += "?encoding=json&v=" + GATEWAY_VERSION;
this.websocket = new _ws2["default"](url);
this.websocket.onopen = function () {
var data = {
op: 2,
d: {
token: self.token,
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 (_this36.sessionID) {
_this36.resume();
} else {
_this36.identify();
}
}
};
if (self.client.options.shard) {
data.d.shard = self.client.options.shard;
}
self.sendWS(data);
};
this.websocket.onclose = function (event) {
self.websocket = null;
self.state = _ConnectionState2["default"].DISCONNECTED;
_this36.websocket = null;
_this36.state = _ConnectionState2["default"].DISCONNECTED;
if (event && event.code) {
client.emit("warn", "WS close: " + event.code);
_this36.client.emit("warn", "WS close: " + event.code);
var err;
if (event.code === 4001) {
err = new Error("Gateway received invalid OP code");
@@ -1848,7 +1833,7 @@ var InternalClient = (function () {
}if (event.code === 4006 || event.code === 4009) {
err = new Error("Invalid session");
} else if (event.code === 4007) {
_this36.seq = 0;
_this36.sequence = 0;
err = new Error("Invalid sequence number");
} else if (event.code === 4008) {
err = new Error("Gateway connection was ratelimited");
@@ -1856,17 +1841,17 @@ var InternalClient = (function () {
err = new Error("Invalid shard key");
}
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) {
client.emit("error", e);
self.websocket = null;
self.state = _ConnectionState2["default"].DISCONNECTED;
self.disconnected(_this36.client.options.autoReconnect);
_this36.client.emit("error", e);
_this36.websocket = null;
_this36.state = _ConnectionState2["default"].DISCONNECTED;
_this36.disconnected(_this36.client.options.autoReconnect);
};
this.websocket.onmessage = function (e) {
@@ -1875,108 +1860,183 @@ var InternalClient = (function () {
e.data = zlib.inflateSync(e.data).toString();
}
var packet, data;
var packet;
try {
packet = JSON.parse(e.data);
data = packet.d;
} catch (e) {
client.emit("error", e);
_this36.client.emit("error", e);
return;
}
client.emit("raw", packet);
switch (packet.t) {
_this36.client.emit("raw", packet);
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:
var startTime = Date.now();
self.intervals.kai = setInterval(function () {
return self.sendWS({ op: 1, d: Date.now() });
this.intervals.kai = setInterval(function () {
return _this37.heartbeat();
}, data.heartbeat_interval);
self.user = self.users.add(new _StructuresUser2["default"](data.user, client));
if (packet.t === _Constants.PacketType.RESUME) {
break;
}
_this36.forceFetchCount = {};
_this36.forceFetchQueue = [];
_this36.forceFetchLength = 1;
_this36.autoReconnectInterval = 1000;
_this36.sessionID = data.session_id;
this.sessionID = data.session_id;
var startTime = Date.now();
this.user = this.users.add(new _StructuresUser2["default"](data.user, client));
this.forceFetchCount = {};
this.forceFetchQueue = [];
this.forceFetchLength = 1;
this.autoReconnectInterval = 1000;
data.guilds.forEach(function (server) {
if (!server.unavailable) {
server = self.servers.add(new _StructuresServer2["default"](server, client));
if (self.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
server = _this37.servers.add(new _StructuresServer2["default"](server, client));
if (_this37.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) {
_this37.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
}
} else {
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) {
self.private_channels.add(new _StructuresPMChannel2["default"](pm, client));
_this37.private_channels.add(new _StructuresPMChannel2["default"](pm, client));
});
if (!data.user.bot) {
// bots dont have friends
data.relationships.forEach(function (friend) {
if (friend.type === 1) {
// 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) {
// 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) {
// 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) {
// 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 {
client.emit("warn", "unknown friend type " + friend.type);
}
});
} else {
self.friends = null;
self.blocked_users = null;
self.incoming_friend_requests = null;
self.outgoing_friend_requests = null;
this.friends = null;
this.blocked_users = null;
this.incoming_friend_requests = null;
this.outgoing_friend_requests = null;
}
// add notes to users
if (data.notes) {
for (note in data.notes) {
var user = self.users.get("id", note);
var user = this.users.get("id", note);
if (user) {
var newUser = user;
newUser.note = data.notes[note];
self.users.update(user, newUser);
this.users.update(user, newUser);
} else {
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 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;
case _Constants.PacketType.MESSAGE_CREATE:
// 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) {
var msg = channel.messages.add(new _StructuresMessage2["default"](data, channel, client));
channel.lastMessageID = msg.id;
if (self.messageAwaits[channel.id + msg.author.id]) {
self.messageAwaits[channel.id + msg.author.id].map(function (fn) {
if (this.messageAwaits[channel.id + msg.author.id]) {
this.messageAwaits[channel.id + msg.author.id].map(function (fn) {
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
} else {
client.emit("message", msg);
@@ -1986,7 +2046,7 @@ var InternalClient = (function () {
}
break;
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) {
// potentially blank
var msg = channel.messages.get("id", data.id);
@@ -2002,7 +2062,7 @@ var InternalClient = (function () {
break;
case _Constants.PacketType.MESSAGE_UPDATE:
// 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) {
// potentially blank
var msg = channel.messages.get("id", data.id);
@@ -2032,28 +2092,28 @@ var InternalClient = (function () {
}
break;
case _Constants.PacketType.SERVER_CREATE:
var server = self.servers.get("id", data.id);
var server = this.servers.get("id", data.id);
if (!server) {
if (!data.unavailable) {
server = self.servers.add(new _StructuresServer2["default"](data, client));
server = this.servers.add(new _StructuresServer2["default"](data, client));
if (client.readyTime) {
client.emit("serverCreated", server);
}
if (self.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
if (this.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) {
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) {
self.unavailableServers.remove(unavailable);
this.unavailableServers.remove(unavailable);
}
self.restartServerCreateTimeout();
this.restartServerCreateTimeout();
} else {
client.emit("debug", "server was unavailable, could not create");
}
}
break;
case _Constants.PacketType.SERVER_DELETE:
var server = self.servers.get("id", data.id);
var server = this.servers.get("id", data.id);
if (server) {
if (!data.unavailable) {
client.emit("serverDeleted", server);
@@ -2072,10 +2132,10 @@ var InternalClient = (function () {
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]();;) {
var _ref8;
@@ -2092,7 +2152,7 @@ var InternalClient = (function () {
var user = _ref8;
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;
if (_isArray9) {
@@ -2112,19 +2172,19 @@ var InternalClient = (function () {
}
}
if (!found) {
self.users.remove(user);
this.users.remove(user);
}
}
} else {
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 {
client.emit("warn", "server was deleted but it was not in the cache");
}
break;
case _Constants.PacketType.SERVER_UPDATE:
var server = self.servers.get("id", data.id);
var server = this.servers.get("id", data.id);
if (server) {
// server exists
data.members = data.members || [];
@@ -2138,31 +2198,31 @@ var InternalClient = (function () {
client.emit("debug", "received server update but server already updated");
} else {
client.emit("serverUpdated", new _StructuresServer2["default"](server, client), newserver);
self.servers.update(server, newserver);
this.servers.update(server, newserver);
}
} else if (!server) {
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);
}
break;
case _Constants.PacketType.CHANNEL_CREATE:
var channel = self.channels.get("id", data.id);
var channel = this.channels.get("id", data.id);
if (!channel) {
var server = self.servers.get("id", data.guild_id);
var server = this.servers.get("id", data.guild_id);
if (server) {
var chan = null;
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 {
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));
} 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 {
client.emit("warn", "channel created but server does not exist");
}
@@ -2172,15 +2232,15 @@ var InternalClient = (function () {
break;
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.server) {
// accounts for PMs
channel.server.channels.remove(channel);
self.channels.remove(channel);
this.channels.remove(channel);
} else {
self.private_channels.remove(channel);
this.private_channels.remove(channel);
}
client.emit("channelDeleted", channel);
@@ -2189,12 +2249,12 @@ var InternalClient = (function () {
}
break;
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 instanceof _StructuresPMChannel2["default"]) {
//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 {
if (channel.server) {
if (channel.type === "text") {
@@ -2203,14 +2263,14 @@ var InternalClient = (function () {
chan.messages = channel.messages;
client.emit("channelUpdated", channel, chan);
channel.server.channels.update(channel, chan);
self.channels.update(channel, chan);
this.channels.update(channel, chan);
} else {
//VOICE CHANNEL
data.members = channel.members;
var chan = new _StructuresVoiceChannel2["default"](data, client, channel.server);
client.emit("channelUpdated", channel, chan);
channel.server.channels.update(channel, chan);
self.channels.update(channel, chan);
this.channels.update(channel, chan);
}
} else {
client.emit("warn", "channel updated but server non-existant");
@@ -2221,7 +2281,7 @@ var InternalClient = (function () {
}
break;
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) {
client.emit("serverRoleCreated", server.roles.add(new _StructuresRole2["default"](data.role, server, client)), server);
} else {
@@ -2229,7 +2289,7 @@ var InternalClient = (function () {
}
break;
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) {
var role = server.roles.get("id", data.role_id);
if (role) {
@@ -2243,7 +2303,7 @@ var InternalClient = (function () {
}
break;
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) {
var role = server.roles.get("id", data.role.id);
if (role) {
@@ -2258,7 +2318,7 @@ var InternalClient = (function () {
}
break;
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) {
server.memberMap[data.user.id] = {
@@ -2273,15 +2333,15 @@ var InternalClient = (function () {
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 {
client.emit("warn", "server member added but server doesn't exist in cache");
}
break;
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) {
var user = self.users.get("id", data.user.id);
var user = this.users.get("id", data.user.id);
if (user) {
client.emit("serverMemberRemoved", server, user);
server.memberMap[data.user.id] = null;
@@ -2295,9 +2355,9 @@ var InternalClient = (function () {
}
break;
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) {
var user = self.users.add(new _StructuresUser2["default"](data.user, client));
var user = this.users.add(new _StructuresUser2["default"](data.user, client));
if (user) {
var oldMember = null;
if (server.memberMap[data.user.id]) {
@@ -2328,8 +2388,8 @@ var InternalClient = (function () {
break;
case _Constants.PacketType.PRESENCE_UPDATE:
var user = self.users.add(new _StructuresUser2["default"](data.user, client));
var server = self.servers.get("id", data.guild_id);
var user = this.users.add(new _StructuresUser2["default"](data.user, client));
var server = this.servers.get("id", data.guild_id);
if (user && server) {
@@ -2347,7 +2407,7 @@ var InternalClient = (function () {
if (!presenceUser.equalsStrict(user)) {
client.emit("presence", user, presenceUser);
self.users.update(user, presenceUser);
this.users.update(user, presenceUser);
}
} else {
client.emit("warn", "presence update but user/server not in cache");
@@ -2356,7 +2416,7 @@ var InternalClient = (function () {
break;
case _Constants.PacketType.USER_UPDATE:
var user = self.users.get("id", data.id);
var user = this.users.get("id", data.id);
if (user) {
@@ -2364,12 +2424,12 @@ var InternalClient = (function () {
data.id = data.id || user.id;
data.avatar = data.avatar || user.avatar;
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);
client.emit("presence", user, presenceUser);
self.users.update(user, presenceUser);
this.users.update(user, presenceUser);
} else {
client.emit("warn", "user update but user not in cache (this should never happen)");
}
@@ -2377,8 +2437,8 @@ var InternalClient = (function () {
break;
case _Constants.PacketType.TYPING:
var user = self.users.get("id", data.user_id);
var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id);
var user = this.users.get("id", data.user_id);
var channel = this.channels.get("id", data.channel_id) || this.private_channels.get("id", data.channel_id);
if (user && channel) {
if (user.typing.since) {
@@ -2402,8 +2462,8 @@ var InternalClient = (function () {
}
break;
case _Constants.PacketType.SERVER_BAN_ADD:
var user = self.users.get("id", data.user.id);
var server = self.servers.get("id", data.guild_id);
var user = this.users.get("id", data.user.id);
var server = this.servers.get("id", data.guild_id);
if (user && server) {
client.emit("userBanned", user, server);
@@ -2412,8 +2472,8 @@ var InternalClient = (function () {
}
break;
case _Constants.PacketType.SERVER_BAN_REMOVE:
var user = self.users.get("id", data.user.id);
var server = self.servers.get("id", data.guild_id);
var user = this.users.get("id", data.user.id);
var server = this.servers.get("id", data.guild_id);
if (user && server) {
client.emit("userUnbanned", user, server);
@@ -2422,10 +2482,10 @@ var InternalClient = (function () {
}
break;
case _Constants.PacketType.USER_NOTE_UPDATE:
if (_this36.user.bot) {
if (this.user.bot) {
return;
}
var user = self.users.get("id", data.id);
var user = this.users.get("id", data.id);
var oldNote = user.note;
var note = data.note || null;
@@ -2436,21 +2496,21 @@ var InternalClient = (function () {
client.emit("noteUpdated", user, oldNote);
self.users.update(user, updatedUser);
this.users.update(user, updatedUser);
} else {
client.emit("warn", "note updated but user not in cache");
}
break;
case _Constants.PacketType.VOICE_STATE_UPDATE:
var user = self.users.get("id", data.user_id);
var server = self.servers.get("id", data.guild_id);
var connection = self.voiceConnections.get("server", server);
var user = this.users.get("id", data.user_id);
var server = this.servers.get("id", data.guild_id);
var connection = this.voiceConnections.get("server", server);
if (user && server) {
if (data.channel_id) {
// 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") {
server.eventVoiceStateUpdate(channel, user, data);
} else {
@@ -2464,13 +2524,13 @@ var InternalClient = (function () {
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.
var connection = self.voiceConnections.get("server", server);
var connection = this.voiceConnections.get("server", server);
// existing connection, perhaps channel moved
if (connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id) {
// 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
}
}
@@ -2478,7 +2538,7 @@ var InternalClient = (function () {
break;
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) {
@@ -2507,15 +2567,15 @@ var InternalClient = (function () {
joinedAt: Date.parse(user.joined_at),
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 (self.forceFetchCount[server.id] <= 1) {
delete self.forceFetchCount[server.id];
self.checkReady();
if (this.forceFetchCount.hasOwnProperty(server.id)) {
if (this.forceFetchCount[server.id] <= 1) {
delete this.forceFetchCount[server.id];
this.checkReady();
} else {
self.forceFetchCount[server.id]--;
this.forceFetchCount[server.id]--;
}
}
@@ -2526,81 +2586,81 @@ var InternalClient = (function () {
break;
case _Constants.PacketType.FRIEND_ADD:
if (_this36.user.bot) {
if (this.user.bot) {
return;
}
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) {
// 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;
}
var outUser = self.outgoing_friend_requests.get("id", data.id);
var outUser = this.outgoing_friend_requests.get("id", data.id);
if (outUser) {
// 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);
return;
}
} else if (data.type === 2) {
// 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) {
// 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) {
// 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;
case _Constants.PacketType.FRIEND_REMOVE:
if (_this36.user.bot) {
if (this.user.bot) {
return;
}
var user = self.friends.get("id", data.id);
var user = this.friends.get("id", data.id);
if (user) {
self.friends.remove(user);
this.friends.remove(user);
client.emit("friendRemoved", user);
return;
}
user = self.blocked_users.get("id", data.id);
user = this.blocked_users.get("id", data.id);
if (user) {
// they rejected friend request
self.blocked_users.remove(user);
this.blocked_users.remove(user);
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
var rejectedUser = self.outgoing_friend_requests.get("id", user.id);
var rejectedUser = this.outgoing_friend_requests.get("id", user.id);
if (rejectedUser) {
// other person rejected outgoing
client.emit("friendRequestRejected", self.outgoing_friend_requests.remove(rejectedUser));
client.emit("friendRequestRejected", this.outgoing_friend_requests.remove(rejectedUser));
return;
}
// incoming deleted manually
self.incoming_friend_requests.remove(user);
this.incoming_friend_requests.remove(user);
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
var incomingCancel = self.incoming_friend_requests.get("id", user.id);
var incomingCancel = this.incoming_friend_requests.get("id", user.id);
if (incomingCancel) {
// client cancelled incoming
self.incoming_friend_requests.remove(user);
this.incoming_friend_requests.remove(user);
return;
}
// outgoing deleted manually
self.outgoing_friend_requests.remove(user);
this.outgoing_friend_requests.remove(user);
return;
}
break;
@@ -2609,7 +2669,6 @@ var InternalClient = (function () {
break;
}
};
};
_createClass(InternalClient, [{
key: "uptime",

View File

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

View File

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

View File

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