From 425aa751651411dcf0f453f11da34d6b4c558409 Mon Sep 17 00:00:00 2001 From: calzoneman Date: Thu, 8 Aug 2013 10:39:58 -0400 Subject: [PATCH 01/11] Show popup with breakdown of usercount on hover --- www/assets/js/ui.js | 32 ++++++++++++++++++++++++++++++++ www/assets/js/util.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/www/assets/js/ui.js b/www/assets/js/ui.js index 21d79933..614aad51 100644 --- a/www/assets/js/ui.js +++ b/www/assets/js/ui.js @@ -68,6 +68,38 @@ $("#logout").click(function() { }); /* chatbox */ + +$("#usercountwrap").mouseenter(function (ev) { + var breakdown = calcUserBreakdown(); + // re-using profile-box class for convenience + var popup = $("
") + .addClass("profile-box") + .css("top", (ev.pageY + 5) + "px") + .css("left", (ev.pageX) + "px") + .appendTo($("#usercountwrap")); + + var contents = ""; + for(var key in breakdown) { + contents += "" + key + ": " + breakdown[key]; + contents += "
" + } + + popup.html(contents); +}); + +$("#usercountwrap").mousemove(function (ev) { + var popup = $("#usercountwrap").find(".profile-box"); + if(popup.length == 0) + return; + + popup.css("top", (ev.pageY + 5) + "px"); + popup.css("left", (ev.pageX) + "px"); +}); + +$("#usercountwrap").mouseleave(function () { + $("#usercountwrap").find(".profile-box").remove(); +}); + $("#messagebuffer").mouseenter(function() { SCROLLCHAT = false; }); $("#messagebuffer").mouseleave(function() { SCROLLCHAT = true; }); diff --git a/www/assets/js/util.js b/www/assets/js/util.js index cc4f91a5..0fc77531 100644 --- a/www/assets/js/util.js +++ b/www/assets/js/util.js @@ -243,6 +243,35 @@ function addUserDropdown(entry, data) { }); } +function calcUserBreakdown() { + var breakdown = { + "Site Admins": 0, + "Channel Admins": 0, + "Moderators": 0, + "Regular Users": 0, + "Guests": 0, + "AFK": 0 + }; + $("#userlist .userlist_item").each(function (index, item) { + var data = $(item).data("dropdown-info"); + if(data.rank >= 255) + breakdown["Site Admins"]++; + else if(data.rank >= 3) + breakdown["Channel Admins"]++; + else if(data.rank == 2) + breakdown["Moderators"]++; + else if(data.rank >= 1) + breakdown["Regular Users"]++; + else + breakdown["Guests"]++; + + if($(item).find(".icon-time").length > 0) + breakdown["AFK"]++; + }); + + return breakdown; +} + /* queue stuff */ function scrollQueue() { From c7501bfd50e54ba1c2ab52c539cc874613a216fc Mon Sep 17 00:00:00 2001 From: calzoneman Date: Thu, 8 Aug 2013 10:54:07 -0400 Subject: [PATCH 02/11] Add different userlist sort options --- www/assets/js/callbacks.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/www/assets/js/callbacks.js b/www/assets/js/callbacks.js index d5d13504..75559384 100644 --- a/www/assets/js/callbacks.js +++ b/www/assets/js/callbacks.js @@ -626,15 +626,8 @@ Callbacks = { var nametag = $("").text(data.name).appendTo(div); formatUserlistItem(div, data); addUserDropdown(div, data); - var users = $("#userlist").children(); - for(var i = 0; i < users.length; i++) { - var othername = users[i].children[1].innerHTML; - if(othername.toLowerCase() > data.name.toLowerCase()) { - div.insertBefore(users[i]); - return; - } - } div.appendTo($("#userlist")); + sortUserlist(); }, updateUser: function(data) { @@ -668,6 +661,8 @@ Callbacks = { var user = $(".userlist-" + data.name); formatUserlistItem(user, data); addUserDropdown(user, data); + if(USEROPTS.sort_rank) + sortUserlist(); }, setAFK: function (data) { @@ -679,6 +674,8 @@ Callbacks = { .appendTo(user[0].children[0]); $(user[0].children[1]).css("font-style", "italic"); } + if(USEROPTS.sort_afk) + sortUserlist(); }, userLeave: function(data) { From 9256928d826c5b408935dc0f367eef94950be9c1 Mon Sep 17 00:00:00 2001 From: calzoneman Date: Thu, 8 Aug 2013 10:57:46 -0400 Subject: [PATCH 03/11] Handle user impersonation using bold filter differently --- channel.js | 2 +- www/assets/js/util.js | 57 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/channel.js b/channel.js index 63a72c28..cb50d1c6 100644 --- a/channel.js +++ b/channel.js @@ -88,7 +88,7 @@ var Channel = function(name, Server) { }; this.filters = [ new Filter("monospace", "`([^`]+)`", "g", "$1"), - new Filter("bold", "(.)\\*([^\\*]+)\\*", "g", "$1$2"), + new Filter("bold", "(^|\\s)\\*([^\\*]+)\\*", "g", "$1$2"), new Filter("italic", "(^| )_([^_]+)_", "g", "$1$2"), new Filter("strikethrough", "~~([^~]+)~~", "g", "$1"), new Filter("inline spoiler", "\\[spoiler\\](.*)\\[\\/spoiler\\]", "ig", "$1"), diff --git a/www/assets/js/util.js b/www/assets/js/util.js index 0fc77531..b2aae050 100644 --- a/www/assets/js/util.js +++ b/www/assets/js/util.js @@ -272,6 +272,42 @@ function calcUserBreakdown() { return breakdown; } +function sortUserlist() { + var slice = Array.prototype.slice; + var list = slice.call($("#userlist .userlist_item")); + list.sort(function (a, b) { + var r1 = $(a).data("dropdown-info").rank; + var r2 = $(b).data("dropdown-info").rank; + var afk1 = $(a).find(".icon-time").length > 0; + var afk2 = $(b).find(".icon-time").length > 0; + var name1 = a.children[1].innerHTML.toLowerCase(); + var name2 = b.children[1].innerHTML.toLowerCase(); + + if(USEROPTS.sort_afk) { + if(afk1 && !afk2) + return 1; + if(!afk1 && afk2) + return -1; + } + + if(USEROPTS.sort_rank) { + if(r1 < r2) + return 1; + if(r1 > r2) + return -1; + } + + return name1 === name2 ? 0 : (name1 < name2 ? -1 : 1); + }); + + list.forEach(function (item) { + $(item).detach(); + }); + list.forEach(function (item) { + $(item).appendTo($("#userlist")); + }); +} + /* queue stuff */ function scrollQueue() { @@ -541,6 +577,18 @@ function showOptionsMenu() { showts.prop("checked", USEROPTS.show_timestamps); addOption("Show timestamps", tscontainer); + var srcontainer = $("