\r\n" +
' ';
$("#standingsTableMonstrous").html(decoded);
}
});
}
};
//
// XHR that can cross same origin policy boundaries
//
function GM_XHR() {
this.type = null;
this.url = null;
this.async = null;
this.username = null;
this.password = null;
this.status = null;
this.headers = {};
this.readyState = null;
this.abort = function() { this.readyState = 0; };
this.getAllResponseHeaders = function(name) { return this.readyState != 4 ? "" : this.responseHeaders; };
this.getResponseHeader = function(name) {
var regexp = new RegExp('^'+name+': (.*)$','im');
var match = regexp.exec(this.responseHeaders);
if (match) { return match[1]; }
return '';
};
this.open = function(type, url, async, username, password) {
this.type = type ? type : null;
this.url = url ? url : null;
this.async = async ? async : null;
this.username = username ? username : null;
this.password = password ? password : null;
this.readyState = 1;
};
this.setRequestHeader = function(name, value) { this.headers[name] = value; };
this.send = function(data) {
this.data = data;
var that = this;
GM_xmlhttpRequest({
method: this.type,
url: this.url,
headers: this.headers,
data: this.data,
onload: function(rsp) { for (var k in rsp) { that[k] = rsp[k]; } that.onreadystatechange(); },
onerror: function(rsp) { for (var k in rsp) { that[k] = rsp[k]; } }
});
};
};
var standingsInterval = 0;
function startStandings() {
stopStandings();
standingsInterval = setInterval(grabStandings, 120000);
grabStandings();
}
function stopStandings() {
if (standingsInterval){
clearInterval(standingsInterval);
standingsInterval = 0;
}
}
function updateChannels()
{
// Sort the channels
var channels = [];
for(var channel in activeChannelsCounts){
if (activeChannelsCounts[channel] > 1){
channels.push(channel);
}
}
channels.sort(function(a,b) {return activeChannelsCounts[b] - activeChannelsCounts[a];});
// Build the table
var html = "
\r\n" +
"\r\n" +
"
#
Channel Name
Join Channel
\r\n" +
"\r\n" +
"\r\n";
var limit = 50;
if (channels.length < limit)
limit = channels.length;
for (var i = 0; i < limit; i++) {
html += "
" + (i+1) + "
" + channels[i] + "
Join Channel
\r\n";
}
html += "\r\n" +
"
\r\n" +
' ';
$("#activeChannelsTable").html(html);
$(".channelBtn").on("click", function joinChannel() {
var channel = $(this).parent().prev().contents().text();
var channels = getChannelList();
if (channel && $.inArray(channel, channels) < 0) {
settings.channel += "," + channel;
Settings.save(settings);
buildDropdown();
resetChannels();
}
});
}
var channelsInterval = 0;
function startChannels() {
stopChannels();
channelsInterval = setInterval(updateChannels, 30000);
updateChannels();
}
function stopChannels() {
if (channelsInterval){
clearInterval(channelsInterval);
channelsInterval = 0;
}
}
var currentUsersName = $('div#header span.user a').html();
// Settings begin
var $robinVoteWidget = $("#robinVoteWidget");
// IF the widget isn't there, we're probably on a reddit error page.
if (!$robinVoteWidget.length) {
// Don't overload reddit, wait a bit before reloading.
setTimeout(function() {
window.location.reload();
}, 300000);
return;
}
// Get version string (if available from script engine)
var versionString = "";
if (typeof GM_info !== "undefined") {
versionString = GM_info.script.version;
}
Settings.setupUI($robinVoteWidget);
var settings = Settings.load();
var userExtra = UserExtra.load();
startUserExtra();
function tryStoreUserExtra(){
console.log("storing lastseens");
UserExtra.save(userExtra);
}
var userExtraInterval = 0;
function startUserExtra() {
userExtraInterval = setInterval(listAllUsers, 10*1000);
userExtraInterval = setInterval(tryStoreUserExtra, 20*1000);
}
// bootstrap
tryHide();
// Options begin
Settings.addButton("settingContent", "update-script-button", "Update Parrot", function(){ window.open("https://github.com/5a1t/parrot/raw/master/robin.user.js?t=" + (+ new Date()), "_blank"); });
Settings.addButton("robinChatInput", "clear-chat-button", "Clear Chat", clearChat);
Settings.addBool("hideVote", "Hide voting panel", false, tryHide);
Settings.addBool("removeSpam", "Remove bot spam", true);
Settings.addInput("spamFilters", "", "spam example 1,John Madden");
Settings.addBool("enableUnicode", "Allow unicode characters. Unicode is considered spam and thus are filtered out", false);
Settings.addBool("sidebarPosition", "Left sidebar", false, toggleSidebarPosition);
Settings.addBool("force_scroll", "Force scroll to bottom", false);
Settings.addInput("cipherkey", "16 Character Cipher Key", "Example128BitKey");
Settings.addInput("maxprune", "Max messages before pruning", "500");
Settings.addBool("tableMode", "Toggle table-mode for the message list", false, toggleTableMode);
Settings.addInput("fontsize", "Chat font size", "12");
Settings.addInput("fontstyle", "Font Style (default Consolas)", "");
Settings.addBool("alignment", "Right align usernames", true);
Settings.addInput("username_bg", "Custom background color on usernames", "");
Settings.addBool("removeRobinMessages", "Hide [robin] messages everywhere", false, setRobinMessageVisibility);
Settings.addBool("removeChanMessageFromGlobal", "Hide channel messages in Global", false);
Settings.addBool("filterChannel", "Hide non-channel messages in Global", false, function() { buildDropdown(); });
Settings.addInput("channel", "", "%parrot", function() { buildDropdown(); resetChannels(); });
Settings.addInput("channel_exclude", "", "");
Settings.addBool("tabChanColors", "Use color on channel tabs", true);
Settings.addBool("twitchEmotes", "Twitch emotes (Normal, BTTV)", false);
Settings.addBool("youtubeVideo", "Inline youtube videos", false);
Settings.addBool("timeoutEnabled", "Reload page after inactivity timeout", true);
Settings.addInput("messageHistorySize", "Sent Message History Size", "50");
Settings.addBool("monstrousStats", "Show automated leaderboard on standings page (asks for permission)", false);
Settings.addBool("reportStats", "Contribute statistics to the Automated Leaderboard.", true);
Settings.addInput("statReportingInterval", "Report Statistics Interval (seconds) [above needs to be checked]", "300");
Settings.addInput("leaderboard_current_color", "Highlight color of current chat room in leaderboard standings", '#22bb45');
Settings.addBool("enableTabComplete", "Tab Autocomplete usernames", true);
Settings.addBool("enableQuickTabNavigation", "Keyboard channel-tabs navigation", true);
Settings.addBool("enableAdvancedNaviOptions", "Keyboard navigation key remapping. Use custom settings below for switching channels instead:", false, function(){
$('input[name^=setting-quickTabNavi]').prop('disabled',!$('input[name=setting-enableAdvancedNaviOptions]').prop('checked'));
});
Settings.addBool("quickTabNaviCtrlRequired", "Ctrl", true);
Settings.addBool("quickTabNaviShiftRequired", "Shift", false);
Settings.addBool("quickTabNaviAltRequired", "Alt", true);
Settings.addBool("quickTabNaviMetaRequired", "Meta", false);
Settings.addInput("quickTabNaviKeyLeft", "Key codes: Left = 37, Up = 38, Right = 39, Down = 40. See Mozilla.org's documentation for more key codes.
Navigate left tab final key code","37");
Settings.addInput("quickTabNaviKeyRight", "Navigate right tab final key code","39");
$('input[name^=setting-quickTabNavi]').prop('disabled',!settings.enableAdvancedNaviOptions);
$("#settingContent").append("
");
// Room tab event
var tab = $("#robinChannelLink-ch" + i);
tab.on("click", function() { selectChannel($(this).attr("href")); });
}
toggleTableMode();
selectChannel("");
}
function selectChannel(channelLinkId)
{
// Get channel index
var channelIndex = -1;
if ((typeof channelLinkId) == 'string' && channelLinkId.length > 8) {
channelIndex = channelLinkId.substring(8);
}
if((typeof channelLinkId) == 'number') {
channelIndex = channelLinkId;
}
$("#chat-prepend-select").val($("#robinChannelLink-ch" + (channelIndex >= 0 ? channelIndex : "") ).html());
// Remember selection
selectedChannel = channelIndex;
// Show/hide channel drop-down
if (channelIndex >= 0)
$("#chat-prepend-area").css("display", "none");
else
$("#chat-prepend-area").css("display", "");
// Update tab selection
for (i = -1; i < channelList.length; i++)
setChannelSelected(getChannelTab(i), getChannelMessageList(i), channelIndex == i);
updateTextCounter();
}
function markChannelChanged(index)
{
if (index != selectedChannel)
getChannelTab(index).attr("class", "robin-chan-tab-changed");
}
function setChannelSelected(tab, box, select)
{
if (select)
{
tab.attr("class", "robin-chan-tab-selected");
box.css("display", "");
doScroll();
}
else
{
if (tab.attr("class") == "robin-chan-tab-selected")
tab.attr("class", "");
box.css("display", "none");
}
}
function getChannelTab(index)
{
if (index == -1) return $("#robinChannelLink");
return $("#robinChannelLink-ch" + index);
}
function getChannelMessageList(index)
{
if (index == -1) return $("#robinChatMessageList");
return $("#robinChatMessageList-ch" + index);
}
function convertTextToSpecial(messageText, elem)
{
urlRegex.lastIndex = 0;
if (urlRegex.test(messageText)) {
urlRegex.lastIndex = 0;
var url = encodeURI(urlRegex.exec(messageText)[0]);
var parsedUrl = url.replace(/^/, ""+url+"");
var oldHTML = $(elem).find('.robin-message--message').html();
var newHTML = oldHTML.replace(url, parsedUrl);
$(elem).find('.robin-message--message').html(newHTML);
}
if (settings.twitchEmotes){
var split = messageText.split(' ');
var changes = false;
for (var i=0; i < split.length; i++) {
var key = (split[i]).toLowerCase();
if(emotes.hasOwnProperty(key)){
split[i] = "";
changes = true;
}
if(bttvEmotes.hasOwnProperty(key)){
split[i] = "";
changes = true;
}
}
if (changes) {
$(elem).find('.robin-message--message').html(split.join(' '));
}
}
// TODO this can support vine videos too
if (settings.youtubeVideo) {
var matches = messageText.match(youtubeRegex);
if (!matches || matches[1].length !== 11) return;
var youtubeId = matches[1];
$videoContainer = $("
");
$(elem).find('.robin-message--message').append($videoContainer);
$videoContainer.find(".press-play").on("click", function() {
$(this).off();
var youtubeId = $(this).val();
var youtubeURL = "//www.youtube.com/embed/" + youtubeId + "?autoplay=1&autohide=1&enablejsapi=1";
var iframe = "";
$(this).parent().html(iframe);
});
}
}
function moveChannelMessage(channelIndex, message, overrideBGColor, isChanMessage)
{
var channel = getChannelMessageList(channelIndex);
var messageCopy = message;
if (isChanMessage && !settings.removeChanMessageFromGlobal)
messageCopy = messageCopy.cloneNode(true);
var messageElem = $(messageCopy.children && messageCopy.children[2]);
var messageText = messageElem.text();
// Remove channel name from channel messages
if (messageText.startsWith(channelList[channelIndex]))
{
messageText = messageText.substring(channelList[channelIndex].length).trim();
messageElem.text(messageText);
}
// Remove channel colour from channel messages
if (!overrideBGColor) {
if (!settings.tabChanColors) {
messageElem.parent().css("background", "");
}
}
convertTextToSpecial(messageText, messageCopy);
channel.append(messageCopy);
markChannelChanged(channelIndex);
}
function doScroll()
{
if (GOTO_BOTTOM || settings.force_scroll) {
robinChatWindow.scrollTop(robinChatWindow[0].scrollHeight);
}
}
//
// Get selected destination channel for messages
//
function selChanName()
{
if (selectedChannel >= 0)
return channelList[selectedChannel];
return dropdownChannel();
}
function updateTextCounter()
{
var chanPrefix = selChanName();
if (chanPrefix.length > 0)
chanPrefix += " ";
var maxLength = 140 - chanPrefix.length;
var $robinMessageText = $("#robinMessageText");
var message = $robinMessageText.val();
var messageLength = message.length;
// small channel names with a full message body switched to a long channel name
// cause robinMessageText to overflow out of bounds
// this truncates the message to the limit
if (messageLength > maxLength) {
message = message.substr(0, maxLength);
$robinMessageText.val(message);
}
// subtract the channel prefix from the maxLength
$("#robinMessageText").attr('maxLength', maxLength);
$("#textCounterDisplayAlt").text(String(Math.max(maxLength - message.length), 0));
}
var pastMessageQueue = [];
var pastMessageQueueIndex = 0;
var pastMessageTemp = "";
function updatePastMessageQueue(message)
{
pastMessageQueueIndex = 0;
pastMessageTemp = "";
var value = message;
if (!value || (pastMessageQueue.length > 0 && value == pastMessageQueue[0]))
return;
pastMessageQueue.unshift(value);
var maxhistorysize = parseInt(settings.messageHistorySize || "50", 10);
if (maxhistorysize < 0 || isNaN(maxhistorysize)) {
maxhistorysize = 50;
}
while (pastMessageQueue.length > maxhistorysize) {
pastMessageQueue.pop();
}
}
function onMessageBoxSubmit()
{
var chanName = selChanName();
var message = $("#robinMessageText").val();
var dest = $("#robinMessageText");
if(message.indexOf("@cipher") == 0 || message.indexOf("@c") == 0) {
var encryption_cue = message.indexOf("@cipher") == 0 ? "@cipher" : "@c";
var mes2 = "88z48" + $.trim(message.substr(encryption_cue.length));
var key = aesjs.util.convertStringToBytes(String(settings['cipherkey']));
var textBytes = aesjs.util.convertStringToBytes(mes2);
var aesCtr = new aesjs.ModeOfOperation.ctr(key);
var encryptedBytes = aesCtr.encrypt(textBytes);
var result = "";
for (index = 0; index 0)
chanPrefix += " ";
if (message.startsWith("/me "))
dest.val("/me " + chanPrefix + message.substring(4));
else if (message.startsWith("/"))
dest.val(message);
else
dest.val(chanPrefix + message);
updateTextCounter();
}
updatePastMessageQueue(message);
setTimeout(updateTextCounter, 50);
}
function onMessageBoxKeyUp(e)
{
var key = e.keyCode ? e.keyCode : e.charCode;
key = key || e.which;
if (key != 38 && key != 40)
return;
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
var source = $("#robinMessageText").val();
var chanName = selChanName();
var namePart = "";
// Up Arrow - Message History
if (key == 38 && pastMessageQueue.length > pastMessageQueueIndex) {
if (pastMessageQueueIndex === 0) {
pastMessageTemp = source;
}
source = pastMessageQueue[pastMessageQueueIndex++];
}
// Down Arrow - Message History
else if (key == 40 && pastMessageQueueIndex > 0) {
pastMessageQueueIndex--;
if (pastMessageQueueIndex === 0) {
source = pastMessageTemp;
} else {
source = pastMessageQueue[pastMessageQueueIndex - 1];
}
}
$("#robinMessageText").val(source);
updateTextCounter();
}
// Monitor the most active channels.
var activeChannelsQueue = [];
var activeChannelsCounts = {};
function updateMostActiveChannels(messageText)
{
var chanName = messageText;
if (!chanName)
return;
// To simplify things, we're going to start by only handling channels that start with punctuation.
if (!chanName.match(/^[!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\]\^_`{|}~]/))
return;
var index = chanName.indexOf("");
if (index >= 0)
chanName = chanName.substring(0, index);
index = chanName.indexOf("em:");
if (index >= 0)
chanName = chanName.substring(0, index);
index = chanName.indexOf(" ");
if (index >= 0)
chanName = chanName.substring(0, index);
if (!chanName || chanName == messageText)
return;
chanName = chanName.toLowerCase();
activeChannelsQueue.unshift(chanName);
if (!activeChannelsCounts[chanName]) {
activeChannelsCounts[chanName] = 0;
}
activeChannelsCounts[chanName]++;
if (activeChannelsQueue.length > 2000){
var oldChanName = activeChannelsQueue.pop();
activeChannelsCounts[oldChanName]--;
}
}
$('.robin-chat--header').click(function() {
$(".robin-chat--sidebar").toggleClass("sidebarminimized");
});
var myObserver = new MutationObserver(mutationHandler);
//--- Add a target node to the observer. Can only add one node at a time.
// XXX Shou: we should only need to watch childList, more can slow it down.
$("#robinChatMessageList").each(function() {
myObserver.observe(this, { childList: true });
});
var counter=0.0;
var countdown=0;
function mutationHandler(mutationRecords) {
mutationRecords.forEach(function(mutation) {
var jq = $(mutation.addedNodes);
// There are nodes added
if (jq.length > 0) {
var colors_match = {};
split_channels = getChannelString().toLowerCase().split(",");
for(i = 0; i < split_channels.length; i++){
colors_match[split_channels[i].trim()] = colors[i];
}
// cool we have a message.
var $timestamp = $(jq[0]).find('.robin-message--timestamp');
var $user = $(jq[0]).find('.robin--username');
if(! $user.length) {
$timestamp.after('');
$user = $(jq[0]).find('.robin--username');
}
var thisUser = $user.text();
var $message = $(jq[0]).find('.robin-message--message');
var messageText = $message.text();
// Decryption
var chanName = hasChannel(messageText).name;
if (messageText.indexOf(chanName + "em:") == 0) {
var plainMessage = "";
for (index = (chanName + "em:").length; index < messageText.length; index += 2)
plainMessage += ((plainMessage.length > 0 ? "," : "") + messageText.substring(index, index + 2).replace("A", ""));
var key = aesjs.util.convertStringToBytes(String(settings['cipherkey']));
var aesCtr = new aesjs.ModeOfOperation.ctr(key);
var hexList = plainMessage.split(",");
var textBytes = hexList.map(function (x) {
return parseInt(x, 36);
});
console.log("textbytes: " + textBytes.toString());
var decryptedBytes = aesCtr.decrypt(textBytes);
// Convert our bytes back into text
var decryptedText = aesjs.util.convertBytesToString(decryptedBytes);
messageText = messageText.replace(textBytes, decryptedText);
var special = "88z48";
if(decryptedText.indexOf(special) == -1){
$message = null;
$(jq[0]).remove();
}
else {
$(jq[0]).find('.robin-message--message').text(chanName+" "+decryptedText.substring(5));
messageText = $message.text();
}
if (decryptedText.substring(5).toLowerCase().indexOf(currentUsersName.toLowerCase()) !== -1) {
$message.parent().css("background","#FFA27F");
notifAudio.play();
userIsMentioned = true;
}
else {
//still show mentions in highlight color.
var result = hasChannel(decryptedText.substring(5), getChannelString());
if(result.has) {
$message.parent().css("background", colors_match[result.name]);
}
else {
var is_not_in_channels = (settings.filterChannel &&
!jq.hasClass('robin--user-class--system') &&
String(getChannelString()).length > 0 &&
!results_chan.has);
if (is_not_in_channels) {
$message = null;
$(jq[0]).remove();
return;
}
}
}
}
var is_muted = (thisUser && mutedList.indexOf(thisUser) >= 0);
var is_spam = (settings.removeSpam && isBotSpam(messageText));
var remove_message = is_muted || is_spam;
if (!remove_message) {
updateMostActiveChannels(messageText);
}
datenow = new Date();
userExtra[$user.text()] = datenow;
//updateUserPanel();
var exclude_list = String(settings.channel_exclude).split(",");
var results_chan_exclusion = hasChannelFromList(messageText, exclude_list, true, true);
if (exclude_list.length > 0, String(settings.channel_exclude).trim().length > 0 && results_chan_exclusion.has) {
$message = null;
$(jq[0]).remove();
return;
}
if (String(settings['username_bg']).length > 0) {
$user.css("background", String(settings['username_bg']));
}
if (settings['tableMode'] && settings['alignment']) {
$user.addClass('robin--username-align-right');
}
var alignedUser = settings['alignment'] ? $user.html().lpad(' ', 20) : $user.html().rpad(' ', 20);
$user.html( (!settings['tableMode'] ? alignedUser : $user.html()) );
var stylecalc = "";
if (settings.fontstyle !== ""){
stylecalc = '"'+settings.fontstyle.trim()+'"' + ",";
}
stylecalc = stylecalc + 'Consolas, "Lucida Console", Monaco, monospace';
$user.css("font-family", stylecalc).css("font-size", settings.fontsize+"px");
$message.css("font-family", stylecalc).css("font-size", settings.fontsize+"px");
var results_chan = hasChannel(messageText);
var nextIsRepeat = jq.hasClass('robin--user-class--system') && messageText.indexOf("try again") >= 0;
if (nextIsRepeat) {
var messageText = jq.next().find(".robin-message--message").text();
var chanName = selChanName();
if (messageText.toLowerCase().startsWith(chanName.toLowerCase()))
messageText = messageText.substring(chanName.length).trim();
$("#robinMessageText").val(messageText);
updateTextCounter();
}
remove_message = remove_message && !jq.hasClass("robin--user-class--system");
if (remove_message) {
$message = null;
$(jq[0]).remove();
return;
}
var userIsMentioned = false;
if (messageText.toLowerCase().indexOf(currentUsersName.toLowerCase()) !== -1) {
$message.parent().css("background","#FFA27F");
notifAudio.play();
userIsMentioned = true;
} else {
//still show mentions in highlight color.
var result = hasChannel(messageText);
if(result.has) {
$message.parent().css("background", colors_match[result.name]);
} else {
var is_not_in_channels = (settings.filterChannel &&
!jq.hasClass('robin--user-class--system') &&
String(getChannelString()).length > 0 &&
!results_chan.has);
if (is_not_in_channels) {
$message = null;
$(jq[0]).remove();
return;
}
}
}
if (thisUser.indexOf("[robin]") !=-1){
if ($message.text().indexOf("RATELIMIT") != -1){
var rltime = $.trim($message.text().substr(54));
rltime = parseInt(rltime.substring(0, rltime.indexOf(' ')))+1;
if (rltime>10)rltime=1;
console.log(rltime.toString());
countdown=rltime;
}
}
// Move channel messages to channel tabs
if (results_chan.has)
moveChannelMessage(results_chan.index, jq[0], userIsMentioned, true);
if (selectedChannel >= 0 && thisUser.trim() == '[robin]')
moveChannelMessage(selectedChannel, jq[0], false, false);
if (!results_chan.has || !settings.removeChanMessageFromGlobal)
markChannelChanged(-1);
// If user is [robin], then we should only add the channel prefix if we're in
// the Global channel.
if (!settings.removeChanMessageFromGlobal && (thisUser.indexOf("[robin]") ==-1 || selectedChannel == -1))
{
if (results_chan.has) {
messageText = messageText.substring(results_chan.name.length).trim();
$message.text(messageText);
}
// This needs to be done after any changes to the $message.text() since they will overwrite $message.html() changes
convertTextToSpecial(messageText, jq[0]);
$("" + (!settings.tableMode ? results_chan.name.lpad(" ", 6) : results_chan.name ) + "").css("font-family", '"Lucida Console", Monaco, monospace')
.css("font-size", "12px")
.insertAfter($timestamp);
}
findAndHideSpam();
doScroll();
}
});
}
function countTimer() {
counter += 0.5;
if (countdown % 1 == 0 && countdown != 0) {
$('#sendBtn').css('background-color', '#FF5555');
} else {
$('#sendBtn').css('background-color', '');
}
if (countdown > 1 ) {
countdown -= 0.5;
$('#sendBtn').html("Chat in: " + parseInt(countdown));
} else if (countdown == 1) {
$('#sendBtn').html("Send Message");
countdown = 0;
}
}
setInterval(update, 10000);
update();
setInterval(countTimer, 500);
var flairColor = [
'#e50000', // red
'#db8e00', // orange
'#ccc100', // yellow
'#02be01', // green
'#0083c7', // blue
'#820080' // purple
];
function colorFromName(name) {
sanitizedName = name.toLowerCase().replace(/[^a-z0-9]/g, "");
flairNum = parseInt(sanitizedName, 36) % 6;
return flairColor[flairNum];
}
// Initial pass to color names in user list
$('#robinUserList').find('.robin--username').each(function(){
this.style.color = colorFromName(this.textContent);
});
// When a user's status changes, they are removed from the user list and re-added with new status classes,
// so here we watch for names being added to the user list to re-color
var myUserListObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length > 0) {
var usernameSpan = mutation.addedNodes[0].children[1];
// This may need to be fixed. Until then, I'm adding this if statement to prevent errors flooding the console.
if (usernameSpan) {
usernameSpan.style.color = colorFromName(usernameSpan.innerHTML);
}
}
});
});
myUserListObserver.observe(document.getElementById("robinUserList"), { childList: true });
// Color current user's name in chat and darken post backgrounds
var currentUserColor = colorFromName(currentUsersName);
$('').appendTo('body');
$(".text-counter-input").attr("id", "robinMessageText");
$("#robinMessageText").on("input", function() { updateTextCounter(); });
$("#robinMessageText").on("keyup", function(e) { onMessageBoxKeyUp(e); });
$(".text-counter-display")
.css("display", "none")
.after('140');
// Send message button
$("#robinSendMessage").append('
Send Message
'); // Send message
// Submit message by pressing enter
$("#robinSendMessage").on("submit", function() { onMessageBoxSubmit(); } );
// Submit message by clicking button
$("#robinSendMessage").append('');
$("#sendBtn").on("click", function() { onMessageBoxSubmit(); $("#sendBtnHidden").trigger('click'); } );
// Setup page for tabbed channels
setupMultiChannel();
$('#robinChatWindow').scroll(function() {
if(robinChatWindow.scrollTop() < robinChatWindow[0].scrollHeight - robinChatWindow.height()) {
GOTO_BOTTOM = false;
return;
}
GOTO_BOTTOM = true;
});
$(document).keydown(function(e) {
if (!settings.enableQuickTabNavigation) return; // Is quicknav enabled
//console.log(e.keyCode);
var lKeycode = 37;
var rKeycode = 39; // set the keycodes to default
if (settings.enableAdvancedNaviOptions) { // are we using advanced settings
if (( settings.quickTabNaviCtrlRequired && !e.ctrlKey) ||
(!settings.quickTabNaviCtrlRequired && e.ctrlKey))
return;
if (( settings.quickTabNaviAltRequired && !e.altKey) ||
(!settings.quickTabNaviAltRequired && e.altKey))
return;
if (( settings.quickTabNaviShiftRequired && !e.shiftKey) ||
(!settings.quickTabNaviShiftRequired && e.shiftKey))
return;
if (( settings.quickTabNaviMetaRequired && !e.metaKey) ||
(!settings.quickTabNaviMetaRequired && e.metaKey))
return;
lKeycode = settings.quickTabNaviKeyLeft; // if we made it this far set the new keycodes
rKeycode = settings.quickTabNaviKeyRight;
}
else { // using original keycodes
if (!((e.metaKey || e.ctrlKey) && e.shiftKey)) {
return;
}
}
var key = e.keyCode ? e.keyCode : e.charCode
key = key || e.which;
if (key == lKeycode) {
var newChanIdx = selectedChannel - 1;
if (newChanIdx <= -2) {
newChanIdx = channelList.length - 1;
}
selectChannel(newChanIdx);
}
if (key == rKeycode) {
var newChanIdx = selectedChannel + 1;
if (newChanIdx == channelList.length) {
newChanIdx = -1;
}
selectChannel(newChanIdx);
}
});
//merge easter egg
(function(){
var easterEgg_partyNoMore = localStorage.getItem('easterEgg_partyNoMore'),
easterEgg_assetsCached = localStorage.getItem('easterEgg_assetsCached');
//chance to pre-cache assets
if(!easterEgg_assetsCached) {
var shouldCache = Math.floor(Math.random() * (20 - 1 + 1)) + 1;
if(shouldCache == 20) {
localStorage.setItem('easterEgg_assetsCached', true);
var easterEgg_cachedAirhorn = new Audio("https://www.myinstants.com/media/sounds/air-horn-club-sample_1.mp3");
var easterEgg_cachedCheer = new Audio("https://www.myinstants.com/media/sounds/cheering.mp3");
var easterEgg_cachedFireworks=new Image();
easterEgg_cachedFireworks.src='https://media.giphy.com/media/araoLWtAIZKzS/giphy.gif';
var easterEgg_cachedParrot=new Image();
easterEgg_cachedParrot.src='https://media.giphy.com/media/10v0l8aVLyLJ5e/giphy.gif';
}
}
//only play it once
if(!easterEgg_partyNoMore){
var easterEgg_robinTier,
easterEgg_airHorn = [],
easterEgg_airHorn_interval = [],
easterEgg_airHorn_timeOut = [
300,
800,
1200,
500
],
easterEgg_cheer,
easterEgg_cheer_interval,
easterEgg_cheer_timeOut = 600,
easterEgg_scriptString = $('script#config')[0].innerHTML;//script object containing complete user list
easterEgg_scriptString_startIndex = easterEgg_scriptString.indexOf('"robin_user_list": '),
easterEgg_users_length = $.parseJSON('{'+easterEgg_scriptString.substr(easterEgg_scriptString_startIndex, easterEgg_scriptString.length).split(']')[0]+']}').robin_user_list.length,//script object parsed into user length
easterEgg_fireWorks_URL = 'https://media.giphy.com/media/araoLWtAIZKzS/giphy.gif',
easterEgg_fireWorks = [],
easterEgg_fireWorks_BUFFER = 100,
easterEgg_windowHeight = $( window ).height(),
easterEgg_windowWidth = $( window ).width();
if(easterEgg_users_length>4410){//the number to beat (or close to it)
easterEgg_robinTier=17;
}else{
easterEgg_robinTier=16;
}
// uncomment to enable (requires clearing of local storage for multiple views)
// easterEgg_robinTier=17;
//if we're tier 17
if(easterEgg_robinTier == 17){
//set local storage so it doesn't happen again
localStorage.setItem('easterEgg_partyNoMore', true);
//create cheer loop
easterEgg_cheer = new Audio("https://www.myinstants.com/media/sounds/cheering.mp3");
easterEgg_cheer_interval = setInterval(function(){
easterEgg_cheer.play();
}, easterEgg_cheer_timeOut);
//create fireworks
for (var i = 0; i < 7; i++) {
var easterEgg_fireWorks_image = $('');
easterEgg_fireWorks_image.attr('src', easterEgg_fireWorks_URL);
easterEgg_fireWorks_image.css('position', 'absolute');
easterEgg_fireWorks_image.css('zIndex', '99');
easterEgg_fireWorks_image.css('top', Math.random() * ((easterEgg_windowHeight-easterEgg_fireWorks_BUFFER) - easterEgg_fireWorks_BUFFER));
easterEgg_fireWorks_image.css('left', Math.random() * ((easterEgg_windowWidth-easterEgg_fireWorks_BUFFER) - easterEgg_fireWorks_BUFFER));
easterEgg_fireWorks.push(easterEgg_fireWorks_image);
$('body').append(easterEgg_fireWorks_image);
}
//create airhorn loops
for (var i = 0; i < 4; i++) {
(function(){
var y = i;
easterEgg_airHorn[y] = new Audio("https://www.myinstants.com/media/sounds/air-horn-club-sample_1.mp3");
easterEgg_airHorn_interval[y] = setInterval(function(){
(function(){
var x = y;
// easterEgg_airHorn[x].play();
})();
}, easterEgg_airHorn_timeOut[y]);
})();
}
//dancing parrot
$('body').append('