Support room highlights (#1334)

This commit is contained in:
TheJetOU
2019-07-22 20:00:52 +03:00
committed by Guangcong Luo
parent 212bffd87f
commit 259dd6dab3

View File

@@ -208,7 +208,15 @@
// highlight
getHighlight: function (message) {
var highlights = Dex.prefs('highlights') || [];
var highlights = Dex.prefs('highlights') || {};
if (Array.isArray(highlights)) {
highlights = {global: highlights};
// Migrate from the old highlight system
Dex.prefs('highlights', highlights);
}
if (!Dex.prefs('noselfhighlight') && app.user.nameRegExp) {
if (app.user.nameRegExp.test(message)) return true;
}
if (!app.highlightRegExp) {
try {
this.updateHighlightRegExp(highlights);
@@ -220,17 +228,22 @@
return false;
}
}
if (!Dex.prefs('noselfhighlight') && app.user.nameRegExp) {
if (app.user.nameRegExp.test(message)) return true;
}
return ((highlights.length > 0) && app.highlightRegExp.test(message));
var id = Config.server.id + '#' + this.id;
var globalHighlightsRegExp = app.highlightRegExp['global'];
var roomHighlightsRegExp = app.highlightRegExp[id];
return (((globalHighlightsRegExp && globalHighlightsRegExp.test(message)) || (roomHighlightsRegExp && roomHighlightsRegExp.test(message))));
},
updateHighlightRegExp: function (highlights) {
// Enforce boundary for match sides, if a letter on match side is
// a word character. For example, regular expression "a" matches
// "a", but not "abc", while regular expression "!" matches
// "!" and "!abc".
app.highlightRegExp = new RegExp('(?:\\b|(?!\\w))(?:' + highlights.join('|') + ')(?:\\b|(?!\\w))', 'i');
if (!app.highlightRegExp) {
app.highlightRegExp = {};
}
for (var i in highlights) {
app.highlightRegExp[i] = new RegExp('(?:\\b|(?!\\w))(?:' + highlights[i].join('|') + ')(?:\\b|(?!\\w))', 'i');
}
},
// chat history
@@ -705,7 +718,7 @@
case 'hl':
case 'highlight':
var highlights = Dex.prefs('highlights') || [];
var highlights = Dex.prefs('highlights') || {};
if (target.indexOf(',') > -1) {
var targets = target.match(/([^,]+?({\d*,\d*})?)+/g);
// trim the targets to be safe
@@ -713,7 +726,9 @@
targets[i] = targets[i].replace(/\n/g, '').trim();
}
switch (targets[0]) {
case 'add':
case 'add': case 'roomadd':
var key = targets[0] === 'roomadd' ? (Config.server.id + '#' + this.id) : 'global';
var highlightList = highlights[key] || [];
for (var i = 1, len = targets.length; i < len; i++) {
if (!targets[i]) continue;
if (/[\\^$*+?()|{}[\]]/.test(targets[i])) {
@@ -724,24 +739,26 @@
return this.add(e.message.substr(0, 28) === 'Invalid regular expression: ' ? e.message : 'Invalid regular expression: /' + targets[i] + '/: ' + e.message);
}
}
if (highlights.indexOf(targets[i]) > -1) {
if (highlightList.indexOf(targets[i]) > -1) {
return this.add(targets[i] + ' is already on your highlights list.');
}
}
highlights = highlights.concat(targets.slice(1));
this.add("Now highlighting on: " + highlights.join(', '));
highlights[key] = highlightList.concat(targets.slice(1));
this.add("Now highlighting on " + (key === 'global' ? "(everywhere): " : "(in " + key + "): ") + highlights[key].join(', '));
// We update the regex
this.updateHighlightRegExp(highlights);
break;
case 'delete':
case 'delete': case 'roomdelete':
var key = targets[0] === 'roomdelete' ? (Config.server.id + '#' + this.id) : 'global';
var highlightList = highlights[key] || [];
var newHls = [];
for (var i = 0, len = highlights.length; i < len; i++) {
if (targets.indexOf(highlights[i]) === -1) {
newHls.push(highlights[i]);
for (var i = 0, len = highlightList.length; i < len; i++) {
if (targets.indexOf(highlightList[i]) === -1) {
newHls.push(highlightList[i]);
}
}
highlights = newHls;
this.add("Now highlighting on: " + highlights.join(', '));
highlights[key] = newHls;
this.add("Now highlighting on " + (key === 'global' ? "(everywhere): " : "(in " + key + "): ") + highlights[key].join(', '));
// We update the regex
this.updateHighlightRegExp(highlights);
break;
@@ -756,10 +773,11 @@
if (target === 'delete') {
Dex.prefs('highlights', false);
this.add("All highlights cleared");
} else if (target === 'show' || target === 'list') {
} else if (['show', 'list', 'roomshow', 'roomlist'].includes(target)) {
// Shows a list of the current highlighting words
if (highlights.length > 0) {
this.add("Current highlight list: " + highlights.join(", "));
var key = target.startsWith('room') ? (Config.server.id + '#' + this.id) : 'global';
if (highlights[key].length > 0) {
this.add("Current highlight list " + (key === 'global' ? "(everywhere): " : "(in " + key + "): ") + highlights[key].join(", "));
} else {
this.add('Your highlight list is empty.');
}
@@ -996,8 +1014,11 @@
case 'hl':
this.add('Set up highlights:');
this.add('/highlight add, [word] - Add the word [word] to the highlight list.');
this.add('/highlight roomadd, [word] - Add the word [word] to the highlight list of whichever room you used the command in.');
this.add('/highlight list - List all words that currently highlight you.');
this.add('/highlight delete, [word] - Delete the word [word] from the highlight list.');
this.add('/highlight roomlist - List all words that currently highlight you in whichever room you used the command in.');
this.add('/highlight delete, [word] - Delete the word [word] from your entire highlight list.');
this.add('/highlight roomdelete, [word] - Delete the word [word] from the highlight list of whichever room you used the command in.');
this.add('/highlight delete - Clear the highlight list.');
return false;
case 'rank':