Unify chat message parsing in rooms and PMs

Most notably, this adds support for /announce and /mee in battle rooms, and /html in chat rooms.
A better user group inference is now used for PMs and chat rooms.

This is done by implementing a general Tools.parseChatMessage method.
This commit is contained in:
Ivo Julca
2015-08-05 21:07:28 -05:00
parent 1f76b447eb
commit ada7385bb4
4 changed files with 85 additions and 112 deletions

View File

@@ -5451,34 +5451,18 @@ var Battle = (function () {
break;
case 'chat':
case 'c':
name = args[1];
var name = args[1];
if (this.ignoreSpects && (name.charAt(0) === ' ' || name.charAt(0) === '+')) break;
if (this.ignoreOpponent && name.charAt(0) === '\u2605' && toUserid(name) !== app.user.get('userid')) break;
if (window.app && app.ignore && app.ignore[toUserid(name)]) break;
args.shift();
args.shift();
var clickableName;
if (!/[A-Za-z0-9 ]/.test(name.charAt(0))) {
clickableName = '<small>' + Tools.escapeHTML(name.charAt(0)) + '</small>' + Tools.escapeHTML(name.substr(1));
} else {
clickableName = Tools.escapeHTML(name);
}
var message = args.join('|');
var mine = (toUserid(name) === (app && app.user && app.user.get('userid')) ? ' mine' : '');
if (message.substr(0, 2) === '//') {
this.log('<div class="chat chatmessage-' + toId(name) + mine + '"><strong style="' + hashColor(toUserid(name)) + '">' + clickableName + ':</strong> <em>' + Tools.parseMessage(message.substr(1)) + '</em></div>', preempt);
} else if (message.substr(0, 4).toLowerCase() === '/me ') {
this.log('<div class="chat chatmessage-' + toId(name) + mine + '"><strong style="' + hashColor(toUserid(name)) + '">&bull;</strong> <em>' + clickableName + ' <i>' + Tools.parseMessage(message.substr(4)) + '</i></em></div>', preempt);
} else if (message.substr(0, 14).toLowerCase() === '/data-pokemon ') {
if (window.Chart) this.log('<div class="chat"><ul class=\"utilichart\">' + Chart.pokemonRow(Tools.getTemplate(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>', preempt);
} else if (message.substr(0, 11).toLowerCase() === '/data-item ') {
if (window.Chart) this.log('<div class="chat"><ul class=\"utilichart\">' + Chart.itemRow(Tools.getItem(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>', preempt);
} else if (message.substr(0, 14).toLowerCase() === '/data-ability ') {
if (window.Chart) this.log('<div class="chat"><ul class=\"utilichart\">' + Chart.abilityRow(Tools.getAbility(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>', preempt);
} else if (message.substr(0, 11).toLowerCase() === '/data-move ') {
if (window.Chart) this.log('<div class="chat"><ul class=\"utilichart\">' + Chart.moveRow(Tools.getMove(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>', preempt);
} else {
this.log('<div class="chat chatmessage-' + toId(name) + mine + '"><strong style="' + hashColor(toUserid(name)) + '" class="username" data-name="' + Tools.escapeHTML(name) + '">' + clickableName + ':</strong> <em>' + Tools.parseMessage(message) + '</em></div>', preempt);
var parsedMessage = Tools.parseChatMessage(message, name, '', false);
if (!$.isArray(parsedMessage)) parsedMessage = [parsedMessage];
for (var i = 0; i < parsedMessage.length; i++) {
if (!parsedMessage[i]) continue;
this.log(parsedMessage[i], preempt);
}
break;
case 'chatmsg':

View File

@@ -355,6 +355,53 @@ var Tools = {
}
return Tools.escapeHTML(formatid);
},
parseChatMessage: function (message, name, timestamp, isHighlighted) {
var showMe = !((Tools.prefs('chatformatting') || {}).hideme);
var hlClass = isHighlighted ? ' highlighted' : '';
var mineClass = (name.substr(1) === app.user.get('name') ? ' mine' : '');
var color = hashColor(toId(name));
var clickableName = '<span class="username" data-name="' + Tools.escapeHTML(name) + '">' + Tools.escapeHTML(name.substr(1)) + '</span>';
if (!/[A-Za-z0-9 ]/.test(name.charAt(0))) clickableName = '<small>' + Tools.escapeHTML(name.substr(0, 1)) + '</small>' + clickableName;
if (message.substr(0, 4) === '/me ') {
if (!showMe) return '<div class="chat chatmessage-' + toId(name) + hlClass + mineClass + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <em>' + Tools.parseMessage(message.substr(4)) + '</em></div>';
return '<div class="chat chatmessage-' + toId(name) + hlClass + mineClass + '">' + timestamp + '<strong style="' + color + '">&bull;</strong> <em>' + clickableName + ' <i>' + Tools.parseMessage(message.substr(4)) + '</i></em></div>';
} else if (message.substr(0, 5) === '/mee ') {
if (!showMe) return '<div class="chat chatmessage-' + toId(name) + hlClass + mineClass + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <em>' + Tools.parseMessage(message.substr(5)) + '</em></div>';
return '<div class="chat chatmessage-' + toId(name) + hlClass + mineClass + '">' + timestamp + '<strong style="' + color + '">&bull;</strong> <em>' + clickableName + '<i>' + Tools.parseMessage(message.substr(5)) + '</i></em></div>';
} else if (message.substr(0, 8) === '/invite ') {
var roomid = toRoomid(message.substr(8));
return [
'<div class="chat">' + timestamp + '<em>' + clickableName + ' invited you to join the room "' + roomid + '"</em></div>',
'<div class="notice"><button name="joinRoom" value="' + roomid + '">Join ' + roomid + '</button></div>'
];
} else if (message.substr(0, 10) === '/announce ') {
return '<div class="chat chatmessage-' + toId(name) + hlClass + mineClass + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <span class="message-announce">' + Tools.parseMessage(message.substr(10)) + '</span></div>';
} else if (message.substr(0, 14) === '/data-pokemon ') {
if (!window.Chart) return '';
return '<div class="message"><ul class="utilichart">' + Chart.pokemonRow(Tools.getTemplate(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>';
} else if (message.substr(0, 11) === '/data-item ') {
if (!window.Chart) return '';
return '<div class="message"><ul class="utilichart">' + Chart.itemRow(Tools.getItem(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>';
} else if (message.substr(0, 14) === '/data-ability ') {
if (!window.Chart) return '';
return '<div class="message"><ul class="utilichart">' + Chart.abilityRow(Tools.getAbility(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>';
} else if (message.substr(0, 11) === '/data-move ') {
if (!window.Chart) return '';
return '<div class="message"><ul class="utilichart">' + Chart.moveRow(Tools.getMove(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>';
} else if (message.substr(0, 6) === '/text ') {
return '<div class="chat">' + Tools.escapeHTML(message.substr(6)) + '</div>';
} else if (message.substr(0, 7) === '/error ') {
return '<div class="chat message-error">' + Tools.escapeHTML(message.substr(7)) + '</div>';
} else if (message.substr(0, 6) === '/html ') {
return '<div class="chat">' + Tools.sanitizeHTML(message.substr(6)) + '</div>';
} else {
// Normal chat message.
if (message.substr(0, 2) === '//') message = message.substr(1);
return '<div class="chat chatmessage-' + toId(name) + hlClass + mineClass + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <em>' + Tools.parseMessage(message) + '</em></div>';
}
},
parseMessage: function (str) {
str = Tools.escapeHTML(str);

View File

@@ -1340,7 +1340,6 @@
},
addChat: function (name, message, pm, deltatime) {
var userid = toUserid(name);
var color = hashColor(userid);
if (app.ignore[userid] && (name.charAt(0) === ' ' || name.charAt(0) === '+')) return;
@@ -1352,7 +1351,7 @@
'join': [],
'leave': []
};
var clickableName = '<span class="username" data-name="' + Tools.escapeHTML(name) + '">' + Tools.escapeHTML(name.substr(1)) + '</span>';
var isHighlighted = false;
if (!pm && userid !== app.user.get('userid')) {
// PMs already notify in the main menu; no need to make them notify again
@@ -1364,52 +1363,30 @@
this.subtleNotifyOnce();
}
}
var highlight = isHighlighted ? ' highlighted' : '';
var chatDiv = '<div class="chat chatmessage-' + toId(name) + highlight + (name.substr(1) === app.user.get('name') ? ' mine' : '') + '">';
var timestamp = ChatRoom.getTimestamp('lobby', deltatime);
if (name.charAt(0) !== ' ') clickableName = '<small>' + Tools.escapeHTML(name.charAt(0)) + '</small>' + clickableName;
var self = this;
var outputChat = function () {
var coloredName = (name.substr(1) ? '<strong style="' + color + '">' + clickableName + ':</strong>' : '');
self.$chat.append(chatDiv + timestamp + coloredName + ' <em>' + Tools.parseMessage(message) + '</em></div>');
};
var showme = !((Tools.prefs('chatformatting') || {}).hideme);
if (pm) {
var pmuserid = toUserid(pm);
var oName = pm;
if (pmuserid === app.user.get('userid')) oName = name;
this.$chat.append('<div class="chat chatmessage-' + toId(name) + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <span class="message-pm"><i class="pmnote" data-name="' + Tools.escapeHTML(oName) + '">(Private to ' + Tools.escapeHTML(pm) + ')</i> ' + Tools.parseMessage(message) + '</span></div>');
} else if (message.substr(0, 4) === '/me ') {
message = message.substr(4);
if (showme) {
this.$chat.append(chatDiv + timestamp + '<strong style="' + color + '">&bull;</strong> <em>' + clickableName + ' <i>' + Tools.parseMessage(message) + '</i></em></div>');
} else {
outputChat();
}
Storage.logChat(this.id, '* ' + name + ' ' + message);
} else if (message.substr(0, 5) === '/mee ') {
message = message.substr(5);
if (showme) {
this.$chat.append(chatDiv + timestamp + '<strong style="' + color + '">&bull;</strong> <em>' + clickableName + '<i>' + Tools.parseMessage(message) + '</i></em></div>');
} else {
outputChat();
}
Storage.logChat(this.id, '* ' + name + message);
} else if (message.substr(0, 10) === '/announce ') {
this.$chat.append(chatDiv + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <span class="message-announce">' + Tools.parseMessage(message.substr(10)) + '</span></div>');
Storage.logChat(this.id, '' + name + ': /announce ' + message);
} else if (message.substr(0, 14) === '/data-pokemon ') {
this.$chat.append('<div class="message"><ul class="utilichart">' + Chart.pokemonRow(Tools.getTemplate(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 11) === '/data-item ') {
this.$chat.append('<div class="message"><ul class="utilichart">' + Chart.itemRow(Tools.getItem(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 14) === '/data-ability ') {
this.$chat.append('<div class="message"><ul class="utilichart">' + Chart.abilityRow(Tools.getAbility(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 11) === '/data-move ') {
this.$chat.append('<div class="message"><ul class="utilichart">' + Chart.moveRow(Tools.getMove(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else {
// Normal chat message.
if (message.substr(0, 2) === '//') message = message.substr(1);
outputChat();
var oName = pmuserid === app.user.get('userid') ? name : pm;
var clickableName = '<span class="username" data-name="' + Tools.escapeHTML(name) + '">' + Tools.escapeHTML(name.substr(1)) + '</span>';
this.$chat.append(
'<div class="chat chatmessage-' + toId(name) + '">' + ChatRoom.getTimestamp('lobby', deltatime) +
'<strong style="' + hashColor(userid) + '">' + clickableName + ':</strong>' +
'<span class="message-pm"><i class="pmnote" data-name="' + Tools.escapeHTML(oName) + '">(Private to ' + Tools.escapeHTML(pm) + ')</i> ' + Tools.parseMessage(message) + '</span>' +
'</div>'
);
return;
}
var parsedMessage = Tools.parseChatMessage(message, name, ChatRoom.getTimestamp('lobby', deltatime), isHighlighted);
if (!$.isArray(parsedMessage)) parsedMessage = [parsedMessage];
for (var i = 0; i < parsedMessage.length; i++) {
if (!parsedMessage[i]) continue;
this.$chat.append(parsedMessage[i]);
}
if (message.substr(0, 4) === '/me ' || message.substr(0, 5) === '/mee') {
Storage.logChat(this.id, '* ' + name + (message.substr(0, 4) === '/me ' ? ' ' : '') + message);
} else if (message.substr(0, 10) === '/announce ' || message.substr(0, 1) !== '/') {
Storage.logChat(this.id, '' + name + ': ' + message);
}
}

View File

@@ -119,58 +119,23 @@
app.curSideRoom.addPM(name, message, target);
}
var oName = name;
if (toId(name) === app.user.get('userid')) {
oName = target;
} else {
this.notifyOnce("PM from " + oName, "\"" + message + "\"", 'pm');
}
var isSelf = (toId(name) === app.user.get('userid'));
var oName = isSelf ? target : name;
Storage.logChat('pm-' + toId(oName), '' + name + ': ' + message);
var $pmWindow = this.openPM(oName, true);
var $chatFrame = $pmWindow.find('.pm-log');
var $chat = $pmWindow.find('.inner');
var autoscroll = false;
if ($chatFrame.scrollTop() + 60 >= $chat.height() - $chatFrame.height()) {
autoscroll = true;
}
var timestamp = ChatRoom.getTimestamp('pms');
var color = hashColor(toId(name));
var clickableName = '<span class="username" data-name="' + Tools.escapeHTML(name) + '">' + Tools.escapeHTML(name.substr(1)) + '</span>';
if (name.substr(0, 1) !== ' ') clickableName = '<small>' + Tools.escapeHTML(name.substr(0, 1)) + '</small>' + clickableName;
var autoscroll = ($chatFrame.scrollTop() + 60 >= $chat.height() - $chatFrame.height());
if (message.substr(0, 4) === '/me ') {
$chat.append('<div class="chat chatmessage-' + toId(name) + (name.substr(1) === app.user.get('name') ? ' mine' : '') + '">' + timestamp + '<strong style="' + color + '">&bull;</strong> <em>' + clickableName + ' <i>' + Tools.parseMessage(message.substr(4)) + '</i></em></div>');
} else if (message.substr(0, 5) === '/mee ') {
$chat.append('<div class="chat chatmessage-' + toId(name) + (name.substr(1) === app.user.get('name') ? ' mine' : '') + '">' + timestamp + '<strong style="' + color + '">&bull;</strong> <em>' + clickableName + '<i>' + Tools.parseMessage(message.substr(5)) + '</i></em></div>');
} else if (message.substr(0, 8) === '/invite ') {
var roomid = toRoomid(message.substr(8));
$chat.append('<div class="chat">' + timestamp + '<em>' + clickableName + ' invited you to join the room "' + roomid + '"</em></div>');
$chat.append('<div class="notice"><button name="joinRoom" value="' + roomid + '">Join ' + roomid + '</button></div>');
} else if (message.substr(0, 10) === '/announce ') {
$chat.append('<div class="chat chatmessage-' + toId(name) + (name.substr(1) === app.user.get('name') ? ' mine' : '') + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <span class="message-announce">' + Tools.parseMessage(message.substr(10)) + '</span></div>');
} else if (message.substr(0, 14) === '/data-pokemon ') {
$chat.append('<div class="message"><ul class="utilichart">' + Chart.pokemonRow(Tools.getTemplate(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 11) === '/data-item ') {
$chat.append('<div class="message"><ul class="utilichart">' + Chart.itemRow(Tools.getItem(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 14) === '/data-ability ') {
$chat.append('<div class="message"><ul class="utilichart">' + Chart.abilityRow(Tools.getAbility(message.substr(14)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 11) === '/data-move ') {
$chat.append('<div class="message"><ul class="utilichart">' + Chart.moveRow(Tools.getMove(message.substr(11)), '', {}, false, true) + '<li style=\"clear:both\"></li></ul></div>');
} else if (message.substr(0, 6) === '/text ') {
$chat.append('<div class="chat">' + Tools.escapeHTML(message.substr(6)) + '</div>');
} else if (message.substr(0, 7) === '/error ') {
$chat.append('<div class="chat message-error">' + Tools.escapeHTML(message.substr(7)) + '</div>');
} else if (message.substr(0, 6) === '/html ') {
$chat.append('<div class="chat">' + Tools.sanitizeHTML(message.substr(6)) + '</div>');
} else {
// Normal chat message.
if (message.substr(0, 2) === '//') message = message.substr(1);
$chat.append('<div class="chat chatmessage-' + toId(name) + (name.substr(1) === app.user.get('name') ? ' mine' : '') + '">' + timestamp + '<strong style="' + color + '">' + clickableName + ':</strong> <em>' + Tools.parseMessage(message) + '</em></div>');
var parsedMessage = Tools.parseChatMessage(message, name, ChatRoom.getTimestamp('pms'));
if (!$.isArray(parsedMessage)) parsedMessage = [parsedMessage];
for (var i = 0; i < parsedMessage.length; i++) {
if (!parsedMessage[i]) continue;
$chat.append(parsedMessage[i]);
}
if (!isSelf) this.notifyOnce("PM from " + name, "\"" + message + "\"", 'pm');
if (autoscroll) {
$chatFrame.scrollTop($chat.height());