diff --git a/lib/chatcommand.js b/lib/chatcommand.js index 1f7347a8..5bf052a8 100644 --- a/lib/chatcommand.js +++ b/lib/chatcommand.js @@ -99,13 +99,14 @@ var handlers = { var handlerList = []; for (var key in handlers) { handlerList.push({ + // match /command followed by a space or end of string re: new RegExp("^\\/" + key + "(?:\\s|$)"), fn: handlers[key] }); } function handle(chan, user, msg, meta) { - // Special case + // Special case because the drink command can vary var m = msg.match(/^\/d(-?[0-9]*)(?:\s|$)(.*)/); if (m) { handleDrink(chan, user, m[1], m[2], meta); @@ -155,101 +156,12 @@ function handleDrink(chan, user, count, msg, meta) { chan.sendMessage(user, msg, meta); } -function handleOld(chan, user, msg, data) { - if(msg.indexOf("/me ") == 0) - chan.sendMessage(user.name, msg.substring(4), "action", data); - else if(msg.indexOf("/sp ") == 0) - chan.sendMessage(user.name, msg.substring(4), "spoiler", data); - else if(msg.indexOf("/say ") == 0) { - if(user.rank >= 1.5) { - chan.sendMessage(user.name, msg.substring(5), "shout", data); - } - } - else if(msg.indexOf("/afk") == 0) { - user.setAFK(!user.meta.afk); - } - else if(msg.indexOf("/m ") == 0) { - if(user.rank >= 2) { - chan.chainMessage(user, msg.substring(3), {modflair: user.rank}) - } - } - else if(msg.indexOf("/a ") == 0) { - if(user.rank >= 255) { - var flair = { - superadminflair: { - labelclass: "label-important", - icon: "icon-globe" - } - }; - var args = msg.substring(3).split(" "); - var cargs = []; - for(var i = 0; i < args.length; i++) { - var a = args[i]; - if(a.indexOf("!icon-") == 0) - flair.superadminflair.icon = a.substring(1); - else if(a.indexOf("!label-") == 0) - flair.superadminflair.labelclass = a.substring(1); - else { - cargs.push(a); - } - } - chan.chainMessage(user, cargs.join(" "), flair); - } - } - else if(msg.indexOf("/mute ") == 0) { - handleMute(chan, user, msg.substring(6).split(" ")); - } - else if(msg.indexOf("/smute ") == 0) { - handleShadowMute(chan, user, msg.substring(7).split(" ")); - } - else if(msg.indexOf("/unmute ") == 0) { - handleUnmute(chan, user, msg.substring(8).split(" ")); - } - else if(msg.indexOf("/kick ") == 0) { - handleKick(chan, user, msg.substring(6).split(" ")); - } - else if(msg.indexOf("/ban ") == 0) { - handleBan(chan, user, msg.substring(5).split(" ")); - } - else if(msg.indexOf("/ipban ") == 0) { - handleIPBan(chan, user, msg.substring(7).split(" ")); - } - else if(msg.indexOf("/unban ") == 0) { - handleUnban(chan, user, msg.substring(7).split(" ")); - } - else if(msg.indexOf("/poll ") == 0) { - handlePoll(chan, user, msg.substring(6), false); - } - else if(msg.indexOf("/hpoll ") == 0) { - handlePoll(chan, user, msg.substring(6), true); - } - else if(msg.indexOf("/d") == 0 && msg.length > 2 && - msg[2].match(/[-0-9 ]/)) { - if(msg[2] == "-") { - if(msg.length == 3) - return; - if(!msg[3].match(/[0-9]/)) - return; - } - handleDrink(chan, user, msg.substring(2), data); - } - else if(msg.indexOf("/clear") == 0) { - handleClear(chan, user); - } - else if(msg.indexOf("/clean ") == 0) { - handleClean(chan, user, msg.substring(7)); - } - else if(msg.indexOf("/cleantitle ") == 0) { - handleCleanTitle(chan, user, msg.substring(12)); - } -} - function handleShadowMute(chan, user, args) { if (chan.hasPermission(user, "mute") && args.length > 0) { args[0] = args[0].toLowerCase(); var person = false; - for(var i = 0; i < chan.users.length; i++) { - if(chan.users[i].name.toLowerCase() == args[0]) { + for (var i = 0; i < chan.users.length; i++) { + if (chan.users[i].name.toLowerCase() === args[0]) { person = chan.users[i]; break; } @@ -262,6 +174,7 @@ function handleShadowMute(chan, user, args) { }); return; } + /* Reset a previous regular mute */ if (chan.mutedUsers.contains(person.name.toLowerCase())) { chan.mutedUsers.remove(person.name.toLowerCase()); @@ -280,7 +193,7 @@ function handleShadowMute(chan, user, args) { var pkt = { username: "[server]", msg: user.name + " shadow muted " + args[0], - addClass: "server-whisper", + meta: { addClass: "server-whisper" }, time: Date.now() }; chan.users.forEach(function (u) { @@ -293,18 +206,18 @@ function handleShadowMute(chan, user, args) { } function handleMute(chan, user, args) { - if(chan.hasPermission(user, "mute") && args.length > 0) { + if (chan.hasPermission(user, "mute") && args.length > 0) { args[0] = args[0].toLowerCase(); var person = false; - for(var i = 0; i < chan.users.length; i++) { - if(chan.users[i].name.toLowerCase() == args[0]) { + for (var i = 0; i < chan.users.length; i++) { + if (chan.users[i].name.toLowerCase() == args[0]) { person = chan.users[i]; break; } } - if(person) { - if(person.rank >= user.rank) { + if (person) { + if (person.rank >= user.rank) { user.socket.emit("errorMsg", { msg: "You don't have permission to mute that person." }); @@ -322,18 +235,18 @@ function handleMute(chan, user, args) { } function handleUnmute(chan, user, args) { - if(chan.hasPermission(user, "mute") && args.length > 0) { + if (chan.hasPermission(user, "mute") && args.length > 0) { args[0] = args[0].toLowerCase(); var person = false; - for(var i = 0; i < chan.users.length; i++) { - if(chan.users[i].name.toLowerCase() == args[0]) { + for (var i = 0; i < chan.users.length; i++) { + if (chan.users[i].name.toLowerCase() == args[0]) { person = chan.users[i]; break; } } - if(person) { - if(person.rank >= user.rank) { + if (person) { + if (person.rank >= user.rank) { user.socket.emit("errorMsg", { msg: "You don't have permission to unmute that person." }); @@ -352,18 +265,18 @@ function handleUnmute(chan, user, args) { } function handleKick(chan, user, args) { - if(chan.hasPermission(user, "kick") && args.length > 0) { + if (chan.hasPermission(user, "kick") && args.length > 0) { args[0] = args[0].toLowerCase(); - if(args[0] == user.name.toLowerCase()) { + if (args[0] == user.name.toLowerCase()) { user.socket.emit("costanza", { msg: "Kicking yourself?" }); return; } var kickee; - for(var i = 0; i < chan.users.length; i++) { - if(chan.users[i].name.toLowerCase() == args[0]) { - if(chan.users[i].rank >= user.rank) { + for (var i = 0; i < chan.users.length; i++) { + if (chan.users[i].name.toLowerCase() == args[0]) { + if (chan.users[i].rank >= user.rank) { user.socket.emit("errorMsg", { msg: "You don't have permission to kick " + args[0] }); @@ -373,7 +286,7 @@ function handleKick(chan, user, args) { break; } } - if(kickee) { + if (kickee) { chan.logger.log("*** " + user.name + " kicked " + args[0]); args[0] = ""; var reason = args.join(" "); @@ -393,9 +306,9 @@ function handleBan(chan, user, args) { } function handleUnban(chan, user, args) { - if(chan.hasPermission(user, "ban") && args.length > 0) { + if (chan.hasPermission(user, "ban") && args.length > 0) { chan.logger.log("*** " + user.name + " unbanned " + args[0]); - if(args[0].match(/(\d+)\.(\d+)\.(\d+)\.(\d+)/)) { + if (args[0].match(/(\d+)\.(\d+)\.(\d+)\.(\d+)/)) { chan.unbanIP(user, args[0]); } else { @@ -405,7 +318,7 @@ function handleUnban(chan, user, args) { } function handlePoll(chan, user, msg, hidden) { - if(chan.hasPermission(user, "pollctl")) { + if (chan.hasPermission(user, "pollctl")) { var args = msg.split(","); var title = args[0]; args.splice(0, 1); @@ -416,34 +329,8 @@ function handlePoll(chan, user, msg, hidden) { } } -/* -function handleDrink(chan, user, msg, data) { - if(!chan.hasPermission(user, "drink")) { - return; - } - - var count = msg.split(" ")[0]; - msg = msg.substring(count.length + 1); - if(count == "") - count = 1; - else - count = parseInt(count); - - chan.drinks += count; - chan.broadcastDrinks(); - if(count < 0 && msg.trim() == "") { - return; - } - - msg = msg + " drink!"; - if(count != 1) - msg += " (x" + count + ")"; - chan.sendMessage(user.name, msg, "drink", data); -} -*/ - function handleClear(chan, user) { - if(user.rank < 2) { + if (user.rank < 2) { return; } diff --git a/www/assets/js/util.js b/www/assets/js/util.js index 1cbe7978..bef63a3e 100644 --- a/www/assets/js/util.js +++ b/www/assets/js/util.js @@ -1442,22 +1442,27 @@ function sendVideoUpdate() { /* chat */ function formatChatMessage(data) { + // Phase 1: Determine whether to show the username or not var skip = data.username === LASTCHATNAME; - if (data.meta.forceShowName) { - skip = false; - } - if(data.msgclass == "server-whisper") + if(data.meta.addClass === "server-whisper") skip = true; // Prevent impersonation by abuse of the bold filter if(data.msg.match(/^\s*\w+\s*:\s*<\/strong>\s*/)) skip = false; + if (data.meta.forceShowName) + skip = false; + LASTCHATNAME = data.username; LASTCHATTIME = data.time; var div = $("
"); + /* drink is a special case because the entire container gets the class, not + just the message */ if (data.meta.addClass === "drink") { div.addClass("drink"); data.meta.addClass = ""; } + + // Add timestamps (unless disabled) if (USEROPTS.show_timestamps) { var time = $("").addClass("timestamp").appendTo(div); var timestamp = new Date(data.time).toTimeString().split(" ")[0]; @@ -1468,6 +1473,7 @@ function formatChatMessage(data) { } } + // Add username var name = $(""); if (!skip) { name.appendTo(div); @@ -1487,9 +1493,11 @@ function formatChatMessage(data) { .prependTo(name); } + // Add the message itself var message = $("").appendTo(div); message[0].innerHTML = data.msg; + // For /me the username is part of the message if (data.meta.action) { name.remove(); message[0].innerHTML = data.username + " " + data.msg; @@ -1500,68 +1508,13 @@ function formatChatMessage(data) { return div; } -function oldFormatChatMessage(data) { - var skip = data.username == LASTCHATNAME; - if(data.msgclass == "drink" || data.msgclass == "shout") { - skip = false; - } - if(data.superadminflair) - skip = false; - if(data.msgclass == "server-whisper") - skip = true; - // Prevent impersonation by abuse of the bold filter - if(data.msg.match(/^\s*\w+\s*:\s*<\/strong>\s*/)) - skip = false; - LASTCHATNAME = data.username; - LASTCHATTIME = data.time; - var div = $("
"); - if(USEROPTS.show_timestamps) { - var time = $("").addClass("timestamp").appendTo(div); - var timestamp = new Date(data.time).toTimeString().split(" ")[0]; - time.text("["+timestamp+"] "); - if(data.msgclass == "shout" || data.msgclass == "server-whisper") - time.addClass(data.msgclass); - } - var name = $(""); - if(!skip) { - name.appendTo(div); - } - $("").addClass("username").text(data.username + ": ").appendTo(name); - var message = $("").appendTo(div); - message[0].innerHTML = data.msg; - if(data.modflair) { - name.addClass(getNameColor(data.modflair)); - } - if(data.superadminflair) { - name.addClass("label") - .addClass(data.superadminflair.labelclass); - $("").addClass(data.superadminflair.icon) - .addClass("icon-white") - .prependTo(name); - } - if(data.msgclass == "action") { - name.remove(); - message.addClass("action"); - message[0].innerHTML = data.username + " " + data.msg; - } - else if(data.msgclass == "drink") { - div.addClass("drink"); - } - else if(data.msgclass == "shout") { - message.addClass("shout"); - name.addClass("shout"); - } - else { - message.addClass(data.msgclass); - } - return div; -} - function addChatMessage(data) { - if(IGNORED.indexOf(data.username) != -1) { + if(IGNORED.indexOf(data.username) !== -1) { return; } var div = formatChatMessage(data); + // Incoming: a bunch of crap for the feature where if you hover over + // a message, it highlights messages from that user div.data("sender", data.username); div.appendTo($("#messagebuffer")); div.mouseover(function() {