2012-02-06 22:00:24 +00:00
|
|
|
/*
|
Add ID codes for positive user identification, and minor fixups.
Users can specify an identification code when they connect (8-100 characters), only if they are using HTTPS. This code is combined with their nickname and a server-side secret, hashed with SHA-256, and condensed down to 64 bits by XORing every 8th byte with each other, and finally converted to base64 (with the trailing = removed). This code is displayed in a tooltip when hovering over the user's chat (TODO: mobile way to view it).
Sigils have been added to be displayed before the user's name in the chat. Admins get @, users with an ID code get +, and normal users get nothing. The IS_ADMIN field is now deprecated, as this can be determined from the user's sigil. It will be removed eventually, but is still being included in events even though the official client should not be using it anymore.
Kicks and bans are now always displayed to all users, even if the server isn't transmitting quit events normally.
2018-03-03 01:24:58 +00:00
|
|
|
* Copyright (c) 2012-2018, Andy Janata
|
2012-02-02 22:47:23 +00:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without modification, are permitted
|
|
|
|
* provided that the following conditions are met:
|
|
|
|
*
|
|
|
|
* * Redistributions of source code must retain the above copyright notice, this list of conditions
|
|
|
|
* and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright notice, this list of
|
|
|
|
* conditions and the following disclaimer in the documentation and/or other materials provided
|
|
|
|
* with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
|
|
|
|
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2011-12-23 02:48:20 +00:00
|
|
|
/**
|
|
|
|
* Logging functions.
|
|
|
|
*
|
2012-02-06 22:00:24 +00:00
|
|
|
* TODO make this a proper object with a singleton instance.
|
|
|
|
*
|
|
|
|
* @author Andy Janata (ajanata@socialgamer.net)
|
2011-12-23 02:48:20 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
cah.log = {};
|
|
|
|
|
2012-12-28 03:33:27 +00:00
|
|
|
/**
|
|
|
|
* "Global Chat" tab's chat log
|
|
|
|
*/
|
|
|
|
cah.log.init = function() {
|
2013-04-28 18:10:56 +01:00
|
|
|
cah.log.log = $('#tab-global .log');
|
2012-12-28 03:33:27 +00:00
|
|
|
};
|
|
|
|
|
2012-02-06 22:00:24 +00:00
|
|
|
/**
|
2013-02-24 01:19:53 +00:00
|
|
|
* Log a message to the global chat window for the user the see, always, as a status message. This
|
|
|
|
* is also used for chat. The current time is displayed with the log message, using the user's
|
|
|
|
* locale settings to determine format.
|
2012-02-06 22:00:24 +00:00
|
|
|
*
|
|
|
|
* @param {string}
|
|
|
|
* text Text to display for this message. Text is added as a TextNode, so HTML is properly
|
|
|
|
* escaped automatically.
|
2012-07-07 22:05:44 +01:00
|
|
|
* @param {string}
|
2012-02-06 22:00:24 +00:00
|
|
|
* opt_class Optional CSS class to use for this message.
|
2018-03-06 08:15:05 +00:00
|
|
|
* @param {boolean}
|
|
|
|
* opt_allow_html Allow HTML to be used.
|
|
|
|
* @param {string}
|
|
|
|
* opt_title Optional title text for span.
|
2012-02-06 22:00:24 +00:00
|
|
|
*/
|
2018-03-06 08:15:05 +00:00
|
|
|
cah.log.status = function(text, opt_class, opt_allow_html, opt_title) {
|
|
|
|
cah.log.status_with_game(null, text, opt_class, opt_allow_html, opt_title);
|
2013-02-24 01:19:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2013-02-25 02:57:04 +00:00
|
|
|
* Log a message to a single game's chat window, or the global chat window if game_id is null. This
|
2013-02-24 01:19:53 +00:00
|
|
|
* is also used to support chat.
|
2013-02-25 02:57:04 +00:00
|
|
|
*
|
2013-02-24 01:19:53 +00:00
|
|
|
* This displays the current time with the log message, using the user's locale settings to
|
|
|
|
* determine format.
|
2013-02-25 02:57:04 +00:00
|
|
|
*
|
|
|
|
* @param {Number|cah.Game}
|
|
|
|
* game_or_id ID of the game for which this message should be displayed, or the game object
|
|
|
|
* itself, or null for the global chat window.
|
2013-02-24 01:19:53 +00:00
|
|
|
* @param {string}
|
|
|
|
* text Text to display for this message. Text is added as a TextNode, so HTML is properly
|
|
|
|
* escaped automatically.
|
|
|
|
* @param {string}
|
|
|
|
* opt_class Optional CSS class to use for this message.
|
2014-08-11 06:16:15 +01:00
|
|
|
* @param {boolean}
|
|
|
|
* opt_allow_html Allow HTML to be used.
|
Add ID codes for positive user identification, and minor fixups.
Users can specify an identification code when they connect (8-100 characters), only if they are using HTTPS. This code is combined with their nickname and a server-side secret, hashed with SHA-256, and condensed down to 64 bits by XORing every 8th byte with each other, and finally converted to base64 (with the trailing = removed). This code is displayed in a tooltip when hovering over the user's chat (TODO: mobile way to view it).
Sigils have been added to be displayed before the user's name in the chat. Admins get @, users with an ID code get +, and normal users get nothing. The IS_ADMIN field is now deprecated, as this can be determined from the user's sigil. It will be removed eventually, but is still being included in events even though the official client should not be using it anymore.
Kicks and bans are now always displayed to all users, even if the server isn't transmitting quit events normally.
2018-03-03 01:24:58 +00:00
|
|
|
* @param {string}
|
|
|
|
* opt_title Optional title text for span.
|
2013-02-24 01:19:53 +00:00
|
|
|
*/
|
Add ID codes for positive user identification, and minor fixups.
Users can specify an identification code when they connect (8-100 characters), only if they are using HTTPS. This code is combined with their nickname and a server-side secret, hashed with SHA-256, and condensed down to 64 bits by XORing every 8th byte with each other, and finally converted to base64 (with the trailing = removed). This code is displayed in a tooltip when hovering over the user's chat (TODO: mobile way to view it).
Sigils have been added to be displayed before the user's name in the chat. Admins get @, users with an ID code get +, and normal users get nothing. The IS_ADMIN field is now deprecated, as this can be determined from the user's sigil. It will be removed eventually, but is still being included in events even though the official client should not be using it anymore.
Kicks and bans are now always displayed to all users, even if the server isn't transmitting quit events normally.
2018-03-03 01:24:58 +00:00
|
|
|
cah.log.status_with_game = function(game_or_id, text, opt_class, opt_allow_html, opt_title) {
|
2013-02-24 01:19:53 +00:00
|
|
|
var logElement;
|
2018-03-06 08:30:04 +00:00
|
|
|
// I think == null here would catch both of these cases and also be okay with game id 0 but...
|
|
|
|
if (game_or_id === null || game_or_id === undefined) {
|
2013-02-24 01:19:53 +00:00
|
|
|
logElement = cah.log.log;
|
2013-02-25 02:57:04 +00:00
|
|
|
} else {
|
|
|
|
var game;
|
|
|
|
if (game_or_id instanceof cah.Game) {
|
|
|
|
game = game_or_id;
|
|
|
|
} else {
|
|
|
|
game = cah.currentGames[game_or_id];
|
|
|
|
}
|
|
|
|
logElement = $(".log", game.getChatElement());
|
2013-02-24 01:19:53 +00:00
|
|
|
}
|
|
|
|
|
2012-02-06 22:00:24 +00:00
|
|
|
// TODO this doesn't work right on some mobile browsers
|
2013-02-25 02:57:04 +00:00
|
|
|
var scroll = (logElement.prop("scrollHeight") - logElement.height() - logElement
|
|
|
|
.prop("scrollTop")) <= 5;
|
2012-01-23 07:54:58 +00:00
|
|
|
|
Add ID codes for positive user identification, and minor fixups.
Users can specify an identification code when they connect (8-100 characters), only if they are using HTTPS. This code is combined with their nickname and a server-side secret, hashed with SHA-256, and condensed down to 64 bits by XORing every 8th byte with each other, and finally converted to base64 (with the trailing = removed). This code is displayed in a tooltip when hovering over the user's chat (TODO: mobile way to view it).
Sigils have been added to be displayed before the user's name in the chat. Admins get @, users with an ID code get +, and normal users get nothing. The IS_ADMIN field is now deprecated, as this can be determined from the user's sigil. It will be removed eventually, but is still being included in events even though the official client should not be using it anymore.
Kicks and bans are now always displayed to all users, even if the server isn't transmitting quit events normally.
2018-03-03 01:24:58 +00:00
|
|
|
var node;
|
|
|
|
if (opt_title) {
|
|
|
|
node = $("<span title ='" + opt_title + "'></span><br/>");
|
|
|
|
} else {
|
|
|
|
node = $("<span></span><br/>");
|
|
|
|
}
|
2014-08-11 06:16:15 +01:00
|
|
|
var full_msg = "[" + new Date().toLocaleTimeString() + "] " + text + "\n";
|
|
|
|
if (opt_allow_html) {
|
|
|
|
$(node[0]).html(full_msg);
|
|
|
|
} else {
|
|
|
|
$(node[0]).text(full_msg);
|
|
|
|
}
|
2012-01-23 07:54:58 +00:00
|
|
|
if (opt_class) {
|
|
|
|
$(node).addClass(opt_class);
|
|
|
|
}
|
2013-02-24 01:19:53 +00:00
|
|
|
logElement.append(node);
|
2013-04-20 20:21:28 +01:00
|
|
|
// only announce things in our game, or if it has a class (admin or error, likely)
|
|
|
|
if (game_or_id !== null || opt_class) {
|
|
|
|
cah.log.ariaStatus(text);
|
|
|
|
}
|
2012-01-23 07:54:58 +00:00
|
|
|
|
2011-12-25 03:38:19 +00:00
|
|
|
if (scroll) {
|
2013-02-24 01:19:53 +00:00
|
|
|
logElement.prop("scrollTop", logElement.prop("scrollHeight"));
|
2011-12-25 03:38:19 +00:00
|
|
|
}
|
2011-12-23 02:48:20 +00:00
|
|
|
};
|
|
|
|
|
2012-02-06 22:00:24 +00:00
|
|
|
/**
|
2013-03-27 03:17:49 +00:00
|
|
|
* Log a message for the user to see, always, in every tab, as an error message.
|
2012-02-06 22:00:24 +00:00
|
|
|
*
|
|
|
|
* @param {string}
|
|
|
|
* text Text to display for this message. Text is added as a TextNode, so HTML is properly
|
|
|
|
* escaped automatically.
|
|
|
|
*/
|
2011-12-23 02:48:20 +00:00
|
|
|
cah.log.error = function(text) {
|
2013-03-27 03:17:49 +00:00
|
|
|
cah.log.everyWindow("Error: " + text, "error");
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Log a message for the user to see, always, in every tab.
|
|
|
|
*
|
|
|
|
* @param {string}
|
|
|
|
* text Text to display for this message. Text is added as a TextNode, so HTML is properly
|
|
|
|
* escaped automatically.
|
|
|
|
* @param {string}
|
|
|
|
* opt_class Optional CSS class to use for this message.
|
|
|
|
*/
|
|
|
|
cah.log.everyWindow = function(text, opt_class) {
|
|
|
|
cah.log.status(text, opt_class);
|
2013-02-24 01:19:53 +00:00
|
|
|
|
|
|
|
for (game_id in cah.currentGames) {
|
|
|
|
if (cah.currentGames.hasOwnProperty(game_id)) {
|
2013-03-27 03:17:49 +00:00
|
|
|
cah.log.status_with_game(game_id, text, opt_class);
|
2013-02-24 01:19:53 +00:00
|
|
|
}
|
|
|
|
}
|
2011-12-23 02:48:20 +00:00
|
|
|
};
|
|
|
|
|
2013-04-20 20:21:28 +01:00
|
|
|
/**
|
|
|
|
* Set the text of the aria-notification element, which should cause screen readers to read this
|
|
|
|
* text.
|
|
|
|
*
|
|
|
|
* @param {string}
|
|
|
|
* text Text to read.
|
|
|
|
*/
|
|
|
|
cah.log.ariaStatus = function(text) {
|
|
|
|
// TODO we should pull this regex from the java code. it's close enough for now
|
|
|
|
var chatMatch = text.match(/<([a-zA-Z0-9_]+)> (.*)/);
|
|
|
|
if (chatMatch) {
|
|
|
|
$('#aria-notifications').text(chatMatch[1] + ' says ' + chatMatch[2]);
|
|
|
|
} else {
|
|
|
|
$('#aria-notifications').text(text);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-12-23 02:48:20 +00:00
|
|
|
/**
|
|
|
|
* Log a message if debugging is enabled, optionally dumping the contents of an object.
|
|
|
|
*
|
2012-02-06 22:00:24 +00:00
|
|
|
* If SILENT_DEBUG is on, and IE is in use, it can cause the game to break if the debugger isn't
|
|
|
|
* open...
|
|
|
|
*
|
2011-12-23 02:48:20 +00:00
|
|
|
* @param {string}
|
|
|
|
* text Text to display
|
2012-01-21 03:11:39 +00:00
|
|
|
* @param {object}
|
|
|
|
* opt_obj Optional. Object to dump along with message.
|
2011-12-23 02:48:20 +00:00
|
|
|
*/
|
|
|
|
cah.log.debug = function(text, opt_obj) {
|
2012-01-28 08:49:50 +00:00
|
|
|
if (cah.SILENT_DEBUG && console) {
|
2012-01-30 08:36:21 +00:00
|
|
|
if (console.debug) {
|
|
|
|
console.debug("[" + new Date().toLocaleTimeString() + "]", text, opt_obj);
|
|
|
|
} else if (console.log) {
|
|
|
|
console.log("[" + new Date().toLocaleTimeString() + "] " + text);
|
|
|
|
if (opt_obj) {
|
|
|
|
if (console.dir) {
|
|
|
|
console.dir(opt_obj);
|
|
|
|
} else if (JSON && JSON.stringify) {
|
|
|
|
console.log(JSON.stringify(opt_obj));
|
|
|
|
} else {
|
|
|
|
console.log("TODO: SILENT_DEBUG without console.debug, with console.log, "
|
|
|
|
+ "without console.dir, without JSON.stringify");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (console.log) {
|
|
|
|
console.log("[" + new Date().toLocaleTimeString() + "]", text, opt_obj);
|
|
|
|
}
|
2012-01-28 08:49:50 +00:00
|
|
|
}
|
2011-12-23 02:48:20 +00:00
|
|
|
if (cah.DEBUG) {
|
|
|
|
if (opt_obj) {
|
|
|
|
if (JSON && JSON.stringify) {
|
|
|
|
cah.log.debug(text + ": " + JSON.stringify(opt_obj));
|
|
|
|
} else {
|
|
|
|
cah.log.debug(text + ": TODO: debug log without JSON.stringify()");
|
|
|
|
}
|
|
|
|
} else {
|
2012-01-23 07:54:58 +00:00
|
|
|
cah.log.status("DEBUG: " + text, "debug");
|
2011-12-23 02:48:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
Add ID codes for positive user identification, and minor fixups.
Users can specify an identification code when they connect (8-100 characters), only if they are using HTTPS. This code is combined with their nickname and a server-side secret, hashed with SHA-256, and condensed down to 64 bits by XORing every 8th byte with each other, and finally converted to base64 (with the trailing = removed). This code is displayed in a tooltip when hovering over the user's chat (TODO: mobile way to view it).
Sigils have been added to be displayed before the user's name in the chat. Admins get @, users with an ID code get +, and normal users get nothing. The IS_ADMIN field is now deprecated, as this can be determined from the user's sigil. It will be removed eventually, but is still being included in events even though the official client should not be using it anymore.
Kicks and bans are now always displayed to all users, even if the server isn't transmitting quit events normally.
2018-03-03 01:24:58 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the title text to use for the given idcode, or a null if there is no idcode.
|
|
|
|
*
|
|
|
|
* @param {string}
|
|
|
|
* idcode ID code, or logical false to not have a title.
|
|
|
|
*/
|
|
|
|
cah.log.getTitleForIdCode = function(idcode) {
|
|
|
|
if (idcode) {
|
|
|
|
return "Identification code: " + idcode;
|
|
|
|
} else {
|
|
|
|
return null;
|
|
|
|
}
|
2018-03-06 08:15:05 +00:00
|
|
|
};
|