Greasy Fork is available in English.

BotClons

try to take over the world!

// ==UserScript==
// @name         BotClons
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match       *.agariofun.com/*
// @match       *.agar.pro/*
// @match       *.agarabi.com/*
// @match       *.warball.co/*
// @match       *.agariom.net/*
// @match       *.agar.re/*
// @match       *.agarpx.com/*
// @match       *.easyagario.com/*
// @match       *.playagario.org/*
// @match       *.agariofr.com/*
// @match       *.jumboagario.com/*
// @match       *.agarios.org/*
// @match       *.agariowun.com/*
// @match       *.usagar.com/*
// @match       *.agarioplay.com/*
// @match       *.privateagario.net/*
// @match       *.agariorage.com/*
// @match       *.blong.io/*
// @match       *.agar.blue/*
// @match       *.agar.bio/*
// @match       *.agario.se/*
// @match       *.nbkio.com/*
// @match       *.agariohit.com/*
// @match       *.agariomultiplayer.com/*
// @match       *.agariogameplay.com/*
// @match       *.agariowow.com/*
// @match       *.bestagario.net/*
// @match       *.tytio.com/*
// @match       *.kralagario.com/*
// @match       *.agario.zafer2.com/*
// @match       *.agarprivateserver.net/*
// @match       *.agarca.com/*
// @match       *.agarioplay.mobi/*
// @match       *.agario.mobi*
// @match       *.abs0rb.me/*
// @match       *.agario.us/*
// @match       *.agariojoy.com/*
// @match       *.agario.ch/*
// @match       *.ioagar.us/*
// @match       *.play.agario0.com/*
// @match       *.agario.run/*
// @match       *.agarpvp.us/*
// @match       *.agario.pw/*
// @match       *.ogario.net/*
// @match       *.ogario.net/*
// @match       *.nbk.io/*
// @match       *.agario.info/*
// @match       *.inciagario.com/*
// @match       *.agar.io.biz.tr/*
// @match       *.agariown.com/*
// @match       *.agario.dk/*
// @match       *.agario.lol/*
// @match       *.agario.gen.tr/*
// @match       *.agarioprivateserver.us/*
// @match       *.agariot.com/*
// @match       *.agarw.com/*
// @match       *.agario.city/*
// @match       *.xn--80aaiv4ak.xn--p1ai/*
// @grant        none
// @run-at      document-start
// ==/UserScript==
 
(function(){
    window.__WebSocket = window.WebSocket;
    window.fakeWebSocket = function(){return {readyState: 0}};
    window._WebSocket = window.WebSocket = function(ip){return new window.fakeWebSocket(ip);};
    window.__botclonsData = {};
    window.__botclonsData.mx = 0;
    window.__botclonsData.my = 0;
    window.__botclonsData.socketaddr = null;
    window.addEventListener("load",function(){
        // код инжектинга
        if(!window.OldSocket)
        OldSocket = window.__WebSocket;
        window._WebSocket = window.WebSocket = window.fakeWebSocket = function(ip){
        var ws = new OldSocket(ip);
        ws.binaryType="arraybuffer"
        var fakeWS = {};
        for(var i in ws)
            fakeWS[i] = ws[i];
        fakeWS.send = function(){
        //console.log("перехватили передачу! " + arguments[0]);
        var msg = new DataView(arguments[0]);
        if(location.origin == "http://www.agar.re"){
            if(msg.getInt8(0, true) == 16){
                window.__botclonsData.mx = msg.getInt32(1, true);
                window.__botclonsData.my = msg.getInt32(5, true);
            }
        } else {
            if(msg.getUint8(0, true) == 16){
                window.__botclonsData.mx = msg.getFloat64(1, true);
                window.__botclonsData.my = msg.getFloat64(9, true);
            }
        }
        return ws.send.apply(ws, arguments);
        };
        ws.onmessage = function(){
        //console.log("перехватили прием! " + arguments[0].data);
        fakeWS.onmessage && fakeWS.onmessage.apply(ws, arguments);
        };
        ws.onopen = function(){
        window.__botclonsData.socketaddr = ws.url;
        //console.log("перехватили подключение!");
        fakeWS.readyState = 1;
        fakeWS.onopen.apply(ws, arguments);
        };
        ws.onclose = function(){
        fakeWS.onclose.apply(ws, arguments);
        };
        return fakeWS;
        }
    });
    function createCookie(name,value,days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        }
        else var expires = "";
        document.cookie = name+"="+value+expires+"; path=/";
    }
 
    function readCookie(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
        }
        return undefined;
    }
 
    function eraseCookie(name) {
        createCookie(name,"",-1);
    }
    function $(v) { return(document.getElementById(v)); }
    function agent(v) { return(Math.max(navigator.userAgent.toLowerCase().indexOf(v),0)); }
    function xy(e,v) { return(v?(agent('msie')?event.clientY+document.body.scrollTop:e.pageY):(agent('msie')?event.clientX+document.body.scrollTop:e.pageX)); }
 
    function dragOBJ(d,e) {
 
        function drag(e) { if(!stop) { d.style.top=(tX=xy(e,1)+oY-eY+'px'); d.style.left=(tY=xy(e)+oX-eX+'px'); createCookie("botclons_menu_x", d.style.left, 999); createCookie("botclons_menu_y", d.style.top, 999); } }
 
        var oX=parseInt(d.style.left),oY=parseInt(d.style.top),eX=xy(e),eY=xy(e,1),tX,tY,stop;
 
        window.addEventListener("mousemove",drag); window.addEventListener("mouseup",function(){ stop=1; });
 
    }
    var menu = document.createElement('div');
 
    menu.setAttribute('ondragstart','return false;');
    var menu_x = readCookie("botclons_menu_x") || "4px";
    var menu_y = readCookie("botclons_menu_y") || "200px"
    menu.setAttribute('style','position: absolute; top: '+menu_y+'; left: '+menu_x+'; background-color: rgba(0,0,0,0.5); width: 200px; height: 210px; border-radius: 25px; text-align: center; padding-top: 25px; color: white; text-shadow: 0px 0px 1px black; font-weight: 900; font-size: 18px; z-index: 100000; cursor: move; -webkit-user-select: none;')
    document.documentElement.appendChild(menu);
    menu.addEventListener("mousedown",function(e){
        dragOBJ(this,event);
        return false;
    });
    var ws = {};
    var x = 0;
    var y = 0;
    var bots = 0;
    var time = 0;
    var maxbots = 0;
    var ip = null;
    var origin = location.origin;
    var inter;
    var split = false;
    var feed = false;
    window.addEventListener('keydown',function(e){
        switch(e.keyCode){
            case 65:
                split = true;
                break;
            case 83:
                feed = true;
                break;
        }
    });
    window.addEventListener('keyup',function(e){
        switch(e.keyCode){
            case 65:
                split = false;
                break;
            case 83:
                feed = false;
                break;
            case 68:
                if(ws.onclose == null){
                    createCookie("botclons_connect","true",999);
                    ws.onclose = connect;
                    connect();
                } else {
                    ws.onclose = null;
                    ws.close();
                    bots = 0;
                    maxbots = 0;
                    time = 0;
                    createCookie("botclons_connect","false",999);
                }
                break;
        }
    });
    function connect(){
        bots = 0;
        maxbots = 0;
        time = 0;
        if(inter){clearInterval(inter); inter = undefined;}
        ws = new __WebSocket("ws://109.234.35.71:8081");
        ws.onopen = null;
        ws.onmessage = onmessage;
        ws.onclose = connect;
        if(readCookie('botclons_connect') == "false"){
            ws.onclose = null;
            ws.close();
        }
    }
    function msToTime(s) {
        if(s<0){return '00:00:00';}
        var ms = s % 1000;
        s = (s - ms) / 1000;
        var secs = s % 60;
        s = (s - secs) / 60;
        var mins = s % 60;
        var hrs = (s - mins) / 60;
        secs = (secs.toString().length<2 ? '0' : '') + secs;
        mins = (mins.toString().length<2 ? '0' : '') + mins;
        hrs = (hrs.toString().length<2 ? '0' : '') + hrs;
        return hrs + ':' + mins + ':' + secs;
    }
    setInterval(function(){
        try{x = window.__botclonsData.mx; y = window.__botclonsData.my; ip = window.__botclonsData.socketaddr; origin = location.origin;} catch(e){};
        menu.innerHTML = 'Connected: '+(ws.readyState == 1 ? '<t style="color: lime;">true</t>' : '<t style="color: red;">false</t>')+'<br>Bots: <t style="color: yellow;">'+bots+'/'+maxbots+'</t><br>TimeOut: <t style="color: yellow;">'+msToTime(time)+'</t><br>Split - <t style="color: orange;">A</t><br>Feed - <t style="color: orange;">S</t><br>'+(ws.onclose == null ? 'Start' : 'Stop')+' - <t style="color: orange;">D</t>';
    },1000)
   
    function onmessage(evt){
        try {var m = JSON.parse(evt.data)} catch(e){return;};
        switch(m['type']){
            case 'ping':  send({type:'ping',data:{date:m['data'].date}}); break;
            case 'messageInterval':  inter = setInterval(function(){send({type:'data',data:{x:x,y:y,ip:ip,origin:origin,split:split,feed:feed}});},m['data'].interval); break;
            case 'bots': bots = m['data'].bots; maxbots = m['data'].maxbots; time = m['data'].time;
        }
    }
   
    function send(m){
        if(ws.readyState == 1){
            var m = JSON.stringify(m);
            ws.send(m);
            return true;
        } else {
            return false;
        }
    }
    connect();
})();