From 2f4621dab9d0415e6d892cd54a7ec9bb76e97d7a Mon Sep 17 00:00:00 2001 From: calzoneman Date: Sun, 18 Aug 2013 12:21:34 -0500 Subject: [PATCH] Start fixing things --- acp.js | 2 + api.js | 3 +- channel.js | 10 +- database.js | 28 +-- user.js | 542 ++++++++++++++++++++++++++++------------------------ 5 files changed, 312 insertions(+), 273 deletions(-) diff --git a/acp.js b/acp.js index d0ade27b..0a332608 100644 --- a/acp.js +++ b/acp.js @@ -9,6 +9,8 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +var Logger = require("./logger"); + module.exports = function (Server) { var db = Server.db; var ActionLog = Server.actionlog; diff --git a/api.js b/api.js index c955af31..8c8f0fdf 100644 --- a/api.js +++ b/api.js @@ -141,6 +141,7 @@ module.exports = function (Server) { /* login */ app.post("/api/login", function (req, res) { res.type("application/jsonp"); + res.setHeader("Access-Control-Allow-Origin", "*"); var name = req.body.name; var pw = req.body.pw; var session = req.body.session; @@ -567,8 +568,6 @@ module.exports = function (Server) { res.jsonp(actions); }); - var actions = ActionLog.readLog(types); - res.jsonp(actions); }); }); diff --git a/channel.js b/channel.js index 7bf92123..7a4bbc94 100644 --- a/channel.js +++ b/channel.js @@ -25,6 +25,7 @@ var Channel = function(name, Server) { var self = this; Logger.syslog.log("Opening channel " + name); self.initialized = false; + self.dbloaded = false; self.server = Server; self.name = name; @@ -117,6 +118,7 @@ var Channel = function(name, Server) { } Server.db.loadChannelData(self, function () { + self.dbloaded = true; if(self.registered) { self.loadDump(); } @@ -658,13 +660,13 @@ Channel.prototype.search = function(query, callback) { res = []; } - results.sort(function(a, b) { + res.sort(function(a, b) { var x = a.title.toLowerCase(); var y = b.title.toLowerCase(); return (x == y) ? 0 : (x < y ? -1 : 1); }); - callback(results); + callback(res); }); } @@ -700,7 +702,7 @@ Channel.prototype.userJoin = function(user) { // If the channel is empty and isn't registered, the first person // gets ownership of the channel (temporarily) - if(this.users.length == 0 && !this.registered) { + if(this.dbloaded && this.users.length == 0 && !this.registered) { user.rank = (user.rank < Rank.Owner) ? 10 : user.rank; user.socket.emit("channelNotRegistered"); } @@ -948,7 +950,7 @@ Channel.prototype.broadcastNewUser = function(user) { self.ip_alias[user.ip] = aliases; aliases.forEach(function (alias) { - chan.name_alias[alias] = aliases; + self.name_alias[alias] = aliases; }); self.login_hist.unshift({ diff --git a/database.js b/database.js index ca0f967f..61afafef 100644 --- a/database.js +++ b/database.js @@ -10,7 +10,8 @@ var Database = function (cfg) { host: cfg["mysql-server"], user: cfg["mysql-user"], password: cfg["mysql-pw"], - database: cfg["mysql-db"] + database: cfg["mysql-db"], + multipleStatements: true }); // Test the connection @@ -43,6 +44,7 @@ Database.prototype.query = function (query, sub, callback) { function cback(err, res) { if(err) { if(self.cfg["debug"]) { + console.log(query); console.log(err); } callback("Database failure", null); @@ -52,9 +54,9 @@ Database.prototype.query = function (query, sub, callback) { conn.end(); } - if(sub) + if(sub) { conn.query(query, sub, cback); - else { + } else { conn.query(query, cback); } } @@ -296,11 +298,11 @@ Database.prototype.searchChannel = function (field, value, callback) { var query = "SELECT * FROM channels WHERE "; if(field === "owner") - query += "owner LIKE %?%"; + query += "owner LIKE ?"; else if(field === "name") - query += "name LIKE %?%"; + query += "name LIKE ?"; - self.query(query, [value], callback); + self.query(query, ["%" + value + "%"], callback); }; Database.prototype.channelExists = function (name, callback) { @@ -611,9 +613,9 @@ Database.prototype.searchLibrary = function (channame, term, callback) { } var query = "SELECT id, title, seconds, type FROM " + - "`chan_" + channame + "_library` WHERE title LIKE %?%"; + "`chan_" + channame + "_library` WHERE title LIKE ?"; - self.query(query, [term], callback); + self.query(query, ["%" + term + "%"], callback); }; Database.prototype.addChannelBan = function (channame, ip, name, banBy, @@ -889,7 +891,7 @@ Database.prototype.getGlobalRank = function (name, callback) { return; var query = "SELECT global_rank FROM registrations WHERE uname=?"; - self.query(query, function (err, res) { + self.query(query, [name], function (err, res) { if(err) { callback(err, null); return; @@ -917,9 +919,9 @@ Database.prototype.searchUser = function (name, callback) { // the user's password hash var query = "SELECT id, uname, global_rank, profile_image, " + "profile_text, email FROM registrations WHERE " + - "uname LIKE %?%"; + "uname LIKE ?"; - self.query(query, [name], callback); + self.query(query, ["%" + name + "%"], callback); }; /* rank */ @@ -1221,7 +1223,7 @@ Database.prototype.listAliases = function (ip, callback) { if(!err) { names = []; res.forEach(function (row) { - names.append(row.name); + names.push(row.name); }); } @@ -1338,7 +1340,7 @@ Database.prototype.listActions = function (types, callback) { list.push("?"); var actionlist = "(" + list.join(",") + ")"; - var query = "SELECT * FROM actionlog WHERE action IN " + actiontypes; + var query = "SELECT * FROM actionlog WHERE action IN " + actionlist; self.query(query, types, callback); }; diff --git a/user.js b/user.js index 1ef9130a..51422abd 100644 --- a/user.js +++ b/user.js @@ -116,188 +116,188 @@ User.prototype.autoAFK = function () { } User.prototype.initCallbacks = function() { - this.socket.on("disconnect", function() { - this.awaytimer && clearTimeout(this.awaytimer); - if(this.channel != null) - this.channel.userLeave(this); - }.bind(this)); + var self = this; + self.socket.on("disconnect", function() { + self.awaytimer && clearTimeout(self.awaytimer); + if(self.channel != null) + self.channel.userLeave(self); + }); - this.socket.on("joinChannel", function(data) { - if(this.channel != null) + self.socket.on("joinChannel", function(data) { + if(self.channel != null) return; if(typeof data.name != "string") return; if(!data.name.match(/^[\w-_]{1,30}$/)) { - this.socket.emit("errorMsg", { + self.socket.emit("errorMsg", { msg: "Invalid channel name. Channel names may consist of"+ " 1-30 characters in the set a-z, A-Z, 0-9, -, and _" }); - this.socket.emit("kick", { + self.socket.emit("kick", { reason: "Bad channel name" }); return; } data.name = data.name.toLowerCase(); - this.channel = this.server.getChannel(data.name); - if(this.loggedIn) { - var chanrank = this.channel.getRank(this.name); - if(chanrank > this.rank) { - this.rank = chanrank; - } + self.channel = self.server.getChannel(data.name); + if(self.loggedIn) { + self.channel.getRank(self.name, function (err, rank) { + if(!err && rank > self.rank) + self.rank = rank; + }); } - this.channel.userJoin(this); - }.bind(this)); + self.channel.userJoin(self); + }); - this.socket.on("login", function(data) { + self.socket.on("login", function(data) { var name = data.name || ""; var pw = data.pw || ""; var session = data.session || ""; if(pw.length > 100) pw = pw.substring(0, 100); - if(this.name == "") - this.login(name, pw, session); - }.bind(this)); + if(self.name == "") + self.login(name, pw, session); + }); - this.socket.on("assignLeader", function(data) { - if(this.channel != null) { - this.channel.tryChangeLeader(this, data); + self.socket.on("assignLeader", function(data) { + if(self.channel != null) { + self.channel.tryChangeLeader(self, data); } - }.bind(this)); + }); - this.socket.on("promote", function(data) { - if(this.channel != null) { - this.channel.tryPromoteUser(this, data); + self.socket.on("promote", function(data) { + if(self.channel != null) { + self.channel.tryPromoteUser(self, data); } - }.bind(this)); + }); - this.socket.on("demote", function(data) { - if(this.channel != null) { - this.channel.tryDemoteUser(this, data); + self.socket.on("demote", function(data) { + if(self.channel != null) { + self.channel.tryDemoteUser(self, data); } - }.bind(this)); + }); - this.socket.on("setChannelRank", function(data) { - if(this.channel != null) { - this.channel.trySetRank(this, data); + self.socket.on("setChannelRank", function(data) { + if(self.channel != null) { + self.channel.trySetRank(self, data); } - }.bind(this)); + }); - this.socket.on("banName", function(data) { - if(this.channel != null) { - this.channel.banName(this, data.name || ""); + self.socket.on("banName", function(data) { + if(self.channel != null) { + self.channel.banName(self, data.name || ""); } - }.bind(this)); + }); - this.socket.on("banIP", function(data) { - if(this.channel != null) { - this.channel.tryIPBan(this, data); + self.socket.on("banIP", function(data) { + if(self.channel != null) { + self.channel.tryIPBan(self, data); } - }.bind(this)); + }); - this.socket.on("unban", function(data) { - if(this.channel != null) { - this.channel.tryUnban(this, data); + self.socket.on("unban", function(data) { + if(self.channel != null) { + self.channel.tryUnban(self, data); } - }.bind(this)); + }); - this.socket.on("chatMsg", function(data) { - if(this.channel != null) { + self.socket.on("chatMsg", function(data) { + if(self.channel != null) { if(data.msg.indexOf("/afk") != 0) { - this.setAFK(false); - this.autoAFK(); + self.setAFK(false); + self.autoAFK(); } - this.channel.tryChat(this, data); + self.channel.tryChat(self, data); } - }.bind(this)); + }); - this.socket.on("newPoll", function(data) { - if(this.channel != null) { - this.channel.tryOpenPoll(this, data); + self.socket.on("newPoll", function(data) { + if(self.channel != null) { + self.channel.tryOpenPoll(self, data); } - }.bind(this)); + }); - this.socket.on("playerReady", function() { - if(this.channel != null) { - this.channel.sendMediaUpdate(this); + self.socket.on("playerReady", function() { + if(self.channel != null) { + self.channel.sendMediaUpdate(self); } - }.bind(this)); + }); - this.socket.on("requestPlaylist", function() { - if(this.channel != null) { - this.channel.sendPlaylist(this); + self.socket.on("requestPlaylist", function() { + if(self.channel != null) { + self.channel.sendPlaylist(self); } - }.bind(this)); + }); - this.socket.on("queue", function(data) { - if(this.channel != null) { - this.channel.tryQueue(this, data); + self.socket.on("queue", function(data) { + if(self.channel != null) { + self.channel.tryQueue(self, data); } - }.bind(this)); + }); - this.socket.on("setTemp", function(data) { - if(this.channel != null) { - this.channel.trySetTemp(this, data); + self.socket.on("setTemp", function(data) { + if(self.channel != null) { + self.channel.trySetTemp(self, data); } - }.bind(this)); + }); - this.socket.on("delete", function(data) { - if(this.channel != null) { - this.channel.tryDequeue(this, data); + self.socket.on("delete", function(data) { + if(self.channel != null) { + self.channel.tryDequeue(self, data); } - }.bind(this)); + }); - this.socket.on("uncache", function(data) { - if(this.channel != null) { - this.channel.tryUncache(this, data); + self.socket.on("uncache", function(data) { + if(self.channel != null) { + self.channel.tryUncache(self, data); } - }.bind(this)); + }); - this.socket.on("moveMedia", function(data) { - if(this.channel != null) { - this.channel.tryMove(this, data); + self.socket.on("moveMedia", function(data) { + if(self.channel != null) { + self.channel.tryMove(self, data); } - }.bind(this)); + }); - this.socket.on("jumpTo", function(data) { - if(this.channel != null) { - this.channel.tryJumpTo(this, data); + self.socket.on("jumpTo", function(data) { + if(self.channel != null) { + self.channel.tryJumpTo(self, data); } - }.bind(this)); + }); - this.socket.on("playNext", function() { - if(this.channel != null) { - this.channel.tryPlayNext(this); + self.socket.on("playNext", function() { + if(self.channel != null) { + self.channel.tryPlayNext(self); } - }.bind(this)); + }); - this.socket.on("clearPlaylist", function() { - if(this.channel != null) { - this.channel.tryClearqueue(this); + self.socket.on("clearPlaylist", function() { + if(self.channel != null) { + self.channel.tryClearqueue(self); } - }.bind(this)); + }); - this.socket.on("shufflePlaylist", function() { - if(this.channel != null) { - this.channel.tryShufflequeue(this); + self.socket.on("shufflePlaylist", function() { + if(self.channel != null) { + self.channel.tryShufflequeue(self); } - }.bind(this)); + }); - this.socket.on("togglePlaylistLock", function() { - if(this.channel != null) { - this.channel.tryToggleLock(this); + self.socket.on("togglePlaylistLock", function() { + if(self.channel != null) { + self.channel.tryToggleLock(self); } - }.bind(this)); + }); - this.socket.on("mediaUpdate", function(data) { - if(this.channel != null) { - this.channel.tryUpdate(this, data); + self.socket.on("mediaUpdate", function(data) { + if(self.channel != null) { + self.channel.tryUpdate(self, data); } - }.bind(this)); + }); - this.socket.on("searchMedia", function(data) { - var self = this; - if(this.channel != null) { + self.socket.on("searchMedia", function(data) { + if(self.channel != null) { if(data.source == "yt") { var searchfn = self.server.infogetter.Getters["ytSearch"]; searchfn(data.query.split(" "), function (e, vids) { @@ -315,148 +315,151 @@ User.prototype.initCallbacks = function() { }); } } - }.bind(this)); + }); - this.socket.on("closePoll", function() { - if(this.channel != null) { - this.channel.tryClosePoll(this); + self.socket.on("closePoll", function() { + if(self.channel != null) { + self.channel.tryClosePoll(self); } - }.bind(this)); + }); - this.socket.on("vote", function(data) { - if(this.channel != null) { - this.channel.tryVote(this, data); + self.socket.on("vote", function(data) { + if(self.channel != null) { + self.channel.tryVote(self, data); } - }.bind(this)); + }); - this.socket.on("registerChannel", function(data) { - if(this.channel == null) { - this.socket.emit("channelRegistration", { + self.socket.on("registerChannel", function(data) { + if(self.channel == null) { + self.socket.emit("channelRegistration", { success: false, error: "You're not in any channel!" }); } else { - this.channel.tryRegister(this); + self.channel.tryRegister(self); } - }.bind(this)); + }); - this.socket.on("unregisterChannel", function() { - if(this.channel == null) { + self.socket.on("unregisterChannel", function() { + if(self.channel == null) { return; } - this.channel.unregister(this); - }.bind(this)); + self.channel.unregister(self); + }); - this.socket.on("setOptions", function(data) { - if(this.channel != null) { - this.channel.tryUpdateOptions(this, data); + self.socket.on("setOptions", function(data) { + if(self.channel != null) { + self.channel.tryUpdateOptions(self, data); } - }.bind(this)); + }); - this.socket.on("setPermissions", function(data) { - if(this.channel != null) { - this.channel.tryUpdatePermissions(this, data); + self.socket.on("setPermissions", function(data) { + if(self.channel != null) { + self.channel.tryUpdatePermissions(self, data); } - }.bind(this)); + }); - this.socket.on("setChannelCSS", function(data) { - if(this.channel != null) { - this.channel.trySetCSS(this, data); + self.socket.on("setChannelCSS", function(data) { + if(self.channel != null) { + self.channel.trySetCSS(self, data); } - }.bind(this)); + }); - this.socket.on("setChannelJS", function(data) { - if(this.channel != null) { - this.channel.trySetJS(this, data); + self.socket.on("setChannelJS", function(data) { + if(self.channel != null) { + self.channel.trySetJS(self, data); } - }.bind(this)); + }); - this.socket.on("updateFilter", function(data) { - if(this.channel != null) { - this.channel.tryUpdateFilter(this, data); + self.socket.on("updateFilter", function(data) { + if(self.channel != null) { + self.channel.tryUpdateFilter(self, data); } - }.bind(this)); + }); - this.socket.on("removeFilter", function(data) { - if(this.channel != null) { - this.channel.tryRemoveFilter(this, data); + self.socket.on("removeFilter", function(data) { + if(self.channel != null) { + self.channel.tryRemoveFilter(self, data); } - }.bind(this)); + }); - this.socket.on("moveFilter", function(data) { - if(this.channel != null) { - this.channel.tryMoveFilter(this, data); + self.socket.on("moveFilter", function(data) { + if(self.channel != null) { + self.channel.tryMoveFilter(self, data); } - }.bind(this)); + }); - this.socket.on("setMotd", function(data) { - if(this.channel != null) { - this.channel.tryUpdateMotd(this, data); + self.socket.on("setMotd", function(data) { + if(self.channel != null) { + self.channel.tryUpdateMotd(self, data); } - }.bind(this)); + }); - this.socket.on("requestLoginHistory", function() { - if(this.channel != null) { - this.channel.sendLoginHistory(this); + self.socket.on("requestLoginHistory", function() { + if(self.channel != null) { + self.channel.sendLoginHistory(self); } - }.bind(this)); + }); - this.socket.on("requestBanlist", function() { - if(this.channel != null) { - this.channel.sendBanlist(this); + self.socket.on("requestBanlist", function() { + if(self.channel != null) { + self.channel.sendBanlist(self); } - }.bind(this)); + }); - this.socket.on("requestChatFilters", function() { - if(this.channel != null) { - this.channel.sendChatFilters(this); + self.socket.on("requestChatFilters", function() { + if(self.channel != null) { + self.channel.sendChatFilters(self); } - }.bind(this)); + }); - this.socket.on("requestChannelRanks", function() { - if(this.channel != null) { - if(this.noflood("requestChannelRanks", 0.25)) + self.socket.on("requestChannelRanks", function() { + if(self.channel != null) { + if(self.noflood("requestChannelRanks", 0.25)) return; - this.channel.sendChannelRanks(this); + self.channel.sendChannelRanks(self); } - }.bind(this)); + }); - this.socket.on("voteskip", function(data) { - if(this.channel != null) { - this.channel.tryVoteskip(this); + self.socket.on("voteskip", function(data) { + if(self.channel != null) { + self.channel.tryVoteskip(self); } - }.bind(this)); + }); - this.socket.on("listPlaylists", function(data) { - if(this.name == "" || this.rank < 1) { - this.socket.emit("listPlaylists", { + self.socket.on("listPlaylists", function(data) { + if(self.name == "" || self.rank < 1) { + self.socket.emit("listPlaylists", { pllist: [], error: "You must be logged in to manage playlists" }); return; } - var list = this.server.db.getUserPlaylists(this.name); - for(var i = 0; i < list.length; i++) { - list[i].time = formatTime(list[i].time); - } - this.socket.emit("listPlaylists", { - pllist: list, + self.server.db.listUserPlaylists(self.name, function (err, list) { + if(err) + list = []; + for(var i = 0; i < list.length; i++) { + list[i].time = formatTime(list[i].time); + } + self.socket.emit("listPlaylists", { + pllist: list, + }); }); - }.bind(this)); + }); - this.socket.on("savePlaylist", function(data) { - if(this.rank < 1) { - this.socket.emit("savePlaylist", { + self.socket.on("savePlaylist", function(data) { + if(self.rank < 1) { + self.socket.emit("savePlaylist", { success: false, error: "You must be logged in to manage playlists" }); return; } - if(this.channel == null) { - this.socket.emit("savePlaylist", { + if(self.channel == null) { + self.socket.emit("savePlaylist", { success: false, error: "Not in a channel" }); @@ -467,65 +470,86 @@ User.prototype.initCallbacks = function() { return; } - var pl = this.channel.playlist.items.toArray(); - var result = this.server.db.saveUserPlaylist(pl, this.name, data.name); - this.socket.emit("savePlaylist", { - success: result, - error: result ? false : "Unknown" - }); - var list = this.server.db.getUserPlaylists(this.name); - for(var i = 0; i < list.length; i++) { - list[i].time = formatTime(list[i].time); - } - this.socket.emit("listPlaylists", { - pllist: list, - }); - }.bind(this)); + var pl = self.channel.playlist.items.toArray(); + self.server.db.saveUserPlaylist(pl, self.name, data.name, + function (err, res) { + if(err) { + console.log(typeof err); + self.socket.emit("savePlaylist", { + success: false, + error: err + }); + return; + } + + self.socket.emit("savePlaylist", { + success: true + }); - this.socket.on("queuePlaylist", function(data) { - if(this.channel != null) { - this.channel.tryQueuePlaylist(this, data); - } - }.bind(this)); + self.server.db.listUserPlaylists(self.name, + function (err, list) { + if(err) + list = []; + for(var i = 0; i < list.length; i++) { + list[i].time = formatTime(list[i].time); + } + self.socket.emit("listPlaylists", { + pllist: list, + }); + }); + }); + }); - this.socket.on("deletePlaylist", function(data) { + self.socket.on("queuePlaylist", function(data) { + if(self.channel != null) { + self.channel.tryQueuePlaylist(self, data); + } + }); + + self.socket.on("deletePlaylist", function(data) { if(typeof data.name != "string") { return; } - this.server.db.deleteUserPlaylist(this.name, data.name); - var list = this.server.db.getUserPlaylists(this.name); - for(var i = 0; i < list.length; i++) { - list[i].time = formatTime(list[i].time); - } - this.socket.emit("listPlaylists", { - pllist: list, + self.server.db.deleteUserPlaylist(self.name, data.name, + function () { + self.server.db.listUserPlaylists(self.name, + function (err, list) { + if(err) + list = []; + for(var i = 0; i < list.length; i++) { + list[i].time = formatTime(list[i].time); + } + self.socket.emit("listPlaylists", { + pllist: list, + }); + }); }); - }.bind(this)); + }); - this.socket.on("readChanLog", function () { - if(this.channel !== null) { - this.channel.tryReadLog(this); + self.socket.on("readChanLog", function () { + if(self.channel !== null) { + self.channel.tryReadLog(self); } - }.bind(this)); + }); - this.socket.on("acp-init", function() { - if(this.global_rank >= Rank.Siteadmin) - this.server.acp.init(this); - }.bind(this)); + self.socket.on("acp-init", function() { + if(self.global_rank >= Rank.Siteadmin) + self.server.acp.init(self); + }); - this.socket.on("borrow-rank", function(rank) { - if(this.global_rank < 255) + self.socket.on("borrow-rank", function(rank) { + if(self.global_rank < 255) return; - if(rank > this.global_rank) + if(rank > self.global_rank) return; - this.rank = rank; - this.socket.emit("rank", rank); - if(this.channel != null) - this.channel.broadcastUserUpdate(this); + self.rank = rank; + self.socket.emit("rank", rank); + if(self.channel != null) + self.channel.broadcastUserUpdate(self); - }.bind(this)); + }); } var lastguestlogin = {}; @@ -631,17 +655,27 @@ User.prototype.login = function(name, pw, session) { image: row.profile_image, text: row.profile_text }; - var chanrank = (self.channel != null) ? self.channel.getRank(name) - : Rank.Guest; - var rank = (chanrank > row.global_rank) ? chanrank - : row.global_rank; - self.rank = (self.rank > rank) ? self.rank : rank; self.global_rank = row.global_rank; - self.socket.emit("rank", self.rank); - self.name = name; - if(self.channel != null) { - self.channel.logger.log(self.ip + " logged in as " + name); - self.channel.broadcastNewUser(self); + var afterRankLookup = function () { + self.socket.emit("rank", self.rank); + self.name = name; + if(self.channel != null) { + self.channel.logger.log(self.ip + " logged in as " + + name); + self.channel.broadcastNewUser(self); + } + }; + if(self.channel !== null) { + self.channel.getRank(self.name, function (err, rank) { + if(!err && rank > self.global_rank) + self.rank = rank; + else + self.rank = self.global_rank + afterRankLookup(); + }); + } else { + self.rank = self.global_rank; + afterRankLookup(); } }); }