// ==UserScript==
// @name YGN REDBOT V4.7
// @namespace http://tampermonkey.net/
// @version 4.7
// @description gartic io hack script
// @author YGN
// @match https://gartic.io/*
// @match https://*/*?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8
// @match https://*/*?ko=s&__cpo=aHR0cHM6Ly9zdGFydC5kdWNrZHVja2dvLmNvbQ
// @match https://www.croxyproxy.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=gartic.io
// @run-at document-end
// @grant GM_setValue
// @grant GM_addValueChangeListener
// @grant GM_addStyle
// ==/UserScript==
console.log("ygn redbot v4.7 running.")
function bc(ygn,i){return i==undefined?document.getElementsByClassName(ygn):document.getElementsByClassName(ygn)[i]}
function bt(ygn,i){return i==undefined?document.getElementsByTagName(ygn):document.getElementsByTagName(ygn)[i]}
function bi(ygn){return document.getElementById(ygn)}
function setconf(key,val){let data=JSON.parse(localStorage.getItem("rbconf"));data[key]=val;localStorage.setItem("rbconf",JSON.stringify(data))}
function getconf(key){return JSON.parse(localStorage.getItem("rbconf"))[key]}
function rbcmd(obj){let data=obj;let allconf=JSON.parse(localStorage.getItem("rbconf"));data.randint=Math.random()*10000;let merged=Object.assign({},data,allconf);GM_setValue("rbcmd",JSON.stringify(merged))}
if(window.location.href.indexOf("ygnnext")>-1){sessionStorage.setItem("ygnnext",window.location.href.split("ygnnext=")[1]);document.getElementsByClassName('fa fa-arrow-right')[0].dispatchEvent(new MouseEvent("click",{bubbles:true,button:0}))}
if(window.location.href.indexOf("servers")!=-1){let inter=setInterval(function(){if(document.querySelector("input[name=proxyServerId]")){document.body.innerHTML+=`<form class="myform" method="POST" action="/requests?fso="><input type="hidden" name="url" value="https://gartic.io"><input type="hidden" name="proxyServerId" value="`+sessionStorage.getItem("ygnnext")+`"><input type="hidden" name="csrf" value="`+document.querySelector("input[name=csrf]").value+`"><input type="hidden" name="demo" value="0"><input type="hidden" name="frontOrigin" value="https://www.croxyproxy.com"></form>`;document.querySelector(".myform").submit();clearInterval(inter)}})}
if(window.location.href.indexOf("_cpo=aHR0cHM6Ly9zdGFydC5kdWNrZHVja2dvLmNvbQ")>-1){window.location.href="https://"+window.location.href.split("/")[2]+"/?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8"}
window.location.href.indexOf("51.")>-1?window.close():0
if(window.location.href.indexOf("gartic.io")>-1){ //main control
let roomusers=[],reftime,refinter,refcc,prem=300
const proxylist=[{"id":"43","ip":"108.181.21.229"},{"id":"44","ip":"108.181.33.135"},{"id":"45","ip":"108.181.33.117"},{"id":"46","ip":"108.181.33.119"},{"id":"47","ip":"108.181.34.57"},{"id":"48","ip":"108.181.34.71"},{"id":"49","ip":"108.181.30.85"},{"id":"50","ip":"108.181.34.149"},{"id":"51","ip":"108.181.32.49"},{"id":"52","ip":"108.181.32.73"},{"id":"53","ip":"108.181.32.55"},{"id":"54","ip":"108.181.32.61"},{"id":"56","ip":"108.181.32.59"},{"id":"63","ip":"108.181.43.67"},{"id":"64","ip":"108.181.34.45"},{"id":"68","ip":"108.181.24.243"},{"id":"69","ip":"108.181.34.177"},{"id":"92","ip":"108.181.34.157"},{"id":"144","ip":"195.3.223.166"},{"id":"145","ip":"195.3.223.164"},{"id":"146","ip":"146.19.24.89"},{"id":"149","ip":"195.3.222.15"},{"id":"150","ip":"185.16.39.161"},{"id":"154","ip":"95.214.53.145"},{"id":"157","ip":"95.214.53.152"},{"id":"161","ip":"108.181.8.179"},{"id":"162","ip":"108.181.9.39"},{"id":"163","ip":"108.181.11.39"},{"id":"164","ip":"108.181.6.89"},{"id":"172","ip":"208.87.240.203"},{"id":"173","ip":"208.87.240.219"},{"id":"174","ip":"208.87.240.251"},{"id":"176","ip":"208.87.241.149"},{"id":"177","ip":"108.181.4.237"},{"id":"175","ip":"108.181.4.237"},{"id":"178","ip":"208.87.241.209"},{"id":"179","ip":"108.181.4.241"},{"id":"181","ip":"208.87.240.35"},{"id":"182","ip":"108.181.5.29"},{"id":"180","ip":"208.87.242.233"},{"id":"183","ip":"208.87.242.233"},{"id":"184","ip":"208.87.240.67"},{"id":"185","ip":"95.214.53.48"},{"id":"186","ip":"195.3.222.40"},{"id":"187","ip":"185.225.191.49"},{"id":"189","ip":"185.225.191.57"},{"id":"198","ip":"108.181.11.173"},{"id":"199","ip":"108.181.11.193"},{"id":"200","ip":"108.181.11.137"},{"id":"201","ip":"108.181.11.171"},{"id":"202","ip":"108.181.11.175"},{"id":"203","ip":"185.16.39.144"},{"id":"204","ip":"185.16.39.213"},{"id":"205","ip":"178.211.139.238"},{"id":"216","ip":"185.246.84.18"},{"id":"219","ip":"185.246.84.66"}]
localStorage.getItem("rbconf")==undefined?localStorage.setItem("rbconf",'{"server":"","cc":"","readybotsc":0,"rejoin":1,"syncjoin":1,"kickonjoin":0,"kickjoined":0,"joinmsg":"","proxyc":0,"activebotsc":0,"botname":"","roomlink":"","botavatar":0}'):0
window.addEventListener("message",function(msg){
msg.data[0]=="@"?rbcmd({"c":"skick","from":"main","id":msg.data.split("@")[1]}):0
})
function startrefinter(){
refcc=0
refinter=setInterval(function(){
refcc++;
refcc%10==0?rbcmd({"c":"chat","from":"main","chatdata":"redbot"+Math.ceil(Math.random()*10000)}):0
bc("reftime",0).innerText=refcc+"/"+prem+" sec. then bots'll leave"
if(refcc>(prem-1)){bc("leavebtnhtml",0).click();}
},1000)
}
function sethtml(){
let rbcontainer=`
<div class="rbcontainer">
redbot v4.7 <input class="resetbtnhtml" type="submit" value=" reset "><br>
<span>active bots: <b class="activebotschtml">0</b> <input class="addbothtml" type="submit" value=" + "></span><br>
<input class="preavatarbtnhtml" type="submit" value=" ◄ "> <img class="avatarimghtml" width="18" src="https://gartic.io/static/images/avatar/svg/0.svg"> <input class="nextavatarbtnhtml" type="submit" value=" ► "><br>
<input class="roomlinkinphtml" type="text" placeholder="target room link"><br>
<input class="botnameinphtml" type="text" placeholder="bot name"><br>
<input class="joinmsginphtml" type="text" placeholder="join message"><br>
<label><input class="syncjoinchckhtml" type="checkbox">sync join <span class="syncjoinviewhtml">(0/0)</span></label> <label><input class="rejoinchckhtml" type="checkbox">rejoin</label><br>
<label><input class="kickonjoinchckhtml" type="checkbox">kick first player on join</label><br>
<label><input class="kickjoinedchckhtml" type="checkbox">kick joined player</label><br>
<input class="joinbtnhtml jl" type="submit" value=" join ">
<input class="leavebtnhtml jl" type="submit" value=" leave "><br>
<span class="reftime">0/`+prem+` sec. then bots'll leave</span><hr>
<input class="chatmsginphtml roomcontrol" type="text" placeholder="chat"><input class="chatsendbtnhtml" type="submit" value=" send "><br>
<input class="answermsginphtml roomcontrol" type="text" placeholder="answer"><input class="answersendbtnhtml" type="submit" value=" send "><br>
<input class="reportbtnhtml" type="submit" value=" report draw "><br>
<div class="skicks"></div>
</div>
<div class="showhide">←</div>
`
let style=`
#background{z-index:999;width:0px;height:0px;position:fixed;left:0px;top:0px;}
.showhide{z-index:999999999;display:block !important;position:fixed;left:195px;background:black;padding:5px;border-radius:5px;cursor:pointer;}
.rbcontainer{border-radius:5px;padding:5px;text-align:center;font-family:cursive;background:black;z-index:9999999;display:block !important;position:fixed;left:0px;top:0px;}
.rbcontainer *{text-align:center;font-size:11pt !important;box-sizing:border-box;border-radius:5px;}
.rbcontainer input[type=text],.rbcontainer input[type=submit]{height:23px;}
.roomcontrol{width:135px !important;}.reportbtnhtml{width:100%;}.jl{width:47%;}
.skicks{display:flex;flex-wrap:wrap;max-width:188px;max-height:150px;overflow-y:auto;}
.reftime{font-size:8pt !important;}.joincont{width:50%}
`
bi("background").innerHTML+=rbcontainer;GM_addStyle(style);setconf("readybotsc",0)
bc("botnameinphtml",0).value=getconf("botname")
bc("roomlinkinphtml",0).value=getconf("roomlink")
bc("joinmsginphtml",0).value=getconf("joinmsg")
bc("avatarimghtml",0).src="https://gartic.io/static/images/avatar/svg/"+getconf("botavatar")+".svg"
bc("kickonjoinchckhtml",0).checked=getconf("kickonjoin")
bc("kickjoinedchckhtml",0).checked=getconf("kickjoined")
bc("syncjoinchckhtml",0).checked=getconf("syncjoin")
bc("rejoinchckhtml",0).checked=getconf("rejoin")
bc("addbothtml",0).addEventListener("click",function(){let url="https://www.croxyproxy.com/?ygnnext="+proxylist[getconf("proxyc")].id;window.open(url,"_blank");setconf("proxyc",getconf("proxyc")+1);getconf("proxyc")>55?setconf("proxyc",0):0;})
bc("resetbtnhtml",0).addEventListener("click",function(){if(confirm("redbot 4.7 reset?")){rbcmd({"c":"reset","from":"main"});}else{alert("cancelled")}})
bc("preavatarbtnhtml",0).addEventListener("click",function(){setconf("botavatar",getconf("botavatar")-1);getconf("botavatar")<0?setconf("botavatar",36):0;bc("avatarimghtml",0).src="https://gartic.io/static/images/avatar/svg/"+getconf("botavatar")+".svg";})
bc("nextavatarbtnhtml",0).addEventListener("click",function(){setconf("botavatar",getconf("botavatar")+1);getconf("botavatar")>36?setconf("botavatar",0):0;bc("avatarimghtml",0).src="https://gartic.io/static/images/avatar/svg/"+getconf("botavatar")+".svg";})
bc("roomlinkinphtml",0).addEventListener("input",function(){setconf("roomlink",bc("roomlinkinphtml",0).value)})
bc("botnameinphtml",0).addEventListener("input",function(){setconf("botname",bc("botnameinphtml",0).value)})
bc("joinmsginphtml",0).addEventListener("input",function(){setconf("joinmsg",bc("joinmsginphtml",0).value);})
bc("kickonjoinchckhtml",0).addEventListener("change",function(){setconf("kickonjoin",+bc("kickonjoinchckhtml",0).checked);rbcmd({"c":"updateconf","from":"main"});})
bc("kickjoinedchckhtml",0).addEventListener("change",function(){setconf("kickjoined",+bc("kickjoinedchckhtml",0).checked);rbcmd({"c":"updateconf","from":"main"});})
bc("syncjoinchckhtml",0).addEventListener("change",function(){setconf("syncjoin",+bc("syncjoinchckhtml",0).checked);rbcmd({"c":"updateconf","from":"main"});})
bc("rejoinchckhtml",0).addEventListener("change",function(){setconf("rejoin",+bc("rejoinchckhtml",0).checked);rbcmd({"c":"updateconf","from":"main"});})
bc("chatsendbtnhtml",0).addEventListener("click",function(){rbcmd({"c":"chat","from":"main","chatdata":bc("chatmsginphtml",0).value});bc("chatmsginphtml",0).value=""})
bc("answersendbtnhtml",0).addEventListener("click",function(){rbcmd({"c":"answer","from":"main","answerdata":bc("answermsginphtml",0).value});bc("answermsginphtml",0).value=""})
bc("reportbtnhtml",0).addEventListener("click",function(){rbcmd({"c":"reportdraw","from":"main"})})
bc("showhide",0).addEventListener("mousedown",function(){if(bc("showhide",0).innerText=="←"){bc("rbcontainer",0).style.left="-999px";bc("showhide",0).style.left="0px";bc("showhide",0).innerText="redbot v4.7 →"}})
bc("showhide",0).addEventListener("mouseup",function(){if(bc("showhide",0).innerText=="redbot v4.7 →"){bc("rbcontainer",0).style.left="0px";bc("showhide",0).style.left="195px";bc("showhide",0).innerText="←"}})
bc("joinbtnhtml",0).addEventListener("click",function(){
if(bc("joinbtnhtml",0).value.indexOf("wait")==-1){
startrefinter()
if(bc("botnameinphtml",0).value.trim()==""||bc("roomlinkinphtml",0).value.trim()==""&&getconf("activebotsc")>0){alert("bot name, target room link and least 1 bot required")}else{
setconf("activebotsc",0)
bc("activebotschtml",0).innerText=0
rbcmd({"c":"ping","from":"main"})
setconf("readybotsc",0)
fetch("https://gartic.io/serverViewer?v3=1&room="+bc("roomlinkinphtml",0).value.split("/")[3]).then(x=>x.text()).then(x=>{
let sv=x.split("//")[1].split(".")[0]
rbcmd({"c":"preparetojoin","from":"main","serv":sv,"cc":x.split("c=")[1]})
let inter=setInterval(function(){
if(getconf("readybotsc")>(getconf("activebotsc")-1)){
clearInterval(inter)
rbcmd({"c":"join","from":"main"})
console.log("joinr")
}
},100);
})
}
}
})
bc("leavebtnhtml",0).addEventListener("click",function(){
bc("joinbtnhtml",0).value=" wait 5s "
setTimeout(function(){bc("joinbtnhtml",0).value=" join "},5000)
clearInterval(refinter);bc("reftime",0).innerText="0/"+prem+" sec. then bots'll leave";roomusers.length=0;bc("skicks",0).innerHTML=``;setconf("readybotsc",0);rbcmd({"c":"leave","from":"main"});bc("syncjoinviewhtml",0).innerText="("+getconf("readybotsc")+"/"+getconf("activebotsc")+")"
})
}
setInterval(function(){
document.title="main"
document.getElementById("popUp").style.display=="block"&&document.getElementsByClassName("icYes").length>-1?document.getElementsByClassName("btYellowBig ic-yes")[0].click():0;
bi("background")&&bc("rbcontainer").length==0?sethtml():0
getconf("syncjoin")?bc("syncjoinviewhtml",0).innerText="("+getconf("readybotsc")+"/"+getconf("activebotsc")+")":0;
setconf("activebotsc",0)
bc("activebotschtml",0).innerText=0
rbcmd({"c":"ping","from":"main"})
if(window.location.href=="https://gartic.io/rooms"){
for(let x of bc("scrollElements",0).getElementsByTagName("a")){if(x.outerHTML.indexOf("roomwatch")==-1){
x.innerHTML+=`<input class="roomwatch" type="submit" value=" watch " onclick="window.location.href='`+x.href+`/viewer'">`
}}
}
},1000)
function updateskickmenu(){
bc("skicks",0).innerHTML=""
roomusers.forEach(x=>{
bc("skicks",0).innerHTML+=`<input type="submit" value=" `+x.nick+` " onclick="window.postMessage('@`+x.id+`')">`
})
}
GM_addValueChangeListener("rbcmd",function(a,b,c,d){
let data=JSON.parse(c)
if(data.from=="bot"){
//data.c!="ping"&&data.c!="pong"?console.log(data):0
if(data.c=="pong"){
setconf("activebotsc",getconf("activebotsc")+1)
bc("activebotschtml",0).innerText=getconf("activebotsc")
}
if(data.c=="addbotid"){
data.users.forEach(x=>{JSON.stringify(roomusers).indexOf(x.id)==-1?roomusers.push(x):0})
updateskickmenu()
}
if(data.c=="adduser"){
JSON.stringify(roomusers).indexOf(data.user.id)==-1?roomusers.push(data.user):0
updateskickmenu()
}
if(data.c=="removeroomuser"){
let user=data.tid
for(let i=0;i<roomusers.length;i++){typeof(roomusers[i].id)==='undefined'?0:roomusers[i].id==user?roomusers.splice(i,1):0}
updateskickmenu()
}
if(data.c=="ready"){setconf("readybotsc",getconf("readybotsc")+1);getconf("syncjoin")?bc("syncjoinviewhtml",0).innerText="("+getconf("readybotsc")+"/"+getconf("activebotsc")+")":0;}
}
})
}
if(window.location.href.indexOf("_cpo=aHR0cHM6Ly9nYXJ0aWMuaW8")>-1){ //bot control
let ws,xdata,inter,join=0,inter2,botlist=[],oldepoch=Date.now(),inter4,nick="bot"+Math.ceil(Math.random()*10000)
setInterval(function(){document.title="bot";/*document.body.innerHTML="redbot v4.7"*/},1000)
function waitjoin(){
inter2=setInterval(function(){
if(join==1){
clearInterval(inter2)
ws.send('42[3,{"v":20000,"nick":"'+nick+'","avatar":'+xdata.botavatar+',"platform":0,"sala":"'+xdata.roomlink.split("/")[3].slice(2)+'"}]')
}
},10)
}
function joinprocess(){
clearInterval(inter);clearInterval(inter2);clearInterval(inter4)
fetch("https://"+location.href.split("/")[2]+"/server?check=1&v3=1&room="+xdata.roomlink+"&__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8").then(x=>x.text()).then(x=>{
let wsurl='wss://'+xdata.serv+'.gartic.io/socket.io/?c='+x.split("c=")[1]+'&EIO=3&transport=websocket'
let wsn="wss://"+location.origin.split("/")[2]+"/__cpw.php?u="+btoa(wsurl)+"&o=aHR0cHM6Ly9nYXJ0aWMuaW8="
nick=xdata.botname+Math.ceil(Math.random()*10000)
ws = new WebSocket(wsn)
ws.onclose=function(){clearInterval(inter);clearInterval(inter2);clearInterval(inter4)}
ws.onmessage=function(msg){
if(msg.data=="40"){xdata.syncjoin?waitjoin():ws.send('42[3,{"v":20000,"nick":"'+nick+'","avatar":'+xdata.botavatar+',"platform":0,"sala":"'+xdata.roomlink.split("/")[3].slice(2)+'"}]')}
if(msg.data.indexOf("42")==0){
let obj=JSON.parse(msg.data.slice(2))
if(obj[0]=="5"){
ws.lid=obj[1]
ws.id=obj[2]
ws.roomcode=obj[3]
ws.users=obj[5]
ws.send('42[46,'+ws.id+']')
rbcmd({"c":"addbotid","from":"bot","botid":ws.lid,"users":ws.users})
rbcmd({"c":"addbotid","from":"main","botid":ws.lid})
inter=setInterval(function(){ws.send('42[42,'+ws.id+']');ws.send('2')},30000)
inter4=setInterval(function(){fetch("https://"+location.href.split("/")[2]+"/ping?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8");},10000)
xdata.joinmsg!=""?ws.send('42[11,'+ws.id+',"'+xdata.joinmsg+'"]'):0
if(xdata.kickonjoin){JSON.stringify(botlist).indexOf(ws.users[0].id)==-1?typeof(ws.users[0].id)=="string"?ws.send('42[45,'+ws.id+',["'+ws.users[0].id+'",true]]'):ws.send('42[45,'+ws.id+',['+ws.users[0].id+',true]]'):0}
}
if(obj[0]=="6"&&xdata.rejoin&&obj[1]!=null){ws=null;fetch("https://"+location.href.split("/")[2]+"/logout?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8").then(x=>{joinprocess()})}
if(obj[0]=="23"&&xdata.kickjoined){setTimeout(function(){if(obj[1].id!=ws.lid&&JSON.stringify(botlist).indexOf(obj[1].id)==-1&&Date.now()-oldepoch>1000){oldepoch=Date.now();typeof(obj[1].id)=="string"?ws.send('42[45,'+ws.id+',["'+obj[1].id+'",true]]'):ws.send('42[45,'+ws.id+',['+obj[1].id+',true]]')}},500)}
if(obj[0]=="24"){rbcmd({"c":"removeroomuser","tid":obj[1],"from":"bot"})}
if(obj[0]=="23"&&JSON.stringify(botlist).indexOf(obj[1].id)==-1){rbcmd({"c":"adduser","from":"bot","user":obj[1]});}
}
}
ws.onopen=function(){rbcmd({"c":"ready","from":"bot"})}
})
}
GM_addValueChangeListener("rbcmd",function(a,b,c,d){
let data=JSON.parse(c)
if(data.from=="main"){
//data.c!="ping"&&data.c!="pong"?console.log(data):0
if(data.c=="ping"){rbcmd({"c":"pong","from":"bot"});}
if(data.c=="leave"){botlist.length=0;join=0;ws.send('42[24,'+ws.id+']');ws.close()}
if(data.c=="addbotid"){JSON.stringify(botlist).indexOf(data.botid)==-1?botlist.push(data.botid):0;}
if(data.c=="reset"){fetch("https://"+location.href.split("/")[2]+"/logout?__cpo=aHR0cHM6Ly9nYXJ0aWMuaW8").then(x=>{window.location.reload()});ws.send('42[24,'+ws.id+']');}
if(data.c=="preparetojoin"){xdata=data;joinprocess()}
if(data.c=="updateconf"){xdata=data;}
if(data.c=="join"){join=1}
if(data.c=="reportdraw"){ws.send('42[35,'+ws.id+']')}
if(data.c=="skick"){data.id.length>20?ws.send('42[45,'+ws.id+',["'+data.id+'",true]]'):ws.send('42[45,'+ws.id+',['+data.id+',true]]')}
if(data.c=="answer"){ws.send('42[13,'+ws.id+',"'+data.answerdata+'"]')}
if(data.c=="chat"){ws.send('42[11,'+ws.id+',"'+data.chatdata+'"]')}
}
})
}