diff --git a/lib/api.js b/lib/api.js
index ca7e4677..de03ad85 100644
--- a/lib/api.js
+++ b/lib/api.js
@@ -448,7 +448,10 @@ module.exports = function (Server) {
image: img,
text: text
};
- chan.broadcastUserUpdate(user);
+ chan.sendAll("setUserProfile", {
+ name: user.name,
+ profile: user.profile
+ });
}
}
}
diff --git a/lib/channel.js b/lib/channel.js
index 97de32e4..a7789afc 100644
--- a/lib/channel.js
+++ b/lib/channel.js
@@ -1040,6 +1040,14 @@ Channel.prototype.sendAllWithRank = function(rank, msg, data) {
}
}
+Channel.prototype.sendAllExcept = function(user, msg, data) {
+ for(var i = 0; i < this.users.length; i++) {
+ if (this.users[i] !== user) {
+ this.users[i].socket.emit(msg, data);
+ }
+ }
+}
+
Channel.prototype.broadcastPlaylistMeta = function() {
var total = 0;
var iter = this.playlist.items.first;
@@ -1097,15 +1105,24 @@ Channel.prototype.broadcastNewUser = function(user) {
self.kick(user, "You're banned!");
return;
}
- if (self.mutedUsers.contains(user.name.toLowerCase())) {
+ if (self.mutedUsers.contains(user.name.toLowerCase()) ||
+ self.mutedUsers.contains("[shadow]"+user.name.toLowerCase())) {
user.meta.icon = "icon-volume-off";
}
- self.sendAll("addUser", {
+
+ var pkt = {
name: user.name,
rank: user.rank,
meta: user.meta,
profile: user.profile
- });
+ };
+ if (self.mutedUsers.contains("[shadow]"+user.name.toLowerCase())) {
+ self.sendAllExcept(user, "addUser", pkt);
+ pkt.meta.icon = false;
+ user.socket.emit("addUser", pkt);
+ } else {
+ self.sendAll("addUser", pkt);
+ }
if(user.rank > 0) {
self.saveInitialRank(user);
@@ -1119,20 +1136,7 @@ Channel.prototype.broadcastNewUser = function(user) {
msgclass: "server-whisper",
time: Date.now()
};
- self.users.forEach(function(u) {
- if(u.rank >= 2) {
- u.socket.emit("joinMessage", pkt);
- }
- });
- });
-}
-
-Channel.prototype.broadcastUserUpdate = function(user) {
- this.sendAll("updateUser", {
- name: user.name,
- rank: user.rank,
- meta: user.meta,
- profile: user.profile
+ self.sendAllWithRank(2, "joinMessage", pkt);
});
}
@@ -2323,7 +2327,10 @@ Channel.prototype.trySetRank = function(user, data) {
self.sendAllWithRank(3, "setChannelRank", data);
});
}
- self.broadcastUserUpdate(receiver);
+ self.sendAll("setUserRank", {
+ name: receiver.name,
+ rank: receiver.rank
+ });
} else if(self.registered) {
self.getRank(data.user, function (err, rrank) {
if (self.dead)
diff --git a/lib/chatcommand.js b/lib/chatcommand.js
index b4c7c1f2..d133d094 100644
--- a/lib/chatcommand.js
+++ b/lib/chatcommand.js
@@ -119,8 +119,21 @@ function handleShadowMute(chan, user, args) {
});
return;
}
+ /* Reset a previous regular mute */
+ if (chan.mutedUsers.contains(person.name.toLowerCase())) {
+ chan.mutedUsers.remove(person.name.toLowerCase());
+ chan.sendAll("setUserIcon", {
+ name: person.name,
+ icon: false
+ });
+ }
chan.mutedUsers.add("[shadow]" + person.name.toLowerCase());
chan.logger.log("*** " + user.name + " shadow muted " + args[0]);
+ person.meta.icon = "icon-volume-off";
+ chan.sendAllExcept(person, "setUserIcon", {
+ name: person.name,
+ icon: "icon-volume-off"
+ });
var pkt = {
username: "[server]",
msg: user.name + " shadow muted " + args[0],
@@ -156,7 +169,10 @@ function handleMute(chan, user, args) {
}
person.meta.icon = "icon-volume-off";
chan.mutedUsers.add(person.name.toLowerCase());
- chan.broadcastUserUpdate(person);
+ chan.sendAll("setUserIcon", {
+ name: person.name,
+ icon: "icon-volume-off"
+ });
chan.logger.log("*** " + user.name + " muted " + args[0]);
}
}
@@ -183,7 +199,10 @@ function handleUnmute(chan, user, args) {
person.meta.icon = false;
chan.mutedUsers.remove(person.name.toLowerCase());
chan.mutedUsers.remove("[shadow]" + person.name.toLowerCase());
- chan.broadcastUserUpdate(person);
+ chan.sendAll("setUserIcon", {
+ name: person.name,
+ icon: false
+ });
chan.logger.log("*** " + user.name + " unmuted " + args[0]);
}
}
diff --git a/lib/user.js b/lib/user.js
index 61192353..a6a3af32 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -589,8 +589,12 @@ User.prototype.initCallbacks = function () {
self.rank = rank;
self.socket.emit("rank", rank);
- if (self.inChannel())
- self.channel.broadcastUserUpdate(self);
+ if (self.inChannel()) {
+ self.channel.sendAll("setUserRank", {
+ name: self.name,
+ rank: rank
+ });
+ }
});
};
diff --git a/www/assets/js/callbacks.js b/www/assets/js/callbacks.js
index d1b30a47..c1c5d7b0 100644
--- a/www/assets/js/callbacks.js
+++ b/www/assets/js/callbacks.js
@@ -677,6 +677,7 @@ Callbacks = {
div.data("rank", data.rank);
div.data("leader", false);
div.data("profile", data.profile);
+ div.data("icon", data.meta.icon);
formatUserlistItem(div, data);
addUserDropdown(div, data);
div.appendTo($("#userlist"));
@@ -726,6 +727,16 @@ Callbacks = {
sortUserlist();
},
+ setUserIcon: function (data) {
+ var user = findUserlistItem(data.name);
+ if (user === null) {
+ return;
+ }
+
+ user.data("icon", data.icon);
+ formatUserlistItem(user);
+ },
+
updateUser: function(data) {
if(data.name == CLIENT.name) {
CLIENT.leader = data.leader;
diff --git a/www/assets/js/util.js b/www/assets/js/util.js
index 71d2fa32..f39c6b95 100644
--- a/www/assets/js/util.js
+++ b/www/assets/js/util.js
@@ -82,7 +82,8 @@ function formatUserlistItem(div) {
name: div.data("name") || "",
rank: div.data("rank"),
profile: div.data("profile") || { image: "", text: ""},
- leader: div.data("leader") || false
+ leader: div.data("leader") || false,
+ icon: div.data("icon") || false
};
var name = $(div.children()[1]);
name.removeClass();
@@ -125,8 +126,8 @@ function formatUserlistItem(div) {
name.css("font-style", "italic");
$("").addClass("icon-time").appendTo(flair);
}
- if(data.meta && data.meta.icon) {
- $("").addClass(data.meta.icon).prependTo(flair);
+ if (data.icon) {
+ $("").addClass(data.icon).prependTo(flair);
}
}