From aa8c3f64197b8bd6fdb17a760491a3a6cf24e766 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Thu, 12 May 2016 14:15:38 +0300 Subject: [PATCH] Improve nick highlights --- src/client.js | 1 + src/models/network.js | 28 +++++++++++++++++++++++++--- src/plugins/irc-events/message.js | 4 +--- src/plugins/irc-events/nick.js | 2 ++ src/plugins/irc-events/welcome.js | 3 ++- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/client.js b/src/client.js index 05fc6916..11de150a 100644 --- a/src/client.js +++ b/src/client.js @@ -144,6 +144,7 @@ Client.prototype.connect = function(args) { ip: args.ip, hostname: args.hostname, }); + network.setNick(nick); client.networks.push(network); client.emit("network", { diff --git a/src/models/network.js b/src/models/network.js index bba9dc66..9e8ce9a8 100644 --- a/src/models/network.js +++ b/src/models/network.js @@ -33,13 +33,34 @@ function Network(attr) { ); } +Network.prototype.setNick = function(nick) { + this.nick = nick; + this.highlightRegex = new RegExp( + // Do not match characters and numbers (unless IRC color) + "(?:^|[^a-z0-9]|\x03[0-9]{1,2})" + + + // Escape nickname, as it may contain regex stuff + nick.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") + + + // Do not match characters and numbers + "(?:[^a-z0-9]|$)", + + // Case insensitive search + "i" + ); +}; + Network.prototype.toJSON = function() { - var json = _.extend(this, {nick: (this.irc && this.irc.user.nick) || ""}); - return _.omit(json, "irc", "password"); + return _.omit(this, [ + "irc", + "password", + "highlightRegex" + ]); }; Network.prototype.export = function() { var network = _.pick(this, [ + "nick", "name", "host", "port", @@ -51,11 +72,12 @@ Network.prototype.export = function() { "ip", "hostname" ]); - network.nick = (this.irc && this.irc.user.nick) || ""; + network.join = _.map( _.filter(this.channels, {type: "channel"}), "name" ).join(","); + return network; }; diff --git a/src/plugins/irc-events/message.js b/src/plugins/irc-events/message.js index 0689b5a8..65e0bcb1 100644 --- a/src/plugins/irc-events/message.js +++ b/src/plugins/irc-events/message.js @@ -64,9 +64,7 @@ module.exports = function(irc, network) { // Self messages are never highlighted // Non-self messages are highlighted as soon as the nick is detected if (!highlight && !self) { - highlight = data.message.split(" ").some(function(w) { - return (w.replace(/^@/, "").toLowerCase().indexOf(irc.user.nick.toLowerCase()) === 0); - }); + highlight = network.highlightRegex.test(data.message); } if (!self && chan.id !== client.activeChannel) { diff --git a/src/plugins/irc-events/nick.js b/src/plugins/irc-events/nick.js index 35885a97..c84b1b27 100644 --- a/src/plugins/irc-events/nick.js +++ b/src/plugins/irc-events/nick.js @@ -6,6 +6,8 @@ module.exports = function(irc, network) { irc.on("nick", function(data) { var self = false; if (data.nick === irc.user.nick) { + network.setNick(data.new_nick); + var lobby = network.channels[0]; var msg = new Msg({ text: "You're now known as " + data.new_nick, diff --git a/src/plugins/irc-events/welcome.js b/src/plugins/irc-events/welcome.js index 12b0a896..5d86e686 100644 --- a/src/plugins/irc-events/welcome.js +++ b/src/plugins/irc-events/welcome.js @@ -3,7 +3,8 @@ var Msg = require("../../models/msg"); module.exports = function(irc, network) { var client = this; irc.on("registered", function(data) { - network.nick = data.nick; + network.setNick(data.nick); + var lobby = network.channels[0]; var msg = new Msg({ text: "You're now known as " + data.nick