mirror of
https://github.com/smogon/pokemon-showdown-client.git
synced 2026-10-01 23:32:02 -05:00
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:
28
js/battle.js
28
js/battle.js
@@ -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)) + '">•</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':
|
||||
|
||||
@@ -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 + '">•</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 + '">•</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);
|
||||
|
||||
@@ -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 + '">•</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 + '">•</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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 + '">•</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 + '">•</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());
|
||||
|
||||
Reference in New Issue
Block a user