🏠 Home 

BetterRabbit

Improves the Rabbit experience

// ==UserScript==
// @name        BetterRabbit
// @namespace   soulweaver
// @description Improves the Rabbit experience
// @include     https://www.rabb.it/*
// @version     1
// @grant       none
// @require https://code.jquery.com/jquery-2.2.3.min.js
// ==/UserScript==
var vObs;
var twitchEmotes;
var bttvEmotes;
var gBttvEmotes = {};
$(document).ready(function() {
//alert("Plese don't open chat until the 'Chat ready' alert appers, thanks! *click ok*");
//MutationObserver helper
var observeDOM = (function(){
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
eventListenerSupported = window.addEventListener;
return function(obj, callback){
if( MutationObserver ){
// define a new observer
var obs = new MutationObserver(function(mutations, observer){
if( mutations[0].addedNodes.length || mutations[0].removedNodes.length )
callback(mutations, observer);
});
// have the observer observe foo for changes in children
obs.observe( obj, { childList:true, subtree:true });
}
else if( eventListenerSupported ){I
obj.addEventListener('DOMNodeInserted', callback, false);
obj.addEventListener('DOMNodeRemoved', callback, false);
}
}
})();
// Download latest global emotes and store them in a variable
$.getJSON('https://api.twitch.tv/kraken/chat/emoticon_images?emotesets=0', function(data) {
twitchEmotes = data;
});
$.getJSON('https://cdn.rawgit.com/Jiiks/BetterDiscordApp/master/data/emotedata_bttv.json', function(data) {
bttvEmotes = data;
});
$.getJSON('https://api.betterttv.net/2/emotes', function(data) {
$.each(data.emotes, function(key, val) {
gBttvEmotes[val.code] = val.id;
});
});
// Apparently I suck at Javascript and $(document).on just doesn't work. kden. So hacky workaround
setTimeout(function() {
//alert('Chat ready');
console.log('timedone');
console.log(gBttvEmotes);
$('.toolbarButton.chatButton > .noCounter > .icon').click(function() {
if($(this).hasClass('on')) {
console.log('Chat gone');
vObs.disconnect();
} else {
console.log('chat here');
setTimeout(function() {
observeDOM(document.getElementsByClassName("messages")[0], function(mutation, observer){
vObs = observer;
//console.log(mutation);
var message = $(mutation[0].addedNodes[0]).find('span')
var messageContent = message[0].innerText;
var messageWords = messageContent.split(/([^\s]+)([\s]|$)/g).filter(function(e){ return e});
var scrollPos = $('.conversationMessageCollectionView').scrollTop();
var scrollHeight = $('.conversationMessageCollectionView')[0].scrollHeight - $('.conversationMessageCollectionView')[0].clientHeight;
function callback(array) {
//console.log(array);
var content = array.join('');
message.replaceWith("<span class='messageBody'>" + content + "</span>");
if (scrollPos >= scrollHeight) {
$('.conversationMessageCollectionView').scrollTop(10000);
}
}
var wordsDone = 0;
messageWords.forEach(function(w, i, a) {
//console.log('word: ' + w + " | index: " + i + " | array: " + a);
twitchEmotes.emoticon_sets[0].forEach(function (emote, i2) {
if (w == emote.code) {
a[i] = "<img src='https://static-cdn.jtvnw.net/emoticons/v1/" + emote.id + "/1.0' alt='" + emote.code + "'>";
}
});
if (gBttvEmotes.hasOwnProperty(w)) {
a[i] = "<img src='https://cdn.betterttv.net/emote/" + gBttvEmotes[w] + "/1x'>";
} else if (bttvEmotes.hasOwnProperty(w)) {
a[i] = "<img src='https://cdn.betterttv.net/emote/" + bttvEmotes[w] + "/1x'>";
}
//              if(twitchEmotes.emotes.hasOwnProperty(w)) {
//                 a[i] = "<img src='https://static-cdn.jtvnw.net/emoticons/v1/" + twitchEmotes.emotes[w].image_id + "/1.0'>";
//                 //console.log(twitchEmotes.emotes[w]);
//              };
wordsDone++;
if(wordsDone === a.length) {
callback(a);
}
});
});
}, 1000)
}
});
}, 6000);
});
console.log('BetterRabbit loaded');