Only update the users list when needed

Currently, for join/part/kick/nick/... the server will send an updated list of users and the client will re-render the list entirely. This ends up being a very expensive operation when joined on large channels and causes the client to slow down a lot.
This commit is contained in:
Maxime Poulin 2016-02-16 21:29:44 -05:00
parent 0d823f24d6
commit 5bf205195d
9 changed files with 43 additions and 12 deletions

View file

@ -394,6 +394,19 @@ $(function() {
}); });
socket.on("users", function(data) { socket.on("users", function(data) {
var chan = chat.find("#chan-" + data.chan);
if (chan.hasClass("active")) {
socket.emit("names", {
target: data.chan
});
}
else {
chan.data("needsNamesRefresh", true);
}
});
socket.on("names", function(data) {
var users = chat.find("#chan-" + data.chan).find(".users").html(render("user", data)); var users = chat.find("#chan-" + data.chan).find(".users").html(render("user", data));
var nicks = []; var nicks = [];
for (var i in data.users) { for (var i in data.users) {
@ -572,6 +585,11 @@ $(function() {
} }
} }
if (chan.data("needsNamesRefresh") === true) {
chan.data("needsNamesRefresh", false);
socket.emit("names", {target: self.data("id")});
}
if (screen.width > 768 && chan.hasClass("chan")) { if (screen.width > 768 && chan.hasClass("chan")) {
input.focus(); input.focus();
} }

View file

@ -303,6 +303,19 @@ Client.prototype.sort = function(data) {
} }
}; };
Client.prototype.names = function(data) {
var client = this;
var target = client.find(data.target);
if (!target) {
return;
}
client.emit("names", {
chan: target.chan.id,
users: target.chan.users
});
};
Client.prototype.quit = function() { Client.prototype.quit = function() {
var sockets = this.sockets.sockets; var sockets = this.sockets.sockets;
var room = sockets.adapter.rooms[this.id] || []; var room = sockets.adapter.rooms[this.id] || [];

View file

@ -21,8 +21,7 @@ module.exports = function(irc, network) {
chan.users.push(new User({name: data.nick})); chan.users.push(new User({name: data.nick}));
chan.sortUsers(); chan.sortUsers();
client.emit("users", { client.emit("users", {
chan: chan.id, chan: chan.id
users: chan.users
}); });
var self = false; var self = false;
if (data.nick.toLowerCase() === irc.me.toLowerCase()) { if (data.nick.toLowerCase() === irc.me.toLowerCase()) {

View file

@ -19,8 +19,7 @@ module.exports = function(irc, network) {
} }
client.emit("users", { client.emit("users", {
chan: chan.id, chan: chan.id
users: chan.users
}); });
var self = false; var self = false;

View file

@ -14,8 +14,7 @@ module.exports = function(irc, network) {
}); });
chan.sortUsers(); chan.sortUsers();
client.emit("users", { client.emit("users", {
chan: chan.id, chan: chan.id
users: chan.users
}); });
}); });
}; };

View file

@ -31,8 +31,7 @@ module.exports = function(irc, network) {
user.name = nick; user.name = nick;
chan.sortUsers(); chan.sortUsers();
client.emit("users", { client.emit("users", {
chan: chan.id, chan: chan.id
users: chan.users
}); });
var msg = new Msg({ var msg = new Msg({
type: Msg.Type.NICK, type: Msg.Type.NICK,

View file

@ -19,8 +19,7 @@ module.exports = function(irc, network) {
var user = _.findWhere(chan.users, {name: from}); var user = _.findWhere(chan.users, {name: from});
chan.users = _.without(chan.users, user); chan.users = _.without(chan.users, user);
client.emit("users", { client.emit("users", {
chan: chan.id, chan: chan.id
users: chan.users
}); });
var reason = data.message || ""; var reason = data.message || "";
if (reason.length > 0) { if (reason.length > 0) {

View file

@ -12,8 +12,7 @@ module.exports = function(irc, network) {
} }
chan.users = _.without(chan.users, user); chan.users = _.without(chan.users, user);
client.emit("users", { client.emit("users", {
chan: chan.id, chan: chan.id
users: chan.users
}); });
var reason = data.message || ""; var reason = data.message || "";
if (reason.length > 0) { if (reason.length > 0) {

View file

@ -121,6 +121,12 @@ function init(socket, client, token) {
client.sort(data); client.sort(data);
} }
); );
socket.on(
"names",
function(data) {
client.names(data);
}
);
socket.join(client.id); socket.join(client.id);
socket.emit("init", { socket.emit("init", {
active: client.activeChannel, active: client.activeChannel,