diff --git a/lib/channel.js b/lib/channel.js index edf8807f..c5f09fe7 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -604,7 +604,7 @@ Channel.prototype.tryNameBan = function(actor, name) { var notice = { username: "[server]", msg: actor.name + " banned " + name, - msgclass: "server-whisper", + meta: { addClass: "server-whisper" }, time: Date.now() }; self.users.forEach(function(u) { @@ -716,7 +716,7 @@ Channel.prototype.tryIPBan = function(actor, name, range) { username: "[server]", msg: actor.name + " banned " + $util.maskIP(ip) + " (" + name + ")", - msgclass: "server-whisper", + meta: { addClass: "server-whisper" }, time: Date.now() }; self.users.forEach(function(u) { @@ -1133,7 +1133,7 @@ Channel.prototype.broadcastNewUser = function(user) { var pkt = { username: "[server]", msg: msg, - msgclass: "server-whisper", + meta: { addClass: "server-whisper" }, time: Date.now() }; self.sendAllWithRank(2, "joinMessage", pkt); @@ -2209,6 +2209,15 @@ Channel.prototype.tryChat = function(user, data) { return; } + // Validate meta + var meta = {}; + if (user.rank >= 2) { + if ("modflair" in data.meta && data.meta.modflair === user.rank) { + meta.modflair = data.meta.modflair; + } + } + data.meta = meta; + var msg = data.msg; if(msg.length > 240) { msg = msg.substring(0, 240); @@ -2300,7 +2309,8 @@ Channel.prototype.sendMessage = function (user, msg, meta, filter) { if(this.chatbuffer.length > 15) this.chatbuffer.shift(); var unescaped = sanitize(msg).entityDecode(); - this.logger.log("<" + user.name + "> " + unescaped); + this.logger.log("<" + user.name + (meta.addClass ? "." + meta.addclass : "") + + "> " + unescaped); } }; diff --git a/lib/chatcommand.js b/lib/chatcommand.js index 00a64df1..1f7347a8 100644 --- a/lib/chatcommand.js +++ b/lib/chatcommand.js @@ -13,6 +13,7 @@ var Logger = require("./logger.js"); var Poll = require("./poll").Poll; var handlers = { + /* commands that send chat messages */ "me": function (chan, user, msg, meta) { meta.addClass = "action"; meta.action = true; @@ -29,9 +30,6 @@ var handlers = { chan.sendMessage(user, msg, meta); } }, - "afk": function (chan, user, msg, meta) { - user.setAFK(!user.meta.afk); - }, "a": function (chan, user, msg, meta) { var superadminflair = { labelclass: "label-important", @@ -55,33 +53,108 @@ var handlers = { meta.forceShowName = true; chan.sendMessage(user, cargs.join(" "), meta); }, + "poll": function (chan, user, msg, meta) { + handlePoll(chan, user, msg, false); + }, + "hpoll": function (chan, user, msg, meta) { + handlePoll(chan, user, msg, true); + }, + + /* commands that do not send chat messages */ + "afk": function (chan, user, msg, meta) { + user.setAFK(!user.meta.afk); + }, "mute": function (chan, user, msg, meta) { handleMute(chan, user, msg.split(" ")); }, "smute": function (chan, user, msg, meta) { handleShadowMute(chan, user, msg.split(" ")); + }, + "unmute": function (chan, user, msg, meta) { + handleUnmute(chan, user, msg.split(" ")); + }, + "kick": function (chan, user, msg, meta) { + handleKick(chan, user, msg.split(" ")); + }, + "ban": function (chan, user, msg, meta) { + handleBan(chan, user, msg.split(" ")); + }, + "ipban": function (chan, user, msg, meta) { + handleIPBan(chan, user, msg.split(" ")); + }, + "unban": function (chan, user, msg, meta) { + handleUnban(chan, user, msg.split(" ")); + }, + "clear": function (chan, user, msg, meta) { + handleClear(chan, user); + }, + "clean": function (chan, user, msg, meta) { + handleClean(chan, user, msg); + }, + "cleantitle": function (chan, user, msg, meta) { + handleCleanTitle(chan, user, msg); } }; var handlerList = []; for (var key in handlers) { handlerList.push({ - sub: key.length + 2, re: new RegExp("^\\/" + key + "(?:\\s|$)"), fn: handlers[key] }); } function handle(chan, user, msg, meta) { + // Special case + var m = msg.match(/^\/d(-?[0-9]*)(?:\s|$)(.*)/); + if (m) { + handleDrink(chan, user, m[1], m[2], meta); + return; + } for (var i = 0; i < handlerList.length; i++) { var h = handlerList[i]; if (msg.match(h.re)) { - h.fn(chan, user, msg.substring(h.sub), meta); + var rest; + if (msg.indexOf(" ") >= 0) { + rest = msg.substring(msg.indexOf(" ") + 1); + } else { + rest = ""; + } + h.fn(chan, user, rest, meta); break; } } } +function handleDrink(chan, user, count, msg, meta) { + if (!chan.hasPermission(user, "drink")) { + return; + } + + if (count === "") { + count = 1; + } + count = parseInt(count); + if (isNaN(count)) { + return; + } + + meta.drink = true; + meta.forceShowName = true; + meta.addClass = "drink"; + chan.drinks += count; + chan.broadcastDrinks(); + if (count < 0 && msg.trim() === "") { + return; + } + + msg = msg + " drink!"; + if (count !== 1) { + msg += " (x" + count + ")"; + } + 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); @@ -172,7 +245,7 @@ function handleOld(chan, user, msg, data) { } function handleShadowMute(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++) { @@ -182,8 +255,8 @@ function handleShadowMute(chan, user, args) { } } - 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." }); @@ -207,7 +280,7 @@ function handleShadowMute(chan, user, args) { var pkt = { username: "[server]", msg: user.name + " shadow muted " + args[0], - msgclass: "server-whisper", + addClass: "server-whisper", time: Date.now() }; chan.users.forEach(function (u) { @@ -343,6 +416,7 @@ function handlePoll(chan, user, msg, hidden) { } } +/* function handleDrink(chan, user, msg, data) { if(!chan.hasPermission(user, "drink")) { return; @@ -366,6 +440,7 @@ function handleDrink(chan, user, msg, data) { msg += " (x" + count + ")"; chan.sendMessage(user.name, msg, "drink", data); } +*/ function handleClear(chan, user) { if(user.rank < 2) { diff --git a/www/assets/js/util.js b/www/assets/js/util.js index 21994f9e..1cbe7978 100644 --- a/www/assets/js/util.js +++ b/www/assets/js/util.js @@ -1454,6 +1454,10 @@ function formatChatMessage(data) { LASTCHATNAME = data.username; LASTCHATTIME = data.time; var div = $("
"); + if (data.meta.addClass === "drink") { + div.addClass("drink"); + data.meta.addClass = ""; + } if (USEROPTS.show_timestamps) { var time = $("").addClass("timestamp").appendTo(div); var timestamp = new Date(data.time).toTimeString().split(" ")[0];