NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @namespace https://openuserjs.org/users/ScriptedEngineer
// @name Twitch Toolbox
// @author ScriptedEngineer
// @description Auto channel points bonus and more
// @copyright 2020, ScriptedEngineer (https://openuserjs.org/users/ScriptedEngineer)
// @version 0.1.73
// @match *://www.twitch.tv/*
// @include *://*.twitch.tv/*
// @exclude *://*.twitch.tv/*.html
// @exclude *://*.twitch.tv/*.html?*
// @exclude *://*.twitch.tv/*.htm
// @exclude *://*.twitch.tv/*.htm?*
// @updateURL https://openuserjs.org/meta/ScriptedEngineer/Twitch_Toolbox.meta.js
// @downloadURL https://openuserjs.org/install/ScriptedEngineer/Twitch_Toolbox.user.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @license GPL-3.0-or-later
// ==/UserScript==
// ==OpenUserJS==
// @author ScriptedEngineer
// ==/OpenUserJS==
"use strict";
setInterval(function() {
var block = document.getElementsByClassName("tw-button--success")[0];
if (AutoPoints && block) {
block.click();
}
}, 1000);
const chatObserver = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type == 'childList'){
//console.log(mutation.target);
if(mutation.target.matches('div.chat-line__no-background')) {
if (SaveDeleted && mutation.removedNodes.length > 0) {//Deleted Message Save
mutation.removedNodes.forEach(n => {
console.log(n);
if (n.matches("span.text-fragment") || n.matches('div.chat-line__message--emote-button')) {
var newSpan = document.createElement('span');
newSpan.classList.add("chat-line__message--deleted");//.setAttribute("class", "");chat-line__message--deleted-detailed
newSpan.classList.add("chat-line__message--deleted-detailed");
newSpan.innerHTML = n.outerHTML;
var msdltd = mutation.target.querySelector('span[class="chat-line__message--deleted-notice"]');
msdltd.parentNode.insertBefore(newSpan,msdltd);
var mewSpan = document.createElement('span');
mewSpan.innerText = " ";
msdltd.parentNode.insertBefore(mewSpan,msdltd);
msdltd.innerText = 'cообщение удалено.';//
try{
mutation.target.querySelector('span.twitchtoolbox-wronglayout').remove();
}catch(e){}
}
});
}
}else if(mutation.target.matches('span[style="margin-left: 0.5rem;"]')){
mutation.target.childNodes.forEach(sfd=>{
//sfd.style.float = 'right';
});
mutation.addedNodes.forEach(n => {
if(n.matches('div[data-a-target="chat-badge"]')){
var tooltip = n.querySelector('div[data-a-target="tw-tooltip-label"]');
tooltip.classList.remove('tw-tooltip--align-left');
tooltip.classList.add('tw-tooltip--align-center');
}
});
}else if(mutation.target.matches('div.chat-scrollable-area__message-container')){
mutation.addedNodes.forEach(n => {
var textns = n.querySelectorAll('span[class*="-fragment"]');
//console.log(textns);
var textn = textns[0];
setTimeout(() => {
if(textn){
var text = '';
textns.forEach(element => {text += element.innerText;});
var nickspan = n.querySelector('span[class="chat-author__display-name"]');
var nick = nickspan.innerText;
var color = GM_getValue("NickColor."+nick,false);
if(color){
nickspan.style.color = color;
}else if(encoding.check(text)){
var decoded = encoding.decrypt(text,encodekey);
if(decoded){
textns.forEach(element => {
element.innerText = "";
});
var anewSpan = document.createElement('span');
anewSpan.classList.add("chat-line__message--deleted");
anewSpan.classList.add("twitchtoolbox-wronglayout");
anewSpan.innerHTML = '<div class="tw-inline tw-relative tw-tooltip-wrapper" style="float:right;"><div class="tw-align-center tw-inline-block"> ⌈🔑⌋</div><div class="tw-tooltip tw-tooltip--align-right tw-tooltip--up" data-a-target="tw-tooltip-label" role="tooltip">decoded</div></div>';
anewSpan.style.cursor = 'pointer';
anewSpan.title = text;
textn.parentNode.prepend(anewSpan);
textns[0].innerText = text = decoded;
}
}else if(brailebytes.check(text)){
var ddecoded = brailebytes.decrypt(text,encodekey);
if(ddecoded){
textns.forEach(element => {
element.innerText = "";
});
var sanewSpan = document.createElement('span');
sanewSpan.classList.add("chat-line__message--deleted");
sanewSpan.classList.add("twitchtoolbox-wronglayout");
sanewSpan.innerHTML = '<div class="tw-inline tw-relative tw-tooltip-wrapper" style="float:right;"><div class="tw-align-center tw-inline-block"> ⌈<a style="color: red;">⣿</a>⌋</div><div class="tw-tooltip tw-tooltip--align-right tw-tooltip--up" data-a-target="tw-tooltip-label" role="tooltip">braille bytes</div></div>';
sanewSpan.style.cursor = 'pointer';
sanewSpan.title = text;
textn.parentNode.prepend(sanewSpan);
textns[0].innerText = text = ddecoded;
}
}
if(ruseng.check(text)){//textParams.RusEng
if(ChangeWrong)
{
textns.forEach(element => {element.alt = ruseng.decrypt(element.innerText);});
}
else
{
textns.forEach(element => {element.alt = element.innerText;});
}
var newSpan = document.createElement('span');
newSpan.classList.add("chat-line__message--deleted");
newSpan.classList.add("twitchtoolbox-wronglayout");
newSpan.innerHTML = '<div class="tw-inline tw-relative tw-tooltip-wrapper" style="float:right;"><div class="tw-align-center tw-inline-block"> ⌈en↔ru⌋</div><div class="tw-tooltip tw-tooltip--align-right tw-tooltip--up" data-a-target="tw-tooltip-label" role="tooltip">раскладка</div></div>';
newSpan.style.cursor = 'pointer';
newSpan.title = ChangeWrong?text:ruseng.decrypt(text);
newSpan.onclick = function(){
textns.forEach(element => {element.innerText = ruseng.decrypt(element.innerText);});
newSpan.title = ruseng.decrypt(newSpan.title);
}
textn.parentNode.prepend(newSpan);
if(ChangeWrong)
{
textns.forEach(element => {element.innerText = ruseng.decrypt(element.innerText);});
}
//sendMessage(nick+" возможно хотел написать: "+ruseng.decrypt(text));
}/*else if(AutoTranslate && Russian && isEng(text.trim()) && text.length > 1 && !text.startsWith('!')){
setTimeout(() => {
var translatedText = '';
var isChanged = false;
textns.forEach(element => {
element.alt = element.innerText;
TranslateTo(element.innerText, 'ru',(x)=>{
translatedText += element.innerText = x.text || element.innerText;
ChatLanguage = x.from;
});
});
if(translatedText.trim() != text.trim()){
var xnewSpan = document.createElement('span');
xnewSpan.classList.add("chat-line__message--deleted");
xnewSpan.classList.add("twitchtoolbox-wronglayout");
xnewSpan.style.cursor = 'pointer';
xnewSpan.innerHTML = '<div class="tw-inline tw-relative tw-tooltip-wrapper" style="float:right;"><div class="tw-align-center tw-inline-block"> ⌈🌐⌋</div><div class="tw-tooltip tw-tooltip--align-right tw-tooltip--up" data-a-target="tw-tooltip-label" role="tooltip">перевод</div></div>';
xnewSpan.title = text;
xnewSpan.onclick = function(){
var sptitle = '';
textns.forEach(element => {
var intex = element.alt;
sptitle += element.alt = element.innerText;
element.innerText = intex;
});
xnewSpan.title = sptitle;
}
textn.parentNode.prepend(xnewSpan);
}
}, 0);
}*/
var params = text.replace(/\@/g,'').trim().split(' ');
params[0] = params[0].toLowerCase();
switch(params[0]){
case "!play":
if(AutoMOS){
if((Date.now() - MOSP) < 60000){
if(!plascmdcount.includes(nick))plascmdcount.push(nick);
}else{
MOSP = Date.now();
plascmdcount = [];
}
var views = document.querySelector('div[data-a-target="tw-stat-value"]');
if(!views)views = document.querySelector('p[data-a-target="animated-channel-viewers-count"]');
var vievers = views.innerText;
var needed = vievers > 50?Math.floor(vievers/12):(vievers > 6?Math.floor(vievers/6):1);
if(plascmdcount.length >= needed){
if((Date.now() - MOSP2) > 60000){
sendMessage("!play");
}
MOSP2 = Date.now();
plascmdcount = [];
}
}
break;
case "!race":
if(AutoMOS){
if((Date.now() - MOSP) < 60000){
if(!plascmdcount.includes(nick))plascmdcount.push(nick);
}else{
MOSP = Date.now();
plascmdcount = [];
}
var vsiews = document.querySelector('div[data-a-target="tw-stat-value"]');
if(!vsiews)vsiews = document.querySelector('p[data-a-target="animated-channel-viewers-count"]');
var vwievers = vsiews.innerText;
var nseeded = vwievers > 50?Math.floor(vwievers/12):(vwievers > 6?Math.floor(vwievers/6):1);
if(plascmdcount.length >= nseeded){
if((Date.now() - MOSP2) > 60000){
sendMessage("!race");
}
MOSP2 = Date.now();
plascmdcount = [];
}
}
break;
default:
break;
}
}
});
if(HideCheer){
n.querySelectorAll('img[class="chat-badge"]').forEach(x=>{
if(x.parentNode.href)
{
if(x.parentNode.href.includes('bits')){
x.style.display = 'none';
}
}else if(x.alt.includes('cheer')){
x.style.display = 'none';
}
});
}
if(BetterChat){
if(BadgesRight){
var sfleft = n.querySelector('img[class="chat-badge"]');
if(sfleft){
sfleft = sfleft.parentNode;
if(sfleft.matches('a'))sfleft = sfleft.parentNode;
sfleft.style = 'margin-left: 0.5rem;';
//sfleft.classList.add('chat-line__username-container');
sfleft.childNodes.forEach(sfd=>{
//sfd.style.float = 'right';
});
sfleft.parentNode.append(sfleft);
}
}
n.style.borderBottom = "1px dotted RGBA(127, 127, 127,0.5)";
n.classList.remove('tw-mg-y-05');
if(bettchtind)n.style.backgroundColor = "RGBA(177, 177, 177,0.1)";
else n.style.backgroundColor = "RGBA(77, 77, 77,0.1)";
bettchtind = !bettchtind;
}
}, 0);
}else if(mutation.target.matches('div.chat-settings') || mutation.target.matches('div.chat-settings__content')){
try{
var emotemenu = document.querySelector('button[id="emote-menu-button"]');
document.querySelector('div[data-a-target="chat-settings-balloon"]').style.marginRight = "-"+(5.3+(emotemenu?3.5:0)+(EncodeButton?3.5:0)+(BrailleBytes?3.5:0))+"rem";
}catch(e){}
mutation.addedNodes.forEach(n => {
if(n.nodeType == 1){
var bttv = n.matches('div.bttv-chat-settings');
var chki = n.matches('div.tw-border-t') && !bttv;
if(n.matches('div.simplebar-scroll-content') || chki){
var befr = chki?n:Array.from(n.firstChild.firstChild.children).filter(function (sandwich) {return sandwich.matches('div.tw-border-t');})[0];//n.firstChild.firstChild.querySelector('div[class="tw-border-t tw-mg-t-1 tw-mg-x-05 tw-pd-b-1"]');
if(befr){
ReadGMValues();
var ndiv = document.createElement('div');
ndiv.innerHTML = '<div ext="TwitchToolbox"><div class="tw-border-t tw-mg-t-1 tw-mg-x-05 tw-pd-b-1"></div><div class="tw-mg-y-05 tw-pd-x-05"><p class="tw-c-text-alt-2 tw-font-size-6 tw-strong tw-upcase">'+(Russian?'Инструменты':'Tools')+'</p></div>'+
'<div class="tw-full-width tw-relative"><button class="tw-block tw-border-radius-medium tw-full-width tw-interactable tw-interactable--alpha tw-interactable--hover-enabled tw-interactive" data-a-target="ttb-button" data-test-selector="ttb-button"><div class="tw-align-items-center tw-flex tw-pd-05 tw-relative"><div class="tw-flex-grow-1">'+(Russian?'Показать настройки':'Show settings')+'</div></div></button></div>'+
'<div class="TTBSettings" style="transition: all .5s ease-out; height: 0px; opacity: 0; overflow: hidden;">'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-AutoPoints">'+(Russian?'Собирать баллы канала':'Collect channel points')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-AutoPoints" label="0" class="tw-toggle__input" data-a-target="tw-toggle" '+(AutoPoints?'checked=""':"")+'><label for="TwitchToolbox-AutoPoints" class="tw-toggle__button"><p class="tw-hide-accessible">0</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-AutoMos">'+(Russian?'Авто !play и !race':'Auto !play & !race')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-AutoMos" label="1" class="tw-toggle__input" data-a-target="tw-toggle" '+(AutoMOS?'checked=""':"")+'><label for="TwitchToolbox-AutoMos" class="tw-toggle__button"><p class="tw-hide-accessible">1</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-SaveDeleted">'+(Russian?'Сохранять удаленные сообщения':'Save deleted messages')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-SaveDeleted" label="2" class="tw-toggle__input" data-a-target="tw-toggle" '+(SaveDeleted?'checked=""':"")+'><label for="TwitchToolbox-SaveDeleted" class="tw-toggle__button"><p class="tw-hide-accessible">2</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-EncodeButton">'+(Russian?'Кнопка для шифрования':'Encode message button')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-EncodeButton" label="6" class="tw-toggle__input" data-a-target="tw-toggle" '+(EncodeButton?'checked=""':"")+'><label for="TwitchToolbox-EncodeButton" class="tw-toggle__button"><p class="tw-hide-accessible">6</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-BrailleBytes">'+(Russian?'Кнопка Braille байты':'Braille bytes button')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-BrailleBytes" label="7" class="tw-toggle__input" data-a-target="tw-toggle" '+(BrailleBytes?'checked=""':"")+'><label for="TwitchToolbox-BrailleBytes" class="tw-toggle__button"><p class="tw-hide-accessible">7</p></label></div></div></div>'+
(Russian?'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-ChangeWrong">Исправлять эльфийский</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-ChangeWrong" label="5" class="tw-toggle__input" data-a-target="tw-toggle" '+(ChangeWrong?'checked=""':"")+'><label for="TwitchToolbox-ChangeWrong" class="tw-toggle__button"><p class="tw-hide-accessible">5</p></label></div></div></div>'/*+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-AutoTranslate">Автоматический перевод чата</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-AutoTranslate" label="9" class="tw-toggle__input" data-a-target="tw-toggle" '+(AutoTranslate?'checked=""':"")+'><label for="TwitchToolbox-AutoTranslate" class="tw-toggle__button"><p class="tw-hide-accessible">9</p></label></div></div></div>'*/:'')+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-BetterChat">'+(Russian?'Улучшенный чат':'Better chat')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-BetterChat" label="3" class="tw-toggle__input" data-a-target="tw-toggle" '+(BetterChat?'checked=""':"")+'><label for="TwitchToolbox-BetterChat" class="tw-toggle__button"><p class="tw-hide-accessible">3</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-BadgesRight">'+(Russian?'Значки в чате справа':'Move badges to right')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-BadgesRight" label="8" class="tw-toggle__input" data-a-target="tw-toggle" '+(BadgesRight?'checked=""':"")+'><label for="TwitchToolbox-BadgesRight" class="tw-toggle__button"><p class="tw-hide-accessible">8</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-HideCheer">'+(Russian?'Скрыть Bits и рейтинг':'Hide Bits and top')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-HideCheer" label="4" class="tw-toggle__input" data-a-target="tw-toggle" '+(HideCheer?'checked=""':"")+'><label for="TwitchToolbox-HideCheer" class="tw-toggle__button"><p class="tw-hide-accessible">4</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-BTTV">'+(Russian?'Внедрить BetterTTV':'Embed BetterTTV')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-BTTV" label="10" class="tw-toggle__input" data-a-target="tw-toggle" '+(IncludeBTTV?'checked=""':"")+'><label for="TwitchToolbox-BTTV" class="tw-toggle__button"><p class="tw-hide-accessible">10</p></label></div></div></div>'+
'<div class="tw-pd-05"><div class="tw-align-items-center tw-flex"><label class="tw-drop-down-menu-input-item__label tw-flex-grow-1 tw-mg-r-2" for="TwitchToolbox-SaveInput">'+(Russian?'Сохранять текст в поле ввода':'Save text in the input field')+'</label><div class="tw-toggle"><input type="checkbox" id="TwitchToolbox-SaveInput" label="11" class="tw-toggle__input" data-a-target="tw-toggle" '+(SaveInput?'checked=""':"")+'><label for="TwitchToolbox-SaveInput" class="tw-toggle__button"><p class="tw-hide-accessible">11</p></label></div></div></div>'+
"</div></div>";
if(chki)befr.parentNode.insertBefore(ndiv,befr);
else if(n.firstChild.firstChild == befr.parentNode)n.firstChild.firstChild.insertBefore(ndiv,befr);
document.querySelector('button[data-a-target="ttb-button"]').addEventListener('click',function() {
var sts = document.querySelector('div[class="TTBSettings"]');
var button = document.querySelector('button[data-a-target="ttb-button"]');
if(sts.style.height == "0px"){
sts.style.height = sts.scrollHeight + "px";
sts.style.opacity = "1";
button.querySelector('div[class="tw-flex-grow-1"]').innerText = (Russian?'Скрыть настройки':'Hide settings');
button.blur();
}
else {
sts.style.height = "0px";
sts.style.opacity = "0";
button.querySelector('div[class="tw-flex-grow-1"]').innerText = (Russian?'Показать настройки':'Show settings');
button.blur();
}
},false);
document.querySelector('input[id="TwitchToolbox-AutoPoints"]').addEventListener('change',function() {
AutoPoints = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-AutoPoints"]'), ":before").content != "none";
GM_setValue("AutoCPoints",AutoPoints);
},false);
document.querySelector('input[id="TwitchToolbox-SaveInput"]').addEventListener('change',function() {
SaveInput = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-SaveInput"]'), ":before").content != "none";
GM_setValue("SaveInput",SaveInput);
},false);
document.querySelector('input[id="TwitchToolbox-BadgesRight"]').addEventListener('change',function() {
BadgesRight = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-BadgesRight"]'), ":before").content != "none";
GM_setValue("BadgesRight",BadgesRight);
},false);
var cvdlskjfklsdj = document.querySelector('input[id="TwitchToolbox-ChangeWrong"]');
if(cvdlskjfklsdj){
cvdlskjfklsdj.addEventListener('change',function() {
ChangeWrong = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-ChangeWrong"]'), ":before").content != "none";
GM_setValue("ChangeWrong",ChangeWrong);
},false);
}
document.querySelector('input[id="TwitchToolbox-AutoMos"]').addEventListener('change',function() {
AutoMOS = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-AutoMos"]'), ":before").content != "none";
GM_setValue("AutoMOS",AutoMOS);
},false);
document.querySelector('input[id="TwitchToolbox-SaveDeleted"]').addEventListener('change',function() {
SaveDeleted = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-SaveDeleted"]'), ":before").content != "none";
GM_setValue("SaveDeleted",SaveDeleted);
},false);
document.querySelector('input[id="TwitchToolbox-BetterChat"]').addEventListener('change',function() {
BetterChat = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-BetterChat"]'), ":before").content != "none";
GM_setValue("BetterChat",BetterChat);
},false);
/*document.querySelector('input[id="TwitchToolbox-AutoTranslate"]').addEventListener('change',function() {
AutoTranslate = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-AutoTranslate"]'), ":before").content != "none";
GM_setValue("AutoTranslate",AutoTranslate);
},false);*/
document.querySelector('input[id="TwitchToolbox-BTTV"]').addEventListener('change',function() {
IncludeBTTV = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-BTTV"]'), ":before").content != "none";
GM_setValue("IncludeBTTV",IncludeBTTV);
if(IncludeBTTV) betterttv();
else location.reload();
},false);
document.querySelector('input[id="TwitchToolbox-HideCheer"]').addEventListener('change',function() {
HideCheer = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-HideCheer"]'), ":before").content != "none";
GM_setValue("HideCheer",HideCheer);
if(HideCheer){
document.querySelector('button[data-a-target="bits-button"]').style.visibility = "hidden";
document.querySelector('div.channel-leaderboard').parentNode.style = "height: 0px; overflow: hidden;";
document.querySelector('button[data-a-target="top-nav-get-bits-button"]').parentNode.style = 'display: none;';
}
else{
document.querySelector('button[data-a-target="bits-button"]').style.visibility = "visible";
document.querySelector('div.channel-leaderboard').parentNode.style = "";
document.querySelector('button[data-a-target="top-nav-get-bits-button"]').parentNode.style = 'display: inherit;';
}
},false);
document.querySelector('input[id="TwitchToolbox-EncodeButton"]').addEventListener('change',function() {
EncodeButton = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-EncodeButton"]'), ":before").content != "none";
GM_setValue("EncodeButton",EncodeButton);
var butt = document.querySelector('button.Toolbox-EncodeButton');
if(!EncodeButton){
butt.style = 'visibility: hidden;width: 0px;margin-right: 0!important;';
}
else{
butt.style = 'background-color: var(--color-background-button-primary-default);';
}
try{
document.querySelector('div[data-a-target="chat-settings-balloon"]').style.marginRight = "-"+(5.3+(emotemenu?3.5:0)+(EncodeButton?3.5:0)+(BrailleBytes?3.5:0))+"rem";
}catch(e){}
},false);
document.querySelector('input[id="TwitchToolbox-BrailleBytes"]').addEventListener('change',function() {
BrailleBytes = window.getComputedStyle(this.parentNode.querySelector('label[for="TwitchToolbox-BrailleBytes"]'), ":before").content != "none";
GM_setValue("BrailleBytes",BrailleBytes);
var butt = document.querySelector('button.Toolbox-BraileBytesButton');
if(!BrailleBytes){
butt.style = 'visibility: hidden;width: 0px;margin-right: 0!important;';
}
else{
butt.style = 'background-color: var(--color-background-button-primary-default);';
}
try{
document.querySelector('div[data-a-target="chat-settings-balloon"]').style.marginRight = "-"+(5.3+(emotemenu?3.5:0)+(EncodeButton?3.5:0)+(BrailleBytes?3.5:0))+"rem";
}catch(e){}
},false);
document.querySelector('div.chat-settings').style.overflow = 'hidden';
}
}else if(n.matches('div[data-a-target="chat-settings-mod-view"]')){
n.parentNode.querySelector('div[ext="TwitchToolbox"]').remove();
}else if(bttv){
try{
n.style = 'margin-top: 0 !important;padding-top: 0 !important; transition: all .5s ease-out; height: 0px; overflow: hidden; opacity: 0;';
if(Russian){
n.querySelector('p.tw-upcase').innerText = "инструменты bttv"
var translate = {'Set Blacklist Keywords':'Изменить черный список слов','Set Highlight Keywords':'Изменить слова которые выделять','Set Font':'Изменить шрифт','Set Font Size':'Изменить размер шрифта','Clear My Chat':'Очистить чат','BetterTTV Settings':'Настройки BetterTTV'};
n.querySelectorAll('button.tw-interactive').forEach(b => {
if(translate[b.innerText] !== undefined)b.innerText = translate[b.innerText];
});
}
var stsgs = document.querySelector('div[class="TTBSettings"]');
document.querySelector('div.chat-settings').style.overflow = 'hidden';
if(!document.querySelector('button[data-a-target="ttb-bttv-button"]')){
var n2div = document.createElement('div');
n2div.classList.add("tw-full-width");
n2div.classList.add("tw-relative");
n2div.innerHTML = '<button class="tw-block tw-border-radius-medium tw-full-width tw-interactable tw-interactable--alpha tw-interactable--hover-enabled tw-interactive" data-a-target="ttb-bttv-button" data-test-selector="ttb-bttv-button"><div class="tw-align-items-center tw-flex tw-pd-05 tw-relative"><div class="tw-flex-grow-1">'+(Russian?'Показать BetterTTV':'Show BetterTTV')+'</div></div></button>';
stsgs.parentNode.insertBefore(n2div,stsgs);
document.querySelector('button[data-a-target="ttb-bttv-button"]').addEventListener('click',function() {
var button = document.querySelector('button[data-a-target="ttb-bttv-button"]');
var sts = document.querySelector('div.bttv-chat-settings');
if(sts){
if(sts.style.height == "0px"){
sts.style = 'transition: all 0.5s ease-out 0s; height: '+(sts.scrollHeight+10)+'px; overflow: hidden; margin-top: 1rem !important; padding-top: 1rem !important; opacity: 1;';
button.querySelector('div[class="tw-flex-grow-1"]').innerText = (Russian?'Скрыть BetterTTV':'Hide BetterTTV');
button.blur();
}
else {
sts.style = "transition: all 0.5s ease-out 0s; height: 0px; overflow: hidden; margin-top: 0 !important; padding-top: 0 !important; opacity: 0;";
button.querySelector('div[class="tw-flex-grow-1"]').innerText = (Russian?'Показать BetterTTV':'Show BetterTTV');
button.blur();
}
}else{
button.remove();
}
},false);
}
}catch(e){
n.style = '';
}
}
}
});
}else if(mutation.target.matches('div[data-a-target="viewer-card-positioner"]')){
mutation.addedNodes.forEach(n => {
if(n.matches('div[class="tw-full-height tw-full-width"]')){
var H4T = n.querySelector('h4[class="tw-c-text-overlay tw-ellipsis tw-line-clamp-2 tw-word-break-all"]');
var Nick = H4T.querySelector('a[target="_blank"]').innerText;
var dColor = GM_getValue("NickColor."+Nick,"");
var Ico = '<span class="tw-button-icon__icon"><svg x="0px" y="0px" class="changeColor" viewBox="0 0 1000 1000" height="16px" width="16px" style="fill: '+(dColor?dColor:"#ffffff")+';"><g><path d="M953.5,46.5c-48.7-48.7-127.7-48.7-176.4,0l-147,147L589.5,153c-21.3-21.3-55.9-21.3-77.2,0c-21.3,21.3-21.3,55.9,0,77.2l40.6,40.6l-452,452c-22.2,22.2-34.3,50.7-36.2,79.8c-0.8,11.8-3.8,33.8-7.3,57.6c-0.6,3.9-2.3,7.7-5.3,10.7l0,0l-33.8,33.8c-10.8,10.8-10.8,28.4,0,39.2l38,38c10.8,10.8,28.4,10.8,39.2,0l33.8-33.8c3-3,6.8-4.7,10.7-5.3c23.8-3.6,45.8-6.6,57.6-7.3c29.1-2,57.5-14,79.8-36.3l452-452l40.6,40.6c21.3,21.3,55.9,21.3,77.2,0c21.3-21.3,21.3-55.9,0-77.2L712.4,275.9L818,358.4l135.5-135.5C1002.2,174.2,1002.2,95.2,953.5,46.5z M663.9,421L440.3,644.6c-10.8,10.8-28.4,10.8-39.2,0L365.5,609c-10.8-10.8-28.4-10.8-39.2,0l-6.7,6.7l0,0L159.2,776c-3.7,3.7-8.9,4.4-11.7,1.6c-2.8-2.8-2.1-8.1,1.6-11.7l259.6-259.6l0,0L579,336.1c10.8-10.8,28.4-10.8,39.2,0l45.7,45.7C674.7,392.7,674.7,410.2,663.9,421z"></path></g></svg></span>';
var ndiv = document.createElement('button');
ndiv.innerHTML = Ico;
ndiv.style = "margin-top: -2px; float: right;";
ndiv.classList.add('tw-button-icon','tw-button-icon--overlay','TwitchToolbox-EditColor');
H4T.appendChild(ndiv);
var btttttt = document.querySelector('button.TwitchToolbox-EditColor');
btttttt.addEventListener('click',function() {
var dColor = GM_getValue("NickColor."+Nick,"");
var color = prompt('Введите название(white) или код(#ffffff) цвета для '+Nick+', для сброса оставьте пустым.',dColor);
if(color === ""){
GM_deleteValue("NickColor."+Nick);
btttttt.querySelector('svg.changeColor').style.fill = "#ffffff";
}else if(color != null){
GM_setValue("NickColor."+Nick,color);
btttttt.querySelector('svg.changeColor').style.fill = color;
}
});
}
});
}else if(mutation.target.matches('title')){
initLoad();
}else if(mutation.target.matches('div.chat-input')){
if(HideCheer){
var cheer = document.querySelector('button[data-a-target="bits-button"]');
if(cheer)cheer.style.visibility = "hidden";
}
chat = document.querySelector('textarea[data-a-target="chat-input"]');
if(!document.querySelector('button.Toolbox-EncodeButton')){
AddEncodeButtons();
}
}else if(mutation.target.matches('div.channel-leaderboard-header-first-entry')){
if(HideCheer){
document.querySelector('div.channel-leaderboard').parentNode.style = "height: 0px; overflow: hidden;";
}
}else if(mutation.target.parentNode && mutation.target.parentNode.nodeType == Node.ELEMENT_NODE && mutation.target.parentNode.matches('div.top-bar')){
mutation.addedNodes.forEach(n => {
if(CurrentGame != ""){
n.querySelector('a[data-a-target="player-info-game-name"]').innerText = CurrentGame;
n.querySelector('a[data-a-target="player-info-game-name"]').href = document.querySelector('a[data-a-target="stream-game-link"]').href;
n.querySelector('p[data-test-selector="stream-info-card-component__subtitle"]').innerText = document.querySelector('h2[data-a-target="stream-title"]').innerText;
}
});
}else if(mutation.target.matches('div.chat-room__content')){
mutation.addedNodes.forEach(n => {
if(n.matches('div.tw-z-default') && HideCheer){
try{
document.querySelector('button[data-a-target="bits-button"]').style.visibility = "hidden";
document.querySelector('div.channel-leaderboard').parentNode.style = "height: 0px; overflow: hidden;";
document.querySelector('button[data-a-target="top-nav-get-bits-button"]').parentNode.style = 'display: none;';
}catch(e){}
}
});
}
}else if (mutation.type == 'attributes'){
if(mutation.target.matches('a[data-a-target="stream-game-link"]')){
CurrentGame = mutation.target.innerText;
var pg = document.querySelector('a[data-a-target="player-info-game-name"]');
if(pg)pg.innerText = CurrentGame;
}else if(mutation.target.matches('h2[data-a-target="stream-title"]')){
var pt = document.querySelector('p[data-test-selector="stream-info-card-component__subtitle"]')
if(pt)pt.innerText = mutation.target.innerText;
}
}
})
})
chatObserver.observe(document.documentElement, {
attributes: true,
childList: true,
subtree: true
})
var encodekey = "TEXT";//todo
var BadgesRight = false;
var BrailleBytes = false;
var EncodeButton = false;
var TranslateButton = false;
var ChangeWrong = true;
var AutoPoints = true;
var AutoMOS = false;
var SaveDeleted = true;
var BetterChat = true;
var HideCheer = false;
var AutoTranslate = false;
var IncludeBTTV = false;
var SaveInput = false;
ReadGMValues();
var bettchtind = false;
var MOSP = 0;
var MOSP2 = 0;
var plascmdcount = [];
var CurrentGame = "";
var Russian = false;
var ChatLanguage = "en";
function ReadGMValues(){
BadgesRight = GM_getValue("BadgesRight",BadgesRight);
BrailleBytes = GM_getValue("BrailleBytes",BrailleBytes);
EncodeButton = GM_getValue("EncodeButton",EncodeButton);
ChangeWrong = GM_getValue("ChangeWrong",ChangeWrong);
AutoPoints = GM_getValue("AutoCPoints",AutoPoints);
AutoMOS = GM_getValue("AutoMOS",AutoMOS);
SaveDeleted = GM_getValue("SaveDeleted",SaveDeleted);
BetterChat = GM_getValue("BetterChat",BetterChat);
HideCheer = GM_getValue("HideCheer",HideCheer);
AutoTranslate = GM_getValue("AutoTranslate",AutoTranslate);
TranslateButton = GM_getValue("TranslateButton",TranslateButton);
IncludeBTTV = GM_getValue("IncludeBTTV",IncludeBTTV);
SaveInput = GM_getValue("SaveInput",SaveInput);
}
function sendMessage(message){
var omsg = setInputValue(message);
document.querySelector('button[data-a-target="chat-send-button"]').click();
setInputValue(omsg);
}
function httpGet(theUrl)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
function httpPost(theUrl,theData, callback)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "POST", theUrl, true ); // false for synchronous request
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttp.send( theData );
xmlHttp.onreadystatechange = function() {
if (this.readyState != 4) return;
callback(xmlHttp.responseText);
}
}
var chat;
window.onload = function () {
initLoad();
}
function isEng(t){
if(!t || 0 === t.length || t.startsWith('!'))return false;
if(!/[А-я]+/.test(t))return true;
return t.match(/[А-я]/g).length < (t.length * 0.1);
}
function TranslateTo(text,to, callback){
httpPost('https://translate.googleapis.com/translate_a/single',
'client=gtx&sl=auto&tl='+to+'&dt=t&q='+encodeURIComponent(text),
(x)=>{
var jsos = JSON.parse(x);
callback({text:jsos[0][0][0],from:jsos[2]});
},true);
}
var ruseng = {
check:function(s){
return s.match(/\'nj|^z\s|gjyb|^kjk|xt\,e|k\.\,k|\{jnm|gthdsq|bvftn|\svtyz\s|\,kb\;|\,hz\.|gjld|gjllth;bd|bqcr|qcrbq|rfhjxt|rkfc|fcyfz|buhf|sdftn|levf|\[hty|egbk|tplt|\;ty|vjq|pltcm|\,snm|vjukf|xnj|yfd|gjqv|bkb|^j\s|^c\s|^yt|ghj|rfr|dct|vfn|ujh|gjxtve|gjnjv|\]eq|nfr|ghbdtn|nmcz|ncz|djn|ytn|^lf|gjrf|pfxtv|relf|jnkbxyj|\[jhjij|ghfd|ntcn|\[f\[f/i)?s:0;
},
decrypt:function(t){
var xn="qwertyuiop[]asdfghjkl;'zxcvbnm,.`QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>~",
xt='йцукенгшщзхъфывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ',
xo=Array.from(xn+xt),xu=Array.from(xt+xn);
return Array.from(t).map(function(t){return xo[xu.indexOf(t)]||t}).join("");//xo[xu
},
};
ruseng.encrypt = ruseng.decrypt;
var chatValue = "";
function initLoad(){
chat = document.querySelector('textarea[data-a-target="chat-input"]');
try{
chat.addEventListener('input',function() {
chatValue = chat.value;
//console.log(chatValue);
//setInputValue(chat_NaE_Value);
},false);
chat.addEventListener('focusin',function() {
//chatValue = chat.value;
//console.log("f:"+chatValue);
if(SaveInput)setInputValue(chatValue);
},false);
chat.addEventListener('focusout',function() {
chatValue = chat.value;
//console.log("f:"+chatValue);
},false);
}catch(e){}
if(chat){
try {
if(HideCheer){
document.querySelector('button[data-a-target="bits-button"]').style.visibility = "hidden";
document.querySelector('div.channel-leaderboard').parentNode.style = "height: 0px; overflow: hidden;";
document.querySelector('button[data-a-target="top-nav-get-bits-button"]').parentNode.style = 'display: none;';
}
}catch (err) {}
Russian = document.querySelector('h5[data-test-selector="chat-room-header-label"]').innerText == "ЧАТ ТРАНСЛЯЦИИ";
ChangeWrong = GM_getValue("ChangeWrong",Russian);
setTimeout(function () {
var gamenode = document.querySelector('a[data-a-target="stream-game-link"]');
if(gamenode)CurrentGame = gamenode.innerText;
},1000);
if(!document.querySelector('button.Toolbox-EncodeButton')){
AddEncodeButtons();
}
if(IncludeBTTV && !document.querySelector('script[class="Toolbox-BetterTTV"]')) betterttv();
}
else setTimeout(initLoad,1000);
}
function AddEncodeButtons(){
var csbutt = document.querySelector('button[data-a-target="chat-settings"]');
var ndddd = document.createElement('button');
var toins = csbutt.parentNode.parentNode.parentNode.parentNode.nextSibling;
ndddd.classList.add("Toolbox-EncodeButton");//
ndddd.classList.add("tw-core-button");ndddd.classList.add("tw-button-icon");
ndddd.classList.add("tw-mg-r-05");ndddd.classList.add("tw-core-button--primary");ndddd.classList.add("tw-align-middle");
ndddd.style = "background-color: var(--color-background-button-primary-default);";
ndddd.innerHTML = '<span class="tw-button-icon__icon" style="width: 1.5rem; height: 1.5rem;">🔒</span>';
//console.log(toins);
toins.insertBefore(ndddd,toins.lastChild);
ndddd.addEventListener('click',function() {
if(chat.value != ""){
setInputValue(encoding.encrypt(chat.value,encodekey));
document.querySelector('button[data-a-target="chat-send-button"]').click();
}
},false);
ndddd.addEventListener("mouseover", function() {
if(encoding.encrypt(chat.value,encodekey).length > 500) document.querySelector('button.Toolbox-EncodeButton').disabled="something";
},false);
if(!EncodeButton){
ndddd.style = 'visibility: hidden;width: 0px;margin-right: 0!important;';
}
ndddd = document.createElement('button');
ndddd.classList.add("Toolbox-BraileBytesButton");//
ndddd.classList.add("tw-core-button");ndddd.classList.add("tw-button-icon");
ndddd.classList.add("tw-mg-r-05");ndddd.classList.add("tw-core-button--primary");ndddd.classList.add("tw-align-middle");
ndddd.style = "background-color: var(--color-background-button-primary-default);";
ndddd.innerHTML = '<span class="tw-button-icon__icon" style="width: 1.5rem; height: 1.5rem;color: red;">⣿</span>';
toins.insertBefore(ndddd,toins.lastChild);
ndddd.addEventListener('click',function() {
if(chat.value != ""){
setInputValue(brailebytes.encrypt(chat.value,encodekey));
document.querySelector('button[data-a-target="chat-send-button"]').click();
}
},false);
ndddd.addEventListener("mouseover", function() {
if(brailebytes.encrypt(chat.value,encodekey).length > 500) document.querySelector('button.Toolbox-BraileBytesButton').disabled=true;
},false);
if(!BrailleBytes){
ndddd.style = 'visibility: hidden;width: 0px;margin-right: 0!important;';
}
toins.addEventListener("mouseleave", function() {
document.querySelector('button.Toolbox-EncodeButton').disabled=false;
document.querySelector('button.Toolbox-BraileBytesButton').disabled=false;
},false);
/*ndddd = document.createElement('button');
ndddd.classList.add("Toolbox-TranslateButton");//
ndddd.classList.add("tw-core-button");ndddd.classList.add("tw-button-icon");
ndddd.classList.add("tw-mg-r-05");ndddd.classList.add("tw-core-button--primary");ndddd.classList.add("tw-align-middle");
ndddd.innerHTML = '<span class="tw-button-icon__icon" style="width: 1.5rem; height: 1.5rem;">🌐</span>';
csbutt.parentNode.parentNode.parentNode.nextSibling.insertBefore(ndddd,csbutt.parentNode.parentNode.parentNode.nextSibling.lastChild);
ndddd.addEventListener('click',function() {
if(chat.value != ""){
TranslateTo(chat.value,ChatLanguage,(x)=>{
//console.log(x,chat.value);
setInputValue(x.text);
document.querySelector('button[data-a-target="chat-send-button"]').click();
});
}
},false);
if(!TranslateButton){
//ndddd.style = 'visibility: hidden;width: 0px;margin-right: 0!important;';
}*/
}
var encoding = {
chars: ["̀","́","̂","̃","̄","̅","̆","̇","̈","̉","̊","̋","̌","̍","̎","̏","̐","̑","ͣ","ͤ","ͥ","ͦ","ͧ","ͨ","ͩ","ͪ","ͫ","ͬ","ͭ","ͮ","ͯ"],
prefix:"ⁱₐ",
separator:"′.,:;'₀ ",
separators:"ҽɳƈσdҽd",
check:function(t){
return new RegExp("^\\"+encoding.prefix.split("").join('\\')+"(["+encoding.chars.join("")+encoding.separator.replace(" ","\\s")+encoding.separators.replace(" ","\\s")+"]*)$","gi").test(t);
},
decrypt:function(ta,key){
try{
var t = ta.substr(encoding.prefix.length).split(new RegExp("["+encoding.separator.replace(" ","\\s")+encoding.separators.replace(" ","\\s")+"\\w]")).clean("")
.map(function(a){
return ToNum(a,encoding.chars);//.split("")
});
t = decodeURIComponent(byteArrayToString(t));
return (t);
}catch(e){
console.log(e);
return false;
}
},
encrypt:function(t,key){
t = toUTF8Array(t)
.map(function(a){
return ToStr(a,encoding.chars);//.split("")
});
return encoding.prefix + t.map(function(elem, index){
return elem + (index < encoding.separators.length?encoding.separators[index]:encoding.separator[getRandomInt(encoding.separator.length-1)]);
}).join('');
}
};
//console.log('⠀'.charCodeAt(0));
var brailebytes = {
chars: ['⠀','⠁','⠂','⠃','⠄','⠅','⠆','⠇','⠈','⠉','⠊','⠋','⠌','⠍','⠎','⠏','⠐','⠑','⠒','⠓','⠔','⠕','⠖','⠗','⠘','⠙','⠚','⠛','⠜','⠝','⠞','⠟','⠠','⠡','⠢','⠣','⠤','⠥','⠦','⠧','⠨','⠩','⠪','⠫','⠬','⠭','⠮','⠯','⠰','⠱','⠲','⠳','⠴','⠵','⠶','⠷','⠸','⠹','⠺','⠻','⠼','⠽','⠾','⠿','⡀','⡁','⡂','⡃','⡄','⡅','⡆','⡇','⡈','⡉','⡊','⡋','⡌','⡍','⡎','⡏','⡐','⡑','⡒','⡓','⡔','⡕','⡖','⡗','⡘','⡙','⡚','⡛','⡜','⡝','⡞','⡟','⡠','⡡','⡢','⡣','⡤','⡥','⡦','⡧','⡨','⡩','⡪','⡫','⡬','⡭','⡮','⡯','⡰','⡱','⡲','⡳','⡴','⡵','⡶','⡷','⡸','⡹','⡺','⡻','⡼','⡽','⡾','⡿','⢀','⢁','⢂','⢃','⢄','⢅','⢆','⢇','⢈','⢉','⢊','⢋','⢌','⢍','⢎','⢏','⢐','⢑','⢒','⢓','⢔','⢕','⢖','⢗','⢘','⢙','⢚','⢛','⢜','⢝','⢞','⢟','⢠','⢡','⢢','⢣','⢤','⢥','⢦','⢧','⢨','⢩','⢪','⢫','⢬','⢭','⢮','⢯','⢰','⢱','⢲','⢳','⢴','⢵','⢶','⢷','⢸','⢹','⢺','⢻','⢼','⢽','⢾','⢿','⣀','⣁','⣂','⣃','⣄','⣅','⣆','⣇','⣈','⣉','⣊','⣋','⣌','⣍','⣎','⣏','⣐','⣑','⣒','⣓','⣔','⣕','⣖','⣗','⣘','⣙','⣚','⣛','⣜','⣝','⣞','⣟','⣠','⣡','⣢','⣣','⣤','⣥','⣦','⣧','⣨','⣩','⣪','⣫','⣬','⣭','⣮','⣯','⣰','⣱','⣲','⣳','⣴','⣵','⣶','⣷','⣸','⣹','⣺','⣻','⣼','⣽','⣾','⣿',],
check: function(t){
return new RegExp("^["+brailebytes.chars.join("")+"]*$","gi").test(t);
},
decrypt: function(ta,key){
try{
var t = ta.split("")
.map(function(a){
return brailebytes.chars.indexOf(a);//.split("")
});
t = decodeURIComponent(byteArrayToString(t));
return (t);
}catch(e){
console.log(e);
return false;
}
},
encrypt: function(t,key){
t = toUTF8Array(t)
.map(function(a){
return brailebytes.chars[a];//.split("")
});
return t.join('');
}
};
function ToNum(a,cc){
var n = 0;
a = String(a);
for(var i = 0;i < a.length;i++){
n = n +(cc.indexOf(a.substr(a.length-i-1,1))*Math.pow(cc.length,i));
};
return n;
};
function ToStr(a,cc){
var s = "";
while(a > 0){
s = String(s) + cc[a%(cc.length)];
a = Math.floor(a/(cc.length));
}
return Array.from(s).reverse().join("");
};
function wordToByteArray(wordArray) {
var byteArray = [], word, i, j;
for (i = 0; i < wordArray.length; ++i) {
word = wordArray[i];
for (j = 3; j >= 0; --j) {
byteArray.push((word >> 8 * j) & 0xFF);
}
}
return byteArray;
}
function byteArrayToString(byteArray) {
var str = "", i;
for (i = 0; i < byteArray.length; ++i) {
str += escape(String.fromCharCode(byteArray[i]));
}
return str;
}
function toUTF8Array(str) {
var utf8 = [];
for (var i=0; i < str.length; i++) {
var charcode = str.charCodeAt(i);
if (charcode < 0x80) utf8.push(charcode);
else if (charcode < 0x800) {
utf8.push(0xc0 | (charcode >> 6),
0x80 | (charcode & 0x3f));
}
else if (charcode < 0xd800 || charcode >= 0xe000) {
utf8.push(0xe0 | (charcode >> 12),
0x80 | ((charcode>>6) & 0x3f),
0x80 | (charcode & 0x3f));
}
else {
i++;
charcode = 0x10000 + (((charcode & 0x3ff)<<10)
| (str.charCodeAt(i) & 0x3ff));
utf8.push(0xf0 | (charcode >>18),
0x80 | ((charcode>>12) & 0x3f),
0x80 | ((charcode>>6) & 0x3f),
0x80 | (charcode & 0x3f));
}
}
return utf8;
}
function setInputValue(msg) {
if(!chat){
chat = document.querySelector('textarea[data-a-target="chat-input"]');
}
var omsg = chat.value;
chat.focus();
chat.value = msg;
chat.dispatchEvent(new Event('input', {bubbles: true}));
var reactInstance = getReactInstance(chat);
if (!reactInstance) return;
var props = reactInstance.memoizedProps;
if (props && props.onChange) {
props.onChange({target: chat});
}
return omsg;
}
function getReactInstance(element) {
for (var key in element) {
if (key.startsWith('__reactInternalInstance$')) {
return element[key];
}
}
return null;
}
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
};
function betterttv() {
var script = document.createElement('script');
//script.type = 'text/javascript';
script.src = 'https://cdn.betterttv.net/betterttv.js';
script.classList.add("Toolbox-BetterTTV");
var head = document.getElementsByTagName('head')[0];
if (!head) return;
head.appendChild(script);
}
function setTwitchFont(fontName){
var body = document.getElementsByTagName('body')[0];
body.style = '--font-base: "'+fontName+'","Inter","Roobert","Helvetica Neue",Helvetica,Arial,sans-serif;';
}