From 71dd084667dd797193425b127147100c5f0ee548 Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Tue, 12 Apr 2016 23:01:45 -0700 Subject: [PATCH] forceFetch fix --- lib/Client/InternalClient.js | 557 ++++++++++++++++++----------------- src/Client/InternalClient.js | 118 +++++--- 2 files changed, 358 insertions(+), 317 deletions(-) diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 8f0981a41..28e0941c1 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -191,6 +191,10 @@ var InternalClient = (function () { this.readyTime = null; this.messageAwaits = {}; + this.forceFetchCount = {}; + this.forceFetchQueue = []; + this.forceFetchLength = 1; + this.tokenCacher = new _UtilTokenCacher2["default"](this.client); this.tokenCacher.init(0); }; @@ -386,55 +390,49 @@ var InternalClient = (function () { // Backwards-compatible utility getter method for the first voice connection // Thanks to #q (@qeled) for suggesting this - // def forceFetchUsers - - InternalClient.prototype.forceFetchUsers = function forceFetchUsers() { - var _this6 = this; - - this.sendWS({ - op: 8, - d: { - guild_id: this.servers.filter(function (srv) { - return srv.large && srv.memberCount > srv.members.length; - }).map(function (srv) { - return srv.id; - }), - query: "", - limit: 0 - } - }); - this.chunkloaderCount = {}; - for (var _iterator2 = this.servers.filter(function (srv) { - return srv.large && srv.memberCount > srv.members.length; - }), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { - var _ref2; - - if (_isArray2) { - if (_i2 >= _iterator2.length) break; - _ref2 = _iterator2[_i2++]; - } else { - _i2 = _iterator2.next(); - if (_i2.done) break; - _ref2 = _i2.value; - } - - var server = _ref2; - - this.chunkloaderCount[server.id] = Math.ceil(server.memberCount / 1000); + InternalClient.prototype.getGuildMembers = function getGuildMembers(guildID, chunkCount) { + this.forceFetchCount[guildID] = chunkCount; + if (this.forceFetchLength + 3 + guildID.length > 4082) { + // 4096 - '{"op":8,"d":[]}'.length + 1 for lazy comma offset + this.requestGuildMembers(this.forceFetchQueue); + this.forceFetchQueue = [guildID]; + this.forceFetchLength = 1 + guildID.length + 3; + } else { + this.forceFetchQueue.push(guildID); + this.forceFetchLength += guildID.length + 3; } - return new Promise(function (resolve, reject) { - if (!server) { - resolve(); - } else { - _this6.chunkloaderCallback = resolve; - } + }; + + InternalClient.prototype.requestGuildMembers = function requestGuildMembers(guildID, query, limit) { + this.sendWS(OPCodes.GET_GUILD_MEMBERS, { + guild_id: guildID, + query: query || "", + limit: limit || 0 }); }; + InternalClient.prototype.checkReady = function checkReady() { + if (!this.readyTime) { + if (this.forceFetchQueue.length > 0) { + this.requestGuildMembers(this.forceFetchQueue); + this.forceFetchQueue = []; + this.forceFetchLength = 1; + } else { + for (var key in this.forceFetchCount) { + if (this.forceFetchCount.hasOwnProperty(key)) { + return; + } + } + this.readyTime = Date.now(); + client.emit("ready"); + } + } + }; + // def createServer InternalClient.prototype.createServer = function createServer(name) { - var _this7 = this; + var _this6 = this; var region = arguments.length <= 1 || arguments[1] === undefined ? "london" : arguments[1]; @@ -443,7 +441,7 @@ var InternalClient = (function () { return this.apiRequest('post', _Constants.Endpoints.SERVERS, true, { name: name, region: region }).then(function (res) { // valid server, wait until it is cached return waitFor(function () { - return _this7.servers.get("id", res.id); + return _this6.servers.get("id", res.id); }); }); }; @@ -451,7 +449,7 @@ var InternalClient = (function () { //def joinServer InternalClient.prototype.joinServer = function joinServer(invite) { - var _this8 = this; + var _this7 = this; invite = this.resolver.resolveInviteID(invite); if (!invite) { @@ -461,7 +459,7 @@ var InternalClient = (function () { return this.apiRequest("post", _Constants.Endpoints.INVITE(invite), true).then(function (res) { // valid server, wait until it is received via ws and cached return waitFor(function () { - return _this8.servers.get("id", res.guild.id); + return _this7.servers.get("id", res.guild.id); }); }); }; @@ -469,7 +467,7 @@ var InternalClient = (function () { //def updateServer InternalClient.prototype.updateServer = function updateServer(server, name, region) { - var _this9 = this; + var _this8 = this; var server = this.resolver.resolveServer(server); if (!server) { @@ -479,7 +477,7 @@ var InternalClient = (function () { return this.apiRequest("patch", _Constants.Endpoints.SERVER(server.id), true, { name: name || server.name, region: region || server.region }).then(function (res) { // wait until the name and region are updated return waitFor(function () { - return _this9.servers.get("name", res.name) ? _this9.servers.get("name", res.name).region === res.region ? _this9.servers.get("id", res.id) : false : false; + return _this8.servers.get("name", res.name) ? _this8.servers.get("name", res.name).region === res.region ? _this8.servers.get("id", res.id) : false : false; }); }); }; @@ -487,7 +485,7 @@ var InternalClient = (function () { //def leaveServer InternalClient.prototype.leaveServer = function leaveServer(srv) { - var _this10 = this; + var _this9 = this; var server = this.resolver.resolveServer(srv); if (!server) { @@ -495,6 +493,39 @@ var InternalClient = (function () { } return this.apiRequest("del", _Constants.Endpoints.ME_SERVER(server.id), true).then(function () { + // remove channels of server then the server + for (var _iterator2 = server.channels, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var chan = _ref2; + + _this9.channels.remove(chan); + } + // remove server + _this9.servers.remove(server); + }); + }; + + //def deleteServer + + InternalClient.prototype.deleteServer = function deleteServer(srv) { + var _this10 = this; + + var server = this.resolver.resolveServer(srv); + if (!server) { + return Promise.reject(new Error("server did not resolve")); + } + + return this.apiRequest("del", _Constants.Endpoints.SERVER(server.id), true).then(function () { // remove channels of server then the server for (var _iterator3 = server.channels, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; @@ -517,44 +548,11 @@ var InternalClient = (function () { }); }; - //def deleteServer - - InternalClient.prototype.deleteServer = function deleteServer(srv) { - var _this11 = this; - - var server = this.resolver.resolveServer(srv); - if (!server) { - return Promise.reject(new Error("server did not resolve")); - } - - return this.apiRequest("del", _Constants.Endpoints.SERVER(server.id), true).then(function () { - // remove channels of server then the server - for (var _iterator4 = server.channels, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { - var _ref4; - - if (_isArray4) { - if (_i4 >= _iterator4.length) break; - _ref4 = _iterator4[_i4++]; - } else { - _i4 = _iterator4.next(); - if (_i4.done) break; - _ref4 = _i4.value; - } - - var chan = _ref4; - - _this11.channels.remove(chan); - } - // remove server - _this11.servers.remove(server); - }); - }; - // def loginWithToken // email and password are optional InternalClient.prototype.loginWithToken = function loginWithToken(token, email, password) { - var _this12 = this; + var _this11 = this; this.state = _ConnectionState2["default"].LOGGED_IN; this.token = token; @@ -562,7 +560,7 @@ var InternalClient = (function () { this.password = password; return this.getGateway().then(function (url) { - _this12.createWS(url); + _this11.createWS(url); return token; }); }; @@ -570,14 +568,14 @@ var InternalClient = (function () { // def login InternalClient.prototype.login = function login(email, password) { - var _this13 = this; + var _this12 = this; var client = this.client; if (!this.tokenCacher.done) { return new Promise(function (resolve, reject) { setTimeout(function () { - _this13.login(email, password).then(resolve)["catch"](reject); + _this12.login(email, password).then(resolve)["catch"](reject); }, 20); }); } else { @@ -598,15 +596,15 @@ var InternalClient = (function () { email: email, password: password }).then(function (res) { - _this13.client.emit("debug", "direct API login, cached token was unavailable"); + _this12.client.emit("debug", "direct API login, cached token was unavailable"); var token = res.token; - _this13.tokenCacher.setToken(email, password, token); - return _this13.loginWithToken(token, email, password); + _this12.tokenCacher.setToken(email, password, token); + return _this12.loginWithToken(token, email, password); }, function (error) { - _this13.websocket = null; + _this12.websocket = null; throw error; })["catch"](function (error) { - _this13.state = _ConnectionState2["default"].DISCONNECTED; + _this12.state = _ConnectionState2["default"].DISCONNECTED; client.emit("disconnected"); throw error; }); @@ -615,28 +613,28 @@ var InternalClient = (function () { // def logout InternalClient.prototype.logout = function logout() { - var _this14 = this; + var _this13 = this; if (this.state === _ConnectionState2["default"].DISCONNECTED || this.state === _ConnectionState2["default"].IDLE) { return Promise.reject(new Error("Client is not logged in!")); } return this.apiRequest("post", _Constants.Endpoints.LOGOUT, true).then(function () { - if (_this14.websocket) { - _this14.websocket.close(); - _this14.websocket = null; + if (_this13.websocket) { + _this13.websocket.close(); + _this13.websocket = null; } - _this14.token = null; - _this14.email = null; - _this14.password = null; - _this14.state = _ConnectionState2["default"].DISCONNECTED; + _this13.token = null; + _this13.email = null; + _this13.password = null; + _this13.state = _ConnectionState2["default"].DISCONNECTED; }); }; // def startPM InternalClient.prototype.startPM = function startPM(resUser) { - var _this15 = this; + var _this14 = this; var user = this.resolver.resolveUser(resUser); if (!user) { @@ -646,7 +644,7 @@ var InternalClient = (function () { return this.apiRequest("post", _Constants.Endpoints.USER_CHANNELS(this.user.id), true, { recipient_id: user.id }).then(function (res) { - return _this15.private_channels.add(new _StructuresPMChannel2["default"](res, _this15.client)); + return _this14.private_channels.add(new _StructuresPMChannel2["default"](res, _this14.client)); }); }; @@ -661,19 +659,19 @@ var InternalClient = (function () { // def sendMessage InternalClient.prototype.sendMessage = function sendMessage(where, _content) { - var _this16 = this; + var _this15 = this; var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; return this.resolver.resolveChannel(where).then(function (destination) { //var destination; - var content = _this16.resolver.resolveString(_content); + var content = _this15.resolver.resolveString(_content); - return _this16.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(destination.id), true, { + return _this15.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(destination.id), true, { content: content, tts: options.tts }).then(function (res) { - return destination.messages.add(new _StructuresMessage2["default"](res, destination, _this16.client)); + return destination.messages.add(new _StructuresMessage2["default"](res, destination, _this15.client)); }); }); }; @@ -681,7 +679,7 @@ var InternalClient = (function () { // def deleteMessage InternalClient.prototype.deleteMessage = function deleteMessage(_message) { - var _this17 = this; + var _this16 = this; var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; @@ -692,7 +690,7 @@ var InternalClient = (function () { var chain = options.wait ? delay(options.wait) : Promise.resolve(); return chain.then(function () { - return _this17.apiRequest("del", _Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true); + return _this16.apiRequest("del", _Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true); }).then(function () { return message.channel.messages.remove(message); }); @@ -701,7 +699,7 @@ var InternalClient = (function () { // def updateMessage InternalClient.prototype.updateMessage = function updateMessage(msg, _content) { - var _this18 = this; + var _this17 = this; var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; @@ -717,14 +715,14 @@ var InternalClient = (function () { content: content, tts: options.tts }).then(function (res) { - return message.channel.messages.update(message, new _StructuresMessage2["default"](res, message.channel, _this18.client)); + return message.channel.messages.update(message, new _StructuresMessage2["default"](res, message.channel, _this17.client)); }); }; // def sendFile InternalClient.prototype.sendFile = function sendFile(where, _file, name) { - var _this19 = this; + var _this18 = this; if (!name) { if (_file instanceof String || typeof _file === "string") { @@ -738,12 +736,12 @@ var InternalClient = (function () { } return this.resolver.resolveChannel(where).then(function (channel) { - return _this19.resolver.resolveFile(_file).then(function (file) { - return _this19.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, null, { + return _this18.resolver.resolveFile(_file).then(function (file) { + return _this18.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, null, { name: name, file: file }).then(function (res) { - return channel.messages.add(new _StructuresMessage2["default"](res, channel, _this19.client)); + return channel.messages.add(new _StructuresMessage2["default"](res, channel, _this18.client)); }); }); }); @@ -752,7 +750,7 @@ var InternalClient = (function () { // def getChannelLogs InternalClient.prototype.getChannelLogs = function getChannelLogs(_channel) { - var _this20 = this; + var _this19 = this; var limit = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; @@ -760,21 +758,21 @@ var InternalClient = (function () { return this.resolver.resolveChannel(_channel).then(function (channel) { var qsObject = { limit: limit }; if (options.before) { - var res = _this20.resolver.resolveMessage(options.before); + var res = _this19.resolver.resolveMessage(options.before); if (res) { qsObject.before = res.id; } } if (options.after) { - var res = _this20.resolver.resolveMessage(options.after); + var res = _this19.resolver.resolveMessage(options.after); if (res) { qsObject.after = res.id; } } - return _this20.apiRequest("get", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "?" + _querystring2["default"].stringify(qsObject), true).then(function (res) { + return _this19.apiRequest("get", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "?" + _querystring2["default"].stringify(qsObject), true).then(function (res) { return res.map(function (msg) { - return channel.messages.add(new _StructuresMessage2["default"](msg, channel, _this20.client)); + return channel.messages.add(new _StructuresMessage2["default"](msg, channel, _this19.client)); }); }); }); @@ -783,13 +781,13 @@ var InternalClient = (function () { // def getBans InternalClient.prototype.getBans = function getBans(server) { - var _this21 = this; + var _this20 = this; server = this.resolver.resolveServer(server); return this.apiRequest("get", _Constants.Endpoints.SERVER_BANS(server.id), true).then(function (res) { return res.map(function (ban) { - return _this21.users.add(new _StructuresUser2["default"](ban.user, _this21.client)); + return _this20.users.add(new _StructuresUser2["default"](ban.user, _this20.client)); }); }); }; @@ -797,7 +795,7 @@ var InternalClient = (function () { // def createChannel InternalClient.prototype.createChannel = function createChannel(server, name) { - var _this22 = this; + var _this21 = this; var type = arguments.length <= 2 || arguments[2] === undefined ? "text" : arguments[2]; @@ -809,23 +807,23 @@ var InternalClient = (function () { }).then(function (res) { var channel; if (res.type === "text") { - channel = new _StructuresTextChannel2["default"](res, _this22.client, server); + channel = new _StructuresTextChannel2["default"](res, _this21.client, server); } else { - channel = new _StructuresVoiceChannel2["default"](res, _this22.client, server); + channel = new _StructuresVoiceChannel2["default"](res, _this21.client, server); } - return server.channels.add(_this22.channels.add(channel)); + return server.channels.add(_this21.channels.add(channel)); }); }; // def deleteChannel InternalClient.prototype.deleteChannel = function deleteChannel(_channel) { - var _this23 = this; + var _this22 = this; return this.resolver.resolveChannel(_channel).then(function (channel) { - return _this23.apiRequest("del", _Constants.Endpoints.CHANNEL(channel.id), true).then(function () { + return _this22.apiRequest("del", _Constants.Endpoints.CHANNEL(channel.id), true).then(function () { channel.server.channels.remove(channel); - _this23.channels.remove(channel); + _this22.channels.remove(channel); }); }); }; @@ -863,7 +861,7 @@ var InternalClient = (function () { // def moveMember InternalClient.prototype.moveMember = function moveMember(user, channel) { - var _this24 = this; + var _this23 = this; user = this.resolver.resolveUser(user); return this.resolver.resolveChannel(channel).then(function (channel) { @@ -873,7 +871,7 @@ var InternalClient = (function () { if (channel.type !== "voice") { throw new Error("Can't moveMember into a non-voice channel"); } else { - return _this24.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { channel_id: channel.id }).then(function (res) { + return _this23.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { channel_id: channel.id }).then(function (res) { user.voiceChannel = channel; return res; }); @@ -916,15 +914,15 @@ var InternalClient = (function () { // def createRole InternalClient.prototype.createRole = function createRole(server, data) { - var _this25 = this; + var _this24 = this; server = this.resolver.resolveServer(server); return this.apiRequest("post", _Constants.Endpoints.SERVER_ROLES(server.id), true).then(function (res) { - var role = server.roles.add(new _StructuresRole2["default"](res, server, _this25.client)); + var role = server.roles.add(new _StructuresRole2["default"](res, server, _this24.client)); if (data) { - return _this25.updateRole(role, data); + return _this24.updateRole(role, data); } return role; }); @@ -933,7 +931,7 @@ var InternalClient = (function () { // def updateRole InternalClient.prototype.updateRole = function updateRole(role, data) { - var _this26 = this; + var _this25 = this; role = this.resolver.resolveRole(role); var server = this.resolver.resolveServer(role.server); @@ -947,19 +945,19 @@ var InternalClient = (function () { if (data.permissions) { newData.permissions = 0; - for (var _iterator5 = data.permissions, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { - var _ref5; + for (var _iterator4 = data.permissions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; - if (_isArray5) { - if (_i5 >= _iterator5.length) break; - _ref5 = _iterator5[_i5++]; + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; } else { - _i5 = _iterator5.next(); - if (_i5.done) break; - _ref5 = _i5.value; + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; } - var perm = _ref5; + var perm = _ref4; if (perm instanceof String || typeof perm === "string") { newData.permissions |= _Constants.Permissions[perm] || 0; @@ -970,7 +968,7 @@ var InternalClient = (function () { } return this.apiRequest("patch", _Constants.Endpoints.SERVER_ROLES(server.id) + "/" + role.id, true, newData).then(function (res) { - return server.roles.update(role, new _StructuresRole2["default"](res, server, _this26.client)); + return server.roles.update(role, new _StructuresRole2["default"](res, server, _this25.client)); }); }; @@ -987,7 +985,7 @@ var InternalClient = (function () { //def addMemberToRole InternalClient.prototype.addMemberToRole = function addMemberToRole(member, roles) { - var _this27 = this; + var _this26 = this; member = this.resolver.resolveUser(member); @@ -1004,7 +1002,7 @@ var InternalClient = (function () { } } else { roles = roles.map(function (r) { - return _this27.resolver.resolveRole(r); + return _this26.resolver.resolveRole(r); }); } @@ -1042,19 +1040,19 @@ var InternalClient = (function () { var roledata = role.server.rolesOf(member); if (roledata) { - for (var _iterator6 = roledata, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { - var _ref6; + for (var _iterator5 = roledata, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; - if (_isArray6) { - if (_i6 >= _iterator6.length) break; - _ref6 = _iterator6[_i6++]; + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; } else { - _i6 = _iterator6.next(); - if (_i6.done) break; - _ref6 = _i6.value; + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; } - var r = _ref6; + var r = _ref5; if (r.id == role.id) { return r; @@ -1067,7 +1065,7 @@ var InternalClient = (function () { //def removeMemberFromRole InternalClient.prototype.removeMemberFromRole = function removeMemberFromRole(member, roles) { - var _this28 = this; + var _this27 = this; member = this.resolver.resolveUser(member); @@ -1084,7 +1082,7 @@ var InternalClient = (function () { } } else { roles = roles.map(function (r) { - return _this28.resolver.resolveRole(r); + return _this27.resolver.resolveRole(r); }); } @@ -1092,19 +1090,19 @@ var InternalClient = (function () { return r.id; }); - for (var _iterator7 = roles, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { - var _ref7; + for (var _iterator6 = roles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; - if (_isArray7) { - if (_i7 >= _iterator7.length) break; - _ref7 = _iterator7[_i7++]; + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; } else { - _i7 = _iterator7.next(); - if (_i7.done) break; - _ref7 = _i7.value; + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; } - var role = _ref7; + var role = _ref6; if (!role.server.memberMap[member.id]) { return Promise.reject(new Error("member not in server")); @@ -1125,7 +1123,7 @@ var InternalClient = (function () { // def createInvite InternalClient.prototype.createInvite = function createInvite(chanServ, options) { - var _this29 = this; + var _this28 = this; return this.resolver.resolveChannel(chanServ).then(function (channel) { if (!options) { @@ -1139,8 +1137,8 @@ var InternalClient = (function () { options.xkcdpass = options.xkcd || false; } - return _this29.apiRequest("post", _Constants.Endpoints.CHANNEL_INVITES(channel.id), true, options).then(function (res) { - return new _StructuresInvite2["default"](res, _this29.channels.get("id", res.channel.id), _this29.client); + return _this28.apiRequest("post", _Constants.Endpoints.CHANNEL_INVITES(channel.id), true, options).then(function (res) { + return new _StructuresInvite2["default"](res, _this28.channels.get("id", res.channel.id), _this28.client); }); }); }; @@ -1158,7 +1156,7 @@ var InternalClient = (function () { //def getInvite InternalClient.prototype.getInvite = function getInvite(invite) { - var _this30 = this; + var _this29 = this; invite = this.resolver.resolveInviteID(invite); if (!invite) { @@ -1166,11 +1164,11 @@ var InternalClient = (function () { } return this.apiRequest("get", _Constants.Endpoints.INVITE(invite), true).then(function (res) { - if (!_this30.channels.has("id", res.channel.id)) { - return new _StructuresInvite2["default"](res, null, _this30.client); + if (!_this29.channels.has("id", res.channel.id)) { + return new _StructuresInvite2["default"](res, null, _this29.client); } - return _this30.apiRequest("post", _Constants.Endpoints.CHANNEL_INVITES(res.channel.id), true, { validate: invite }).then(function (res2) { - return new _StructuresInvite2["default"](res2, _this30.channels.get("id", res.channel.id), _this30.client); + return _this29.apiRequest("post", _Constants.Endpoints.CHANNEL_INVITES(res.channel.id), true, { validate: invite }).then(function (res2) { + return new _StructuresInvite2["default"](res2, _this29.channels.get("id", res.channel.id), _this29.client); }); }); }; @@ -1178,22 +1176,22 @@ var InternalClient = (function () { //def getInvites InternalClient.prototype.getInvites = function getInvites(channel) { - var _this31 = this; + var _this30 = this; if (!(channel instanceof _StructuresChannel2["default"])) { var server = this.resolver.resolveServer(channel); if (server) { return this.apiRequest("get", _Constants.Endpoints.SERVER_INVITES(server.id), true).then(function (res) { return res.map(function (data) { - return new _StructuresInvite2["default"](data, _this31.channels.get("id", data.channel.id), _this31.client); + return new _StructuresInvite2["default"](data, _this30.channels.get("id", data.channel.id), _this30.client); }); }); } } return this.resolver.resolveChannel(channel).then(function (channel) { - return _this31.apiRequest("get", _Constants.Endpoints.CHANNEL_INVITES(channel.id), true).then(function (res) { + return _this30.apiRequest("get", _Constants.Endpoints.CHANNEL_INVITES(channel.id), true).then(function (res) { return res.map(function (data) { - return new _StructuresInvite2["default"](data, _this31.channels.get("id", data.channel.id), _this31.client); + return new _StructuresInvite2["default"](data, _this30.channels.get("id", data.channel.id), _this30.client); }); }); }); @@ -1202,7 +1200,7 @@ var InternalClient = (function () { //def overwritePermissions InternalClient.prototype.overwritePermissions = function overwritePermissions(channel, role, updated) { - var _this32 = this; + var _this31 = this; return this.resolver.resolveChannel(channel).then(function (channel) { if (!channel instanceof _StructuresServerChannel2["default"]) { @@ -1215,7 +1213,7 @@ var InternalClient = (function () { }; if (role instanceof String || typeof role === "string") { - role = _this32.resolver.resolveUser(role) || _this32.resolver.resolveRole(role); + role = _this31.resolver.resolveUser(role) || _this31.resolver.resolveRole(role); } if (role instanceof _StructuresUser2["default"]) { @@ -1248,7 +1246,7 @@ var InternalClient = (function () { } } - return _this32.apiRequest("put", _Constants.Endpoints.CHANNEL_PERMISSIONS(channel.id) + "/" + data.id, true, data); + return _this31.apiRequest("put", _Constants.Endpoints.CHANNEL_PERMISSIONS(channel.id) + "/" + data.id, true, data); }); }; @@ -1287,49 +1285,49 @@ var InternalClient = (function () { //def sendTyping InternalClient.prototype.sendTyping = function sendTyping(channel) { - var _this33 = this; + var _this32 = this; return this.resolver.resolveChannel(channel).then(function (channel) { - return _this33.apiRequest("post", _Constants.Endpoints.CHANNEL(channel.id) + "/typing", true); + return _this32.apiRequest("post", _Constants.Endpoints.CHANNEL(channel.id) + "/typing", true); }); }; //def startTyping InternalClient.prototype.startTyping = function startTyping(channel) { - var _this34 = this; + var _this33 = this; return this.resolver.resolveChannel(channel).then(function (channel) { - if (_this34.intervals.typing[channel.id]) { + if (_this33.intervals.typing[channel.id]) { // typing interval already exists, leave it alone throw new Error("Already typing in that channel"); } - _this34.intervals.typing[channel.id] = setInterval(function () { - return _this34.sendTyping(channel)["catch"](function (error) { - return _this34.emit("error", error); + _this33.intervals.typing[channel.id] = setInterval(function () { + return _this33.sendTyping(channel)["catch"](function (error) { + return _this33.emit("error", error); }); }, 4000); - return _this34.sendTyping(channel); + return _this33.sendTyping(channel); }); }; //def stopTyping InternalClient.prototype.stopTyping = function stopTyping(channel) { - var _this35 = this; + var _this34 = this; return this.resolver.resolveChannel(channel).then(function (channel) { - if (!_this35.intervals.typing[channel.id]) { + if (!_this34.intervals.typing[channel.id]) { // typing interval doesn"t exist throw new Error("Not typing in that channel"); } - clearInterval(_this35.intervals.typing[channel.id]); - _this35.intervals.typing[channel.id] = false; + clearInterval(_this34.intervals.typing[channel.id]); + _this34.intervals.typing[channel.id] = false; }); }; @@ -1367,12 +1365,12 @@ var InternalClient = (function () { //def setChannelTopic InternalClient.prototype.setChannelTopic = function setChannelTopic(chann) { - var _this36 = this; + var _this35 = this; var topic = arguments.length <= 1 || arguments[1] === undefined ? "" : arguments[1]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _this36.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { + return _this35.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: channel.name, position: channel.position, topic: topic @@ -1385,12 +1383,12 @@ var InternalClient = (function () { //def setChannelName InternalClient.prototype.setChannelName = function setChannelName(chann) { - var _this37 = this; + var _this36 = this; var name = arguments.length <= 1 || arguments[1] === undefined ? "discordjs_is_the_best" : arguments[1]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _this37.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { + return _this36.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: name, position: channel.position, topic: channel.topic @@ -1403,13 +1401,13 @@ var InternalClient = (function () { //def setChannelNameAndTopic InternalClient.prototype.setChannelNameAndTopic = function setChannelNameAndTopic(chann) { - var _this38 = this; + var _this37 = this; var name = arguments.length <= 1 || arguments[1] === undefined ? "discordjs_is_the_best" : arguments[1]; var topic = arguments.length <= 2 || arguments[2] === undefined ? "" : arguments[2]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _this38.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { + return _this37.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: name, position: channel.position, topic: topic @@ -1423,12 +1421,12 @@ var InternalClient = (function () { //def setTopic InternalClient.prototype.setChannelPosition = function setChannelPosition(chann) { - var _this39 = this; + var _this38 = this; var position = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _this39.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { + return _this38.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: channel.name, position: position, topic: channel.topic @@ -1490,7 +1488,7 @@ var InternalClient = (function () { }; InternalClient.prototype.createWS = function createWS(url) { - var _this40 = this; + var _this39 = this; var self = this; var client = self.client; @@ -1558,9 +1556,12 @@ var InternalClient = (function () { self.user = self.users.add(new _StructuresUser2["default"](data.user, client)); data.guilds.forEach(function (server) { if (!server.unavailable) { - self.servers.add(new _StructuresServer2["default"](server, client)); + server = self.servers.add(new _StructuresServer2["default"](server, client)); + if (self.options.forceFetchUsers && server.members && server.members.length < server.memberCount) { + self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); + } } else { - client.emit("warn", "server was unavailable, could not create (ready)"); + client.emit("warn", "server " + guild.id + " was unavailable, could not create (ready)"); } }); data.private_channels.forEach(function (pm) { @@ -1592,15 +1593,7 @@ var InternalClient = (function () { client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process"); client.emit("debug", "ready with " + self.servers.length + " servers, " + self.channels.length + " channels and " + self.users.length + " users cached."); - self.readyTime = Date.now(); - - if (self.client.options.forceFetchUsers) { - self.forceFetchUsers().then(function () { - client.emit("ready"); - }); - } else { - client.emit("ready"); - } + self.checkReady(); break; case _Constants.PacketType.MESSAGE_CREATE: @@ -1667,11 +1660,10 @@ var InternalClient = (function () { var server = self.servers.get("id", data.id); if (!server) { if (!data.unavailable) { - server = new _StructuresServer2["default"](data, client); - self.servers.add(server); + server = self.servers.add(new _StructuresServer2["default"](data, client)); client.emit("serverCreated", server); - if (server.large && server.members.length < server.memberCount) { - self.sendWS({ op: 8, d: { guild_id: server.id, query: "", limit: 0 } }); + if (self.options.forceFetchUsers && server.large && server.members.length < server.memberCount) { + self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); } } else { client.emit("warn", "server was unavailable, could not create"); @@ -1684,7 +1676,26 @@ var InternalClient = (function () { if (!data.unavailable) { client.emit("serverDeleted", server); - for (var _iterator8 = server.channels, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + for (var _iterator7 = server.channels, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref7; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref7 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref7 = _i7.value; + } + + var channel = _ref7; + + self.channels.remove(channel); + } + + self.servers.remove(server); + + for (var _iterator8 = server.members, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { var _ref8; if (_isArray8) { @@ -1696,41 +1707,22 @@ var InternalClient = (function () { _ref8 = _i8.value; } - var channel = _ref8; - - self.channels.remove(channel); - } - - self.servers.remove(server); - - for (var _iterator9 = server.members, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { - var _ref9; - - if (_isArray9) { - if (_i9 >= _iterator9.length) break; - _ref9 = _iterator9[_i9++]; - } else { - _i9 = _iterator9.next(); - if (_i9.done) break; - _ref9 = _i9.value; - } - - var user = _ref9; + var user = _ref8; var found = false; - for (var _iterator10 = self.servers, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { - var _ref10; + for (var _iterator9 = self.servers, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref9; - if (_isArray10) { - if (_i10 >= _iterator10.length) break; - _ref10 = _iterator10[_i10++]; + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref9 = _iterator9[_i9++]; } else { - _i10 = _iterator10.next(); - if (_i10.done) break; - _ref10 = _i10.value; + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref9 = _i9.value; } - var s = _ref10; + var s = _ref9; if (s.members.get("id", user.id)) { found = true; @@ -1914,19 +1906,19 @@ var InternalClient = (function () { server.members.remove(user); server.memberCount--; var found = false; - for (var _iterator11 = self.servers, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { - var _ref11; + for (var _iterator10 = self.servers, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref10; - if (_isArray11) { - if (_i11 >= _iterator11.length) break; - _ref11 = _iterator11[_i11++]; + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref10 = _iterator10[_i10++]; } else { - _i11 = _iterator11.next(); - if (_i11.done) break; - _ref11 = _i11.value; + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref10 = _i10.value; } - var s = _ref11; + var s = _ref10; if (s.members.get("id", user.id)) { found = true; @@ -2001,7 +1993,7 @@ var InternalClient = (function () { data.id = data.id || user.id; data.avatar = data.avatar || user.avatar; data.discriminator = data.discriminator || user.discriminator; - _this40.email = data.email || _this40.email; + _this39.email = data.email || _this39.email; var presenceUser = new _StructuresUser2["default"](data, client); @@ -2101,19 +2093,19 @@ var InternalClient = (function () { var testtime = new Date().getTime(); - for (var _iterator12 = data.members, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { - var _ref12; + for (var _iterator11 = data.members, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref11; - if (_isArray12) { - if (_i12 >= _iterator12.length) break; - _ref12 = _iterator12[_i12++]; + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref11 = _iterator11[_i11++]; } else { - _i12 = _iterator12.next(); - if (_i12.done) break; - _ref12 = _i12.value; + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref11 = _i11.value; } - var user = _ref12; + var user = _ref11; server.memberMap[user.user.id] = { roles: user.roles.map(function (pid) { @@ -2128,16 +2120,33 @@ var InternalClient = (function () { server.members.add(self.users.add(new _StructuresUser2["default"](user.user, client))); } - if (self.chunkloaderCallback && server.id in self.chunkloaderCount) { - self.chunkloaderCount[server.id]--; - if (self.chunkloaderCount[server.id] <= 0) { - delete self.chunkloaderCount[server.id]; - if (Object.keys(self.chunkloaderCount).length == 0) { - self.chunkloaderCallback(); - self.chunkloaderCallback = null; - } - } - } + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; + xxxx; client.emit("debug", new Date().getTime() - testtime + "ms for " + data.members.length + " user chunk for server with id " + server.id); } else { diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index c8731a797..b15d9bdde 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -127,6 +127,10 @@ export default class InternalClient { this.readyTime = null; this.messageAwaits = {}; + this.forceFetchCount = {}; + this.forceFetchQueue = []; + this.forceFetchLength = 1; + this.tokenCacher = new TokenCacher(this.client); this.tokenCacher.init(0); } @@ -208,7 +212,7 @@ export default class InternalClient { } else { // preserve old functionality for non-bots if (this.voiceConnections[0]) { - this.voiceConnections[0].destroy(); + this.voiceConnections[0].destroy(); } return Promise.resolve(); } @@ -309,29 +313,44 @@ export default class InternalClient { return this.voiceConnections[0]; } - // def forceFetchUsers - forceFetchUsers() { - this.sendWS({ - op : 8, - d : { - guild_id : this.servers.filter(srv => srv.large && srv.memberCount > srv.members.length).map(srv => srv.id), - query : "", - limit : 0 - } - }); - this.chunkloaderCount = {}; - for (var server of this.servers.filter(srv => srv.large && srv.memberCount > srv.members.length)) { - this.chunkloaderCount[server.id] = Math.ceil(server.memberCount / 1000); + getGuildMembers(guildID, chunkCount) { + this.forceFetchCount[guildID] = chunkCount; + if(this.forceFetchLength + 3 + guildID.length > 4082) { // 4096 - '{"op":8,"d":[]}'.length + 1 for lazy comma offset + this.requestGuildMembers(this.forceFetchQueue); + this.forceFetchQueue = [guildID]; + this.forceFetchLength = 1 + guildID.length + 3; + } else { + this.forceFetchQueue.push(guildID); + this.forceFetchLength += guildID.length + 3; } - return new Promise((resolve, reject) => { - if (!server) { - resolve(); - } else { - this.chunkloaderCallback = resolve; - } + } + + requestGuildMembers(guildID, query, limit) { + this.sendWS(OPCodes.GET_GUILD_MEMBERS, { + guild_id: guildID, + query: query || "", + limit: limit || 0 }); } + checkReady() { + if(!this.readyTime) { + if(this.forceFetchQueue.length > 0) { + this.requestGuildMembers(this.forceFetchQueue); + this.forceFetchQueue = []; + this.forceFetchLength = 1; + } else { + for (var key in this.forceFetchCount) { + if (this.forceFetchCount.hasOwnProperty(key)) { + return; + } + } + this.readyTime = Date.now(); + client.emit("ready"); + } + } + } + // def createServer createServer(name, region = "london") { name = this.resolver.resolveString(name); @@ -1298,9 +1317,12 @@ export default class InternalClient { self.user = self.users.add(new User(data.user, client)); data.guilds.forEach(server => { if (!server.unavailable) { - self.servers.add(new Server(server, client)); + server = self.servers.add(new Server(server, client)); + if(self.options.forceFetchUsers && server.members && server.members.length < server.memberCount) { + self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); + } } else { - client.emit("warn", "server was unavailable, could not create (ready)"); + client.emit("warn", "server " + guild.id + " was unavailable, could not create (ready)"); } }); data.private_channels.forEach(pm => { @@ -1328,13 +1350,7 @@ export default class InternalClient { client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); client.emit("debug", `ready with ${self.servers.length} servers, ${self.channels.length} channels and ${self.users.length} users cached.`); - self.readyTime = Date.now(); - - if (self.client.options.forceFetchUsers) { - self.forceFetchUsers().then(() => {client.emit("ready")}); - } else { - client.emit("ready"); - } + self.checkReady(); break; case PacketType.MESSAGE_CREATE: @@ -1399,11 +1415,10 @@ export default class InternalClient { var server = self.servers.get("id", data.id); if (!server) { if (!data.unavailable) { - server = new Server(data, client) - self.servers.add(server); + server = self.servers.add(new Server(data, client)); client.emit("serverCreated", server); - if (server.large && server.members.length < server.memberCount) { - self.sendWS({op: 8, d: {guild_id: server.id, query: "", limit: 0}}); + if (self.options.forceFetchUsers && server.large && server.members.length < server.memberCount) { + self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); } } else { client.emit("warn", "server was unavailable, could not create"); @@ -1800,16 +1815,33 @@ export default class InternalClient { server.members.add(self.users.add(new User(user.user, client))); } - if (self.chunkloaderCallback && server.id in self.chunkloaderCount) { - self.chunkloaderCount[server.id]--; - if (self.chunkloaderCount[server.id] <= 0) { - delete self.chunkloaderCount[server.id]; - if (Object.keys(self.chunkloaderCount).length == 0) { - self.chunkloaderCallback(); - self.chunkloaderCallback = null; - } - } - } +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx +xxxx client.emit("debug", (new Date().getTime() - testtime) + "ms for " + data.members.length + " user chunk for server with id " + server.id);