diff --git a/channel.js b/channel.js
index 1c749da6..af6ec42f 100644
--- a/channel.js
+++ b/channel.js
@@ -537,7 +537,6 @@ Channel.prototype.userJoin = function(user) {
if(user.name != "") {
for(var i = 0; i < this.users.length; i++) {
if(this.users[i].name.toLowerCase() == user.name.toLowerCase()) {
- console.log("DBG");
this.kick(this.users[i], "Duplicate login");
}
}
@@ -760,6 +759,14 @@ Channel.prototype.sendAll = function(message, data) {
NWS.inRoom(this.name).emit(message, data);
}
+Channel.prototype.sendAllWithPermission = function(perm, msg, data) {
+ for(var i = 0; i < this.users.length; i++) {
+ if(Rank.hasPermission(this.users[i], perm)) {
+ this.users[i].socket.emit(msg, data);
+ }
+ }
+}
+
Channel.prototype.broadcastPlaylistMeta = function() {
var total = 0;
for(var i = 0; i < this.queue.length; i++) {
@@ -1671,6 +1678,46 @@ Channel.prototype.sendMessage = function(username, msg, msgclass, data) {
/* REGION Rank stuff */
+Channel.prototype.trySetRank = function(user, data) {
+ if(!Rank.hasPermission(user, "promote"))
+ return;
+
+ if(typeof data.user !== "string" || typeof data.rank !== "number")
+ return;
+
+ if(data.rank >= user.rank)
+ return;
+
+ if(data.rank < 1)
+ return;
+
+ var receiver;
+ for(var i = 0; i < this.users.length; i++) {
+ if(this.users[i].name == data.user) {
+ receiver = this.users[i];
+ break;
+ }
+ }
+
+ if(receiver) {
+ if(receiver.rank >= user.rank)
+ return;
+ receiver.rank = data.rank;
+ if(receiver.loggedIn) {
+ this.saveRank(receiver);
+ }
+ this.broadcastUserUpdate(receiver);
+ }
+ else {
+ var rrank = this.getRank(data.user);
+ if(rrank >= user.rank)
+ return;
+ Database.setChannelRank(this.name, data.user, data.rank);
+ }
+
+ this.sendAllWithPermission("acl", "setChannelRank", data);
+}
+
Channel.prototype.tryPromoteUser = function(actor, data) {
if(!Rank.hasPermission(actor, "promote")) {
return;
@@ -1705,7 +1752,7 @@ Channel.prototype.tryPromoteUser = function(actor, data) {
Database.setChannelRank(this.name, data.name, rank);
}
this.logger.log("*** " + actor.name + " promoted " + data.name + " from " + (rank - 1) + " to " + rank);
- this.broadcastRankTable();
+ //this.broadcastRankTable();
}
}
@@ -1742,7 +1789,7 @@ Channel.prototype.tryDemoteUser = function(actor, data) {
Database.setChannelRank(this.name, data.name, rank);
}
this.logger.log("*** " + actor.name + " demoted " + data.name + " from " + (rank + 1) + " to " + rank);
- this.broadcastRankTable();
+ //this.broadcastRankTable();
}
}
diff --git a/user.js b/user.js
index c675570f..549ac99e 100644
--- a/user.js
+++ b/user.js
@@ -146,6 +146,12 @@ User.prototype.initCallbacks = function() {
}
}.bind(this));
+ this.socket.on("setChannelRank", function(data) {
+ if(this.channel != null) {
+ this.channel.trySetRank(this, data);
+ }
+ }.bind(this));
+
this.socket.on("banName", function(data) {
if(this.channel != null) {
this.channel.banName(this, data.name || "");
diff --git a/www/assets/js/callbacks.js b/www/assets/js/callbacks.js
index 8680b4e1..315f5fcf 100644
--- a/www/assets/js/callbacks.js
+++ b/www/assets/js/callbacks.js
@@ -361,40 +361,18 @@ Callbacks = {
}
}
loadACLPage(0);
- return;
- for(var i = 0; i < entries.length; i++) {
- var tr = $("
").appendTo(tbl);
- var name = $(" | ").text(entries[i].name).appendTo(tr);
- name.addClass(getNameColor(entries[i].rank));
- var rank = $(" | ").text(entries[i].rank).appendTo(tr);
- var control = $(" | ").appendTo(tr);
- var up = $("").addClass("btn btn-mini btn-success")
- .appendTo(control);
- $("").addClass("icon-plus").appendTo(up);
- var down = $("").addClass("btn btn-mini btn-danger")
- .appendTo(control);
- $("").addClass("icon-minus").appendTo(down);
- if(entries[i].rank + 1 >= RANK) {
- up.attr("disabled", true);
- }
- else {
- up.click(function(name) { return function() {
- socket.emit("promote", {
- name: name
- });
- }}(entries[i].name));
- }
- if(entries[i].rank >= RANK) {
- down.attr("disabled", true);
- }
- else {
- down.click(function(name) { return function() {
- socket.emit("demote", {
- name: name
- });
- }}(entries[i].name));
+ },
+
+ setChannelRank: function(data) {
+ var ents = $("#channelranks").data("entries");
+ for(var i = 0; i < ents.length; i++) {
+ if(ents[i].name == data.user) {
+ ents[i].rank = data.rank;
+ break;
}
}
+ $("#channelranks").data("entries", ents);
+ loadACLPage($("#channelranks").data("page"));
},
voteskip: function(data) {
@@ -515,6 +493,7 @@ Callbacks = {
formatUserlistItem(users[i], data);
}
}
+
},
userLeave: function(data) {
diff --git a/www/assets/js/functions.js b/www/assets/js/functions.js
index 135ab045..55c6ab87 100644
--- a/www/assets/js/functions.js
+++ b/www/assets/js/functions.js
@@ -499,7 +499,6 @@ function loadLoginlogPage(page) {
.text("Ban IP Range")
.appendTo(bantd);
var callback = (function(id, name) { return function() {
- console.log(id, name);
socket.emit("banIP", {
id: id,
name: name,
@@ -509,7 +508,6 @@ function loadLoginlogPage(page) {
} })(entries[i].id, entries[i].names[0]);
ban.click(callback);
var callback2 = (function(id, name) { return function() {
- console.log(id, name);
socket.emit("banIP", {
id: id,
name: name,
@@ -561,6 +559,7 @@ function loadLoginlogPage(page) {
function loadACLPage(page) {
var entries = $("#channelranks").data("entries");
+ $("#channelranks").data("page", page);
var start = page * 20;
var tbl = $("#channelranks table");
if(tbl.children().length > 1) {
@@ -570,34 +569,42 @@ function loadACLPage(page) {
var tr = $("
").appendTo(tbl);
var name = $(" | ").text(entries[i].name).appendTo(tr);
name.addClass(getNameColor(entries[i].rank));
- var rank = $(" | ").text(entries[i].rank).appendTo(tr);
- var control = $(" | ").appendTo(tr);
- var up = $("").addClass("btn btn-mini btn-success")
- .appendTo(control);
- $("").addClass("icon-plus").appendTo(up);
- var down = $("").addClass("btn btn-mini btn-danger")
- .appendTo(control);
- $("").addClass("icon-minus").appendTo(down);
- if(entries[i].rank + 1 >= RANK) {
- up.attr("disabled", true);
- }
- else {
- up.click(function(name) { return function() {
- socket.emit("promote", {
- name: name
+ var rank = $(" | ").text(entries[i].rank)
+ .css("min-width", "220px")
+ .appendTo(tr);
+ (function(name) {
+ rank.click(function() {
+ if(this.find(".rank-edit").length > 0)
+ return;
+ var r = this.text();
+ this.text("");
+ var edit = $("").attr("type", "text")
+ .attr("placeholder", r)
+ .addClass("rank-edit")
+ .appendTo(this)
+ .focus();
+ if(parseInt(r) >= RANK) {
+ edit.attr("disabled", true);
+ }
+ function save() {
+ var r = this.val();
+ var r2 = r;
+ if(r.trim() == "" || parseInt(r) >= RANK || parseInt(r) < 1)
+ r = this.attr("placeholder");
+ r = parseInt(r) + "";
+ this.parent().text(r);
+ socket.emit("setChannelRank", {
+ user: name,
+ rank: parseInt(r)
});
- }}(entries[i].name));
- }
- if(entries[i].rank >= RANK) {
- down.attr("disabled", true);
- }
- else {
- down.click(function(name) { return function() {
- socket.emit("demote", {
- name: name
- });
- }}(entries[i].name));
- }
+ }
+ edit.blur(save.bind(edit));
+ edit.keydown(function(ev) {
+ if(ev.keyCode == 13)
+ save.bind(edit)();
+ });
+ }.bind(rank));
+ })(entries[i].name);
}
if($("#acl_pagination").length > 0) {
$("#acl_pagination").find("li").each(function() {
diff --git a/www/channel.html b/www/channel.html
index 3d8e62a3..b3acf39e 100644
--- a/www/channel.html
+++ b/www/channel.html
@@ -288,8 +288,7 @@
| Name |
- Rank |
- Control |
+ Rank (Click to edit) |