Resend userlist if rank changes meta visibility

Fixes #681.  Technically, resending the entire userlist is not
necessary; it would be sufficient to resent setUserMeta, but there's not
currently a bulk frame for that so sending the userlist is probably more
efficient.
This commit is contained in:
Calvin Montgomery 2017-06-17 09:38:19 -07:00
parent efae9c4774
commit 53cee986c6
5 changed files with 24 additions and 8 deletions

View file

@ -423,6 +423,9 @@ Channel.prototype.acceptUser = function (user) {
// TODO: Drop legacy setAFK frame after a few months
self.broadcastAll("setAFK", { name: user.getName(), afk: afk });
})
user.on("effectiveRankChange", (newRank, oldRank) => {
this.maybeResendUserlist(user, newRank, oldRank);
});
};
Channel.prototype.partUser = function (user) {
@ -456,6 +459,15 @@ Channel.prototype.partUser = function (user) {
user.die();
};
Channel.prototype.maybeResendUserlist = function maybeResendUserlist(user, newRank, oldRank) {
if ((newRank >= 2 && oldRank < 2)
|| (newRank < 2 && oldRank >= 2)
|| (newRank >= 255 && oldRank < 255)
|| (newRank < 255 && oldRank >= 255)) {
this.sendUserlist([user]);
}
};
Channel.prototype.packUserData = function (user) {
var base = {
name: user.getName(),

View file

@ -754,7 +754,7 @@ PlaylistModule.prototype.handleAssignLeader = function (user, data) {
this.leader = null;
if (old.account.effectiveRank === 1.5) {
old.account.effectiveRank = old.account.oldRank;
old.emit("effectiveRankChange", old.account.effectiveRank);
old.emit("effectiveRankChange", old.account.effectiveRank, 1.5);
old.socket.emit("rank", old.account.effectiveRank);
}
@ -781,7 +781,7 @@ PlaylistModule.prototype.handleAssignLeader = function (user, data) {
if (this.leader.account.effectiveRank < 1.5) {
this.leader.account.oldRank = this.leader.account.effectiveRank;
this.leader.account.effectiveRank = 1.5;
this.leader.emit("effectiveRankChange", 1.5);
this.leader.emit("effectiveRankChange", 1.5, this.leader.account.oldRank);
this.leader.socket.emit("rank", 1.5);
}

View file

@ -119,9 +119,10 @@ RankModule.prototype.handleRankChange = function (user, data) {
return;
}
const oldRank = receiver.account.effectiveRank;
receiver.account.channelRank = rank;
receiver.account.effectiveRank = Math.max(receiver.account.globalRank, rank);
receiver.emit("effectiveRankChange", receiver.account.effectiveRank);
receiver.emit("effectiveRankChange", receiver.account.effectiveRank, oldRank);
receiver.socket.emit("rank", receiver.account.effectiveRank);
this.channel.logger.log("[mod] " + user.getName() + " set " + name + "'s rank " +
"to " + rank);