Greasy Fork

Agar.io clone bots! And .io Bots 2021!

The best bots for agario clones! NOW OPEN SOURCED!

目前为 2021-11-12 提交的版本。查看 最新版本

// ==UserScript==
// @name         Agar.io clone bots! And .io Bots 2021!
// @namespace    Bots
// @version      v.18
// @description  The best bots for agario clones! NOW OPEN SOURCED!
// @author       Tatsuya & Raze
// @match        *.agario.boston/*
// @match        *.es.agar.live/*
// @match        *.aquar.io/*
// @match        *.agarz.com/*
// @match        *.oceanar.io/*
// @match        *.agarabi.net/*
// @match        *.agarblack.com/*
// @match        *.tr.agar.live/*
// @match        *.agar-io.live/*
// @match        *.agars.live/*
// @match        *.www.inciagario.net/*
// @match        *.agariott.com/*
// @match        *.agarr.live/*
// @match        *.agar.live/*
// @match        *.agario.zafer2.com/*
// @match        *.agario.work/*
// @match        *.agario.network/*
// @match        *.agar.rip/*
// @match        *.agar.chat/*
// @match        *.agario.nl/*
// @match        *.agariomoddedserver.com/*
// @match        *.agario.in/*
// @match        *.agario.id/*
// @match        *.agarplay.club/*
// @match        *.agariomodded.com/*
// @match        *.bestagario.org/*
// @match        *.agarprivateserver.com/*
// @match        *.agariohub.cc/*
// @match        *.agarr.live/*
// @match        *.agarprivateservers.org/*
// @match        *.agar.cc/*
// @match        *.agario.one/*
// @match        *.agar.team/*
// @match        *.agar.club/*
// @match        *.agarprivateservers.net/*
// @match        *.agario.tube/*
// @match        *.agarprivateserver.com/*
// @match        *.agario.cc/*
// @match        *.easyagario.icu/*
// @match        *.agario.red/*
// @run-at       document-end
// @icon         https://static.wikia.nocookie.net/jacksepticeye/images/2/2e/Agar.io_logo.png/revision/latest?cb=20190228055524
// @grant        none
// ==/UserScript==

class User {
    constructor() {
        this.BotAmount = 0;
        this.botamt = 0;
        window.started = false;
        this.verify();
    }

    verify() {
        // Removed verify code.
        this.addEssentials();
    }

    powerlineinject() {
        // removed.
    }

    addEssentials() {
        var parseOrigin = /(\w+)\:\/\/(\w+.\w+)/gi.exec(window.location.origin)[2];
        this.inject();
        this.HookInfo();
        if(parseOrigin == "oceanar.io") {
            this.addOceanarUI();
        } else if(parseOrigin == "aquar.io") {
            this.addAquarUI();
        } else {
            this.addUI();
        }
    }

    addAquarUI() {
        let cssStyles = document.createElement('head');
        let ui = document.createElement('div');
        ui.id = 'botcanvas';
        ui.style.background = 'rgba(0, 0, 0, 0.7)';
        ui.style.top = '-8px';
        ui.style.left = '-8px';
        ui.style.display = 'block';
        ui.style.position = 'absolute';
        ui.style['text-align'] = 'center';
        ui.style['font-size'] = '15px';
        ui.style.color = '#FFFFFF';
        ui.style.padding = '12px';
        ui.style['padding-right'] = '12px';
        ui.style['padding-top'] = '9px';
        ui.style['padding-bottom'] = '9px';
        ui.style.margin = '1%';
        ui.style['z-index'] = '1000000';
        ui.style['.sides'] = '12px';
        ui.style.border = '2px solid #ffffff';
        cssStyles.innerHTML +=
            '<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">';
        ui.innerHTML +=
            '<div id="tzfst">.io Bots!</div> <div id="u2ub1">Discord.gg/bAstbAfem9</div> <div id="u2ub1eqe">Loading...</div> <input type="submit" value="Start" div id = "Startbots"> <input type="submit" value="Stop" div id = "Stopbots">';
        document.body.appendChild(ui);
        var styles = `
        #fname {
        padding: 4px 0px;
        margin: 0 0 5px;
        width: 120px;
        }
        #u2ub1eqe {
        margin: 0 0 5px;
        font-family: Ubuntu;
        font-weight: bold;
        font-size: 15px;
        margin-top: 0px;
        color: #00ff00;
        }
        #u2ub1 {
        margin: 1px 0 5px;
        font-family: Ubuntu;
	    font-weight: bold;
	    font-size: 13px;
	    COLOR: #afafb6;
        cursor: pointer;
        }
        #tzfst {
        font-family: Ubuntu;
	    font-weight: bold;
	    font-size: 15px;
	    COLOR: WHITE;
        }
        #Startbots {
        margin: 1px 0 5px;
        border: none;
        padding: 1px 16px;
        border-radius: 4px;
        background-color: #4CAF50;
        color: white;
        cursor: pointer;
        }
        #Stopbots {
        margin: 1px 0 5px;
        border: none;
        padding: 1px 16px;
        border-radius: 4px;
        background-color: #DA2600;
        color: white;
        cursor: pointer;
        }
`
        var styleSheet = document.createElement("style")
        styleSheet.type = "text/css"
        styleSheet.innerText = styles
        document.head.appendChild(styleSheet);
        document.getElementById('Startbots').onclick = () => {
            if(!window.started) {
                startBots();
            }
        };
        document.getElementById('Stopbots').onclick = () => {
            if(window.started == true) {
                stopBots();
            }
        };
        document.getElementById('u2ub1').onclick = () => {
            location.href = 'https://discord.gg/bAstbAfem9';
        };
        setInterval(() => {
            document.getElementById('u2ub1eqe').innerText = `${this.botamt}/${this.BotAmount}`;
        }, 1000);
    }

    addOceanarUI() {
        let cssStyles = document.createElement('head');
        let ui = document.createElement('div');
        ui.id = 'botcanvas';
        ui.style.background = 'rgba(0, 0, 0, 0.7)';
        ui.style.top = '-8px';
        ui.style.left = '-8px';
        ui.style.display = 'block';
        ui.style.position = 'absolute';
        ui.style['text-align'] = 'center';
        ui.style['font-size'] = '15px';
        ui.style.color = '#FFFFFF';
        ui.style.padding = '12px';
        ui.style['padding-right'] = '12px';
        ui.style['padding-top'] = '9px';
        ui.style['padding-bottom'] = '9px';
        ui.style.margin = '1%';
        ui.style['z-index'] = '1000000';
        ui.style['.sides'] = '12px';
        ui.style.border = '2px solid #ffffff';
        cssStyles.innerHTML +=
            '<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">';
        ui.innerHTML +=
            '<div id="tzfst">.io Bots!</div> <div id="u2ub1">Discord.gg/bAstbAfem9</div> <div id="u2ub1eqe">Loading...</div> <input type="text" div id="fname" name="firstname" placeholder="Bot name..."><br> <input type="submit" value="Start" div id = "Startbots"> <input type="submit" value="Stop" div id = "Stopbots">';
        document.body.appendChild(ui);
        var styles = `
        #fname {
        padding: 4px 0px;
        margin: 0 0 5px;
        width: 120px;
        }
        #u2ub1eqe {
        margin: 0 0 5px;
        font-family: Ubuntu;
        font-weight: bold;
        font-size: 15px;
        margin-top: 0px;
        color: #00ff00;
        }
        #u2ub1 {
        margin: 1px 0 5px;
        font-family: Ubuntu;
	    font-weight: bold;
	    font-size: 13px;
	    COLOR: #afafb6;
        cursor: pointer;
        }
        #tzfst {
        font-family: Ubuntu;
	    font-weight: bold;
	    font-size: 15px;
	    COLOR: WHITE;
        }
        #Startbots {
        margin: 1px 0 5px;
        border: none;
        padding: 1px 16px;
        border-radius: 4px;
        background-color: #4CAF50;
        color: white;
        cursor: pointer;
        }
        #Stopbots {
        margin: 1px 0 5px;
        border: none;
        padding: 1px 16px;
        border-radius: 4px;
        background-color: #DA2600;
        color: white;
        cursor: pointer;
        }
`
        var styleSheet = document.createElement("style")
        styleSheet.type = "text/css"
        styleSheet.innerText = styles
        document.head.appendChild(styleSheet);
        document.getElementById('Startbots').onclick = () => {
            if(!window.started) {
                startBots();
            }
        };
        document.getElementById('Stopbots').onclick = () => {
            if(window.started == true) {
                stopBots();
            }
        };
        document.getElementById('u2ub1').onclick = () => {
            location.href = 'https://discord.gg/bAstbAfem9';
        };
        setInterval(() => {
            document.getElementById('u2ub1eqe').innerText = `${this.botamt}/${this.BotAmount}`;
        }, 1000);
    }

    addUI() {
        let cssStyles = document.createElement('head');
        let ui = document.createElement('div');
        ui.id = 'botcanvas';
        ui.style.background = 'rgba(0, 0, 0, 0.7)';
        ui.style.top = '-8px';
        ui.style['border-radius'] = '3px';
        ui.style.left = '-8px';
        ui.style.display = 'block';
        ui.style.position = 'absolute';
        ui.style['text-align'] = 'center';
        ui.style['font-size'] = '15px';
        ui.style.color = '#FFFFFF';
        ui.style.padding = '7px';
        ui.style['padding-right'] = '7px';
        ui.style['padding-top'] = '7px';
        ui.style['padding-bottom'] = '7px';
        ui.style.margin = '1%';
        ui.style['z-index'] = '1000000';
        ui.style['.sides'] = '12px';
        ui.style.border = '2px solid #ffffff';
        cssStyles.innerHTML +=
            '<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">';
        ui.innerHTML +=
            '<div id="tzfst">Clone Bots</div> <div id="u2ub1">Discord.gg/bAstbAfem9</div> <div id="u2ub1eqe">Loading...</div> <input type="text" div id="fname" name="firstname" placeholder="Bot name..."><br> <input type="submit" value="Start" div id = "Startbots"> <input type="submit" value="Stop" div id = "Stopbots">';
        document.body.appendChild(ui);
        var styles = `
        #fname {
        color: #808080;
        border: 2px solid WHITE;
        border-radius: 4px;
        box-sizing: border-box;
        padding: 0px 0px;
        margin: 0 0 5px;
        width: 120px;
        }
        #u2ub1eqe {
        margin: 0 0 4px;
        font-family: Ubuntu;
        font-weight: bold;
        font-size: 15px;
        margin-top: 0px;
        color: #00ff00;
        }
        #u2ub1 {
        margin: -8px 0px 0px;
        font-family: Ubuntu;
	    font-weight: bold;
	    font-size: 13px;
	    COLOR: rgb(182, 186, 183);
        cursor: pointer;
        }
        #tzfst {
        margin: -5px 0px 0px;
        font-family: Ubuntu;
	    font-weight: bold;
	    font-size: 15px;
	    COLOR: WHITE;
        }
        #Startbots {
        margin: 1px 0 -7px;
        border: none;
        padding: 1px 22px;
        border-radius: 3px;
        background-color: #4CAF50;
        color: white;
        cursor: pointer;
        }
        #Stopbots {
        margin: 1px 0 -7px;
        border: none;
        padding: 1px 22px;
        border-radius: 3px;
        background-color: #DA2600;
        color: white;
        cursor: pointer;
        }
`
        var styleSheet = document.createElement("style")
        styleSheet.type = "text/css"
        styleSheet.innerText = styles
        document.head.appendChild(styleSheet);
        document.getElementById('Startbots').onclick = () => {
            if(!window.started) {
                startBots();
            }
        };
        document.getElementById('Stopbots').onclick = () => {
            if(window.started == true) {
                stopBots();
            }
        };
        document.getElementById('u2ub1').onclick = () => {
            location.href = 'https://discord.gg/bAstbAfem9';
        };
        setInterval(() => {
            document.getElementById('u2ub1eqe').innerText = `${this.botamt}/${this.BotAmount}`;
        }, 1000);
    }
    HookInfo() {
        window.addEventListener('keypress', (event) => {
            switch(event.key) {
                case 'e':
                    window.split();
                    break;
                case 'r':
                    window.eject();
                    break;
                case 'm':
                    window.chat();
                    break;
            }
        });
        let parseOrigin = /(\w+)\:\/\/(\w+.\w+)/gi.exec(window.location.origin)[2];
        if(parseOrigin == 'tr.agar' || parseOrigin == 'agars.live' || parseOrigin == 'agarr.live' || parseOrigin == 'agarplay.club' || parseOrigin ==
            'es.agar' || parseOrigin == 'agar.live' || parseOrigin == 'agar-io') {
            this.BotAmount = 65;
        } else if(parseOrigin == "www.inciagario" || parseOrigin == "agariott.com") {
            this.BotAmount = 10;
        } else if(parseOrigin == "oceanar.io" || parseOrigin == "aquar.io") {
            this.BotAmount = 100;
        } else if(parseOrigin == "agario.zafer2") {
            this.BotAmount = 70;
        } else {
            this.BotAmount = 60;
        }
    }
    inject() {
        let parseOrigin = /(\w+)\:\/\/(\w+.\w+)/gi.exec(window.location.origin)[2];
        if(parseOrigin == "aquar.io") {
            WebSocket.prototype.reaSend = WebSocket.prototype.send;
            WebSocket.prototype.send = function(pkt) {
                this.reaSend(pkt);
                if(typeof pkt == 'string') return;
                if(this.url.includes('localhost')) return;
                if(pkt instanceof ArrayBuffer) pkt = new DataView(pkt);
                else if(pkt instanceof DataView) pkt = pkt;
                else pkt = new DataView(pkt.buffer);
                let offset = 0;
                switch(pkt.getUint8(0, true)) {
                    case 14:
                        window.mousepos = pkt.buffer;
                        break;
                }
                window.CurrentWs = this.url;
            }
        } else if(parseOrigin == "www.inciagario" || parseOrigin == "agariott.com") {
            WebSocket.prototype.reaSend = WebSocket.prototype.send;
            WebSocket.prototype.send = function(pkt) {
                this.reaSend(pkt);
                if(typeof pkt == 'string') return;
                if(this.url.includes('localhost')) return;
                if(pkt instanceof ArrayBuffer) pkt = new DataView(pkt);
                else if(pkt instanceof DataView) pkt = pkt;
                else pkt = new DataView(pkt.buffer);
                let offset = 0;
                switch(pkt.getUint8(0, true)) {
                    case 104:
                        window.xpos = pkt.getFloat64(1, true);
                        window.ypos = pkt.getFloat64(9, true);
                        break;
                }
                window.CurrentWs = this.url;
            }
        } else if(parseOrigin == "oceanar.io") {
            WebSocket.prototype.reaSend = WebSocket.prototype.send;
            WebSocket.prototype.send = function(pkt) {
                this.reaSend(pkt);
                if(typeof pkt == 'string') return;
                if(this.url.includes('localhost')) return;
                if(pkt instanceof ArrayBuffer) pkt = new DataView(pkt);
                else if(pkt instanceof DataView) pkt = pkt;
                else pkt = new DataView(pkt.buffer);
                let offset = 0;
                switch(pkt.getUint8(0, true)) {
                    case 5:
                        window.mousepos = pkt.buffer;
                        break;
                }
                window.CurrentWs = this.url;
            }
        } else {
            console.log("Using default inject.");
            WebSocket.prototype.reaSend = WebSocket.prototype.send;
            WebSocket.prototype.send = function(pkt) {
                this.reaSend(pkt);
                if(typeof pkt == 'string') return;
                if(this.url.includes('localhost')) return;
                if(pkt instanceof ArrayBuffer) pkt = new DataView(pkt);
                else if(pkt instanceof DataView) pkt = pkt;
                else pkt = new DataView(pkt.buffer);
                let offset = 0;
                switch(pkt.getUint8(0, true)) {
                    case 16:
                        window.xpos = pkt.getFloat64(1, true);
                        window.ypos = pkt.getFloat64(9, true);
                        break;
                }
                window.CurrentWs = this.url;
            }
        }
    }
}

function startBots() {
    if(window.started == false) {
        window.bots = [];
        console.log("Starting Bots...");
        let parseOrigin = /(\w+)\:\/\/(\w+.\w+)/gi.exec(window.location.origin)[2];
        console.log(parseOrigin);
        if(parseOrigin == 'tr.agar' || parseOrigin == 'agars.live' || parseOrigin == 'agarr.live' || parseOrigin == 'agarplay.club' || parseOrigin ==
            'es.agar' || parseOrigin == 'agar.live' || parseOrigin == 'agar-io') {
                setInterval(() => {
                    this.bots.push(new AgarLive());
                }, 4000);
            window.started = true;
        } else if(parseOrigin == 'www.inciagario' || parseOrigin == "agariott.com") {
            for(let i = 0; i < usr.BotAmount; i++) {
                this.bots.push(new Inci());
            }
            window.started = true;
        } else if(parseOrigin == 'agarz.com') {
            for(let i = 0; i < usr.BotAmount; i++) {
                this.bots.push(new Agarz());
            }
            window.started = true;
        } else if(parseOrigin == "oceanar.io") {
            for(let i = 0; i < usr.BotAmount; i++) {
                this.bots.push(new Oceanar());
            }
            window.started = true;
        } else if(parseOrigin == "aquar.io") {
            for(let i = 0; i < usr.BotAmount; i++) {
                this.bots.push(new Aquar());
            }
            window.started = true;
        } else {
            console.log("Using Default Protocol")
            for(let i = 0; i < usr.BotAmount; i++) {
                this.bots.push(new Proto5());
            }
            window.started = true;
        }
    }
}

window.eject = function() {
    if(window.started == true) {
        this.bots.forEach(bot => {
            bot.eject();
        });
    }
}

window.chat = function() {
    let msg = prompt('What do you want the bots to say?', 'Type here then press ok or enter');
    if(window.started = true) {
        this.bots.forEach(bot => {
            if(msg) bot.sendchat(msg);
        });
    }
}

window.split = function() {
    if(window.started == true) {
        this.bots.forEach(bot => {
            bot.split();
        });
    }
}

function stopBots() {
    if(window.started = true) {
        console.log("Stopping Bots...");
        this.bots.forEach(bot => {
            bot.ws.close()
        });
        window.bots.length = 0;
        window.started = false;
    }
}

const usr = new User();

class Oceanar {
    constructor() {
        usr.botamt++

        this.ws = null;
        this.connect();
    }
    connect() {
        this.ws = new WebSocket(window.CurrentWs);
        this.ws.binaryType = "arraybuffer";
        this.ws.onopen = this.onopen.bind(this);
        this.ws.onmessage = this.onmessage.bind(this);
        this.ws.onerror = this.onerror.bind(this);
        this.ws.onclose = this.onclose.bind(this);
    }

    Buffer(arr) {
        return new DataView(new ArrayBuffer(arr));
    }

    onopen() {
        this.spawn();
        this.ping();
        this.sendmouse();
        setInterval(() => {
            this.sendmouse();
        }, 200);
    }

    sendchat(msg) {}

    sendmouse() {
        this.send(window.mousepos);
    }

    ping() {
        let time = 268435455 & Date.now();
        var n = new ArrayBuffer(5);
        var i = new DataView(n);
        i.setUint8(0, 1)
        i.setUint32(1, time, true)
        this.send(n);
    }

    split() {}

    eject() {}

    spawn() {
        let name = document.getElementById("fname").value;
        let appearance = 255;
        var n = new ArrayBuffer(52);
        var i = new DataView(n);
        i.setUint8(0, 22);
        var o = 0;
        for(; o < 25; ++o) {
            i.setUint16(1 + 2 * o, o < name.length ? name.charCodeAt(o) : 0, true);
        }
        i.setUint8(51, appearance)
        this.send(n);
    }


    send(msg) {
        if(this.ws && this.ws.readyState === WebSocket.OPEN) this.ws.send(msg);
    }
    onmessage(msg) {}

    onclose(e) {
        usr.botamt--
        console.log("Disconnected");

    }

    onerror(e) {}
}

class Inci {
    constructor() {
        this.connect();
        usr.botamt++
        this.ws = null;
    }
    async GetWebSocketCaptcha() {
        return new Promise(resolve => {
            grecaptcha.execute('6LcnrKQUAAAAADohV5Cksikz89WSP-ZPHNA7ViZm', {
                action: 'playbutton'
            }).then(function(token) {
                if(token) {
                    var CurrentWs = window.CurrentWs.substr(0, 34)
                    var sCodes = SCodes_Original;
                    var chal = "&challenge=";
                    var precd = '?SCode=';
                    var scodesprefix = CurrentWs + precd + sCodes + chal;
                    let WebsocketCaptcha = scodesprefix + token;
                    resolve(WebsocketCaptcha)
                }
            });
        });
    }
    async connect() {
        const result = await this.GetWebSocketCaptcha();
        window.CurrentWs = result;
        this.ws = new WebSocket(window.CurrentWs);
        this.ws.binaryType = "arraybuffer";
        this.ws.onopen = this.onopen.bind(this);
        this.ws.onmessage = this.onmessage.bind(this);
        this.ws.onerror = this.onerror.bind(this);
        this.ws.onclose = this.onclose.bind(this);
    }

    Buffer(arr) {
        return new DataView(new ArrayBuffer(arr));
    }

    onopen() {
        let init = this.Buffer(5);
        init.setUint8(0, 87);
        init.setUint32(1, 1, true);
        this.send(init);
        init = this.Buffer(5);
        init.setUint8(0, 100);
        init.setUint32(1, 1332175218, true);
        this.send(init)
        this.spawn();
        setInterval(() => {
            this.sendmouse();
        }, 100);
        setInterval(() => {
            this.spawn();
        }, 5000);
    }

    sendchat(msg) {
        var spawnbuf = this.Buffer(2 + 2 * msg.length);
        var zz = 0;
        var gg = 0;
        gg = 1;
        spawnbuf.setUint8(zz++, 99);
        spawnbuf.setUint8(zz++, 0);
        for(var i = 0; i < msg.length; ++i) {
            spawnbuf.setUint16(zz, msg.charCodeAt(i), 1);
            zz += 2;
        };
        this.send(spawnbuf);
    }

    sendmouse() {
        let movebuf = this.Buffer(21);
        movebuf.setUint8(0, 104);
        movebuf.setFloat64(1, window.xpos, true);
        movebuf.setFloat64(9, window.ypos, true);
        movebuf.setUint32(17, 0, true);
        this.send(movebuf);
    }

    split() {
        this.send(new Uint8Array([17]));
    }

    eject() {
        this.send(new Uint8Array([21]));
    }

    spawn() {
        let name = document.getElementById("fname").value;
        var spawnbuf = this.Buffer(1 + 2 * name.length);
        spawnbuf.setUint8(0, 101);
        for(var i = 0; i < name.length; ++i) {
            spawnbuf.setUint16(1 + 2 * i, name.charCodeAt(i), 1);
        };
        this.send(spawnbuf);
    }


    send(msg) {
        if(this.ws && this.ws.readyState === WebSocket.OPEN) this.ws.send(msg);
    }
    onmessage(msg) {}

    onclose(e) {
        usr.botamt--
        console.log("Disconnected");

    }

    onerror(e) {}
}

class Agarz {
    constructor() {
        usr.botamt++
        this.connect();
    }
    connect() {
        this.ws = new WebSocket(window.CurrentWs);
        this.ws.binaryType = "arraybuffer";
        this.ws.onopen = this.onopen.bind(this);
        this.ws.onmessage = this.onmessage.bind(this);
        this.ws.onerror = this.onerror.bind(this);
        this.ws.onclose = this.onclose.bind(this);
    }

    Buffer(arr) {
        return new DataView(new ArrayBuffer(arr));
    }

    onopen() {
        let init = this.Buffer(5);
        init.setUint8(0, 255);
        init.setUint32(1, 1000, true);
        this.send(init);
        this.spawn();
        let mouseinterval = setInterval(() => {
            this.sendmouse();
        }, 100);
        let spawninterval = setInterval(() => {
            this.spawn();
        }, 10000);
    }

    sendchat(msg) {
        var spawnbuf = this.Buffer(2 + 2 * msg.length);
        var zz = 0;
        var gg = 0;
        gg = 1;
        spawnbuf.setUint8(zz++, 206);
        spawnbuf.setUint8(zz++, gg);
        for(var i = 0; i < msg.length; ++i) {
            spawnbuf.setUint16(zz, msg.charCodeAt(i), true);
            zz += 2;
        };
        this.send(spawnbuf);
    }

    sendmouse() {
        let movebuf = this.Buffer(21);
        movebuf.setUint8(0, 16);
        movebuf.setFloat64(1, window.xpos, true);
        movebuf.setFloat64(9, window.ypos, true);
        movebuf.setUint32(17, 0, true);
        this.send(movebuf);
    }

    split() {
        this.send(new Uint8Array([17]));
    }

    eject() {
        this.send(new Uint8Array([21]));
    }

    spawn() {
        let name = document.getElementById("fname").value;
        var buffer = this.Buffer(1 + 2 * name.length);
        buffer.setUint8(0, 9);
        for(var e = 0; e < name.length; ++e) {
            buffer.setUint16(1 + 2 * e, name.charCodeAt(e), true);
        };
        this.send(buffer);
    }


    send(msg) {
        if(this.ws && this.ws.readyState === WebSocket.OPEN) this.ws.send(msg);
    }
    onmessage(msg) {}

    onclose(e) {
        console.log("Disconnected");
        usr.botamt--
    }

    onerror(e) {}
}

class Proto5 {
    constructor() {
        usr.botamt++

        this.connect();
    }
    connect() {
        this.ws = new WebSocket(window.CurrentWs);
        this.ws.binaryType = "arraybuffer";
        this.ws.onopen = this.onopen.bind(this);
        this.ws.onmessage = this.onmessage.bind(this);
        this.ws.onerror = this.onerror.bind(this);
        this.ws.onclose = this.onclose.bind(this);
    }

    Buffer(arr) {
        return new DataView(new ArrayBuffer(arr));
    }

    onopen() {
        let init = this.Buffer(5);
        init.setUint8(0, 254);
        init.setUint32(1, 5, true);
        this.send(init);
        init = this.Buffer(5);
        init.setUint8(0, 255);
        init.setUint32(1, 123456789, true);
        this.send(init)
        this.spawn();
        let mouseinterval = setInterval(() => {
            this.sendmouse();
        }, 100);
        let spawninterval = setInterval(() => {
            this.spawn();
        }, 10000);
    }

    sendchat(msg) {
        var spawnbuf = this.Buffer(2 + 2 * msg.length);
        var zz = 0;
        var gg = 0;
        gg = 1;
        spawnbuf.setUint8(zz++, 206);
        spawnbuf.setUint8(zz++, gg);
        for(var i = 0; i < msg.length; ++i) {
            spawnbuf.setUint16(zz, msg.charCodeAt(i), true);
            zz += 2;
        };
        this.send(spawnbuf);
    }

    sendmouse() {
        let movebuf = this.Buffer(21);
        movebuf.setUint8(0, 16);
        movebuf.setFloat64(1, window.xpos, true);
        movebuf.setFloat64(9, window.ypos, true);
        movebuf.setUint32(17, 0, true);
        this.send(movebuf);
    }

    split() {
        this.send(new Uint8Array([17]));
    }

    eject() {
        this.send(new Uint8Array([21]));
    }

    spawn() {
        let name = document.getElementById("fname").value;
        var skins = ['26', '30', '32', '40', '60', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',
            '20', '21', '22', '23'
        ];
        var skin = skins[~~(Math.random() * skins.length)];
        name = `{${skin}}` + name;
        var spawnbuf = this.Buffer(1 + 2 * name.length);
        spawnbuf.setUint8(0, 192);
        for(var i = 0; i < name.length; ++i) {
            spawnbuf.setUint16(1 + 2 * i, name.charCodeAt(i), true);
        };
        this.send(spawnbuf);
    }


    send(msg) {
        if(this.ws && this.ws.readyState === WebSocket.OPEN) this.ws.send(msg);
    }
    onmessage(msg) {}

    onclose(e) {
        console.log("Disconnected");
        usr.botamt--
    }

    onerror(e) {}
}

class AgarLive {
    constructor() {
        this.connect();
        usr.botamt++
        this.ws = null;
    }
    async GetWebSocketCaptcha() {
        return new Promise(resolve => {
            // grecaptcha.execute('6LcnrKQUAAAAADohV5Cksikz89WSP-ZPHNA7ViZm', {
            //   action: 'playbutton'
            //}).then(function(token) {
            //  if (token) {
            var CurrentWs = window.CurrentWs.substr(0, 31) + "?SCode="
            var WS = CurrentWs + SCodes_Original;
            console.log(WS);
            resolve(WS)
            //}
            //});
        });
    }
    async connect() {
        //connect() {
        const result = await this.GetWebSocketCaptcha();
        window.CurrentWs = result;
        this.ws = new WebSocket(window.CurrentWs);
        this.ws.binaryType = "arraybuffer";
        this.ws.onopen = this.onopen.bind(this);
        this.ws.onmessage = this.onmessage.bind(this);
        this.ws.onerror = this.onerror.bind(this);
        this.ws.onclose = this.onclose.bind(this);
    }

    Buffer(arr) {
        return new DataView(new ArrayBuffer(arr));
    }

    onopen() {
        let init = this.Buffer(5);
        init.setUint8(0, 254);
        init.setUint32(1, 5, true);
        this.send(init);
        init = this.Buffer(5);
        init.setUint8(0, 255);
        init.setUint32(1, 154669603, true);
        this.send(init)
        this.spawn();
        setInterval(() => {
            this.sendmouse();
        }, 100);
        setInterval(() => {
            this.spawn();
        }, 10000);
    }

    sendchat(msg) {
        var spawnbuf = this.Buffer(2 + 2 * msg.length);
        var zz = 0;
        var gg = 0;
        gg = 1;
        spawnbuf.setUint8(zz++, 99);
        spawnbuf.setUint8(zz++, 0);
        for(var i = 0; i < msg.length; ++i) {
            spawnbuf.setUint16(zz, msg.charCodeAt(i), 1);
            zz += 2;
        };
        this.send(spawnbuf);
    }

    sendmouse() {
        let movebuf = this.Buffer(21);
        movebuf.setUint8(0, 16);
        movebuf.setFloat64(1, window.xpos, true);
        movebuf.setFloat64(9, window.ypos, true);
        movebuf.setUint32(17, 0, true);
        this.send(movebuf);
    }

    split() {
        this.send(new Uint8Array([17]));
    }

    eject() {
        this.send(new Uint8Array([21]));
    }

    spawn() {
        let name = document.getElementById("fname").value;
        var spawnbuf = this.Buffer(1 + 2 * name.length);
        spawnbuf.setUint8(0, 0);
        for(var i = 0; i < name.length; ++i) {
            spawnbuf.setUint16(1 + 2 * i, name.charCodeAt(i), 1);
        };
        this.send(spawnbuf);
    }


    send(msg) {
        if(this.ws && this.ws.readyState === WebSocket.OPEN) this.ws.send(msg);
    }
    onmessage(msg) {}

    onclose(e) {
        usr.botamt--
        console.log("Disconnected");

    }

    onerror(e) {}
}

class Aquar {
    constructor() {
        usr.botamt++

        this.ws = null;
        this.connect();
    }
    connect() {
        this.ws = new WebSocket(window.CurrentWs);
        this.ws.binaryType = "arraybuffer";
        this.ws.onopen = this.onopen.bind(this);
        this.ws.onmessage = this.onmessage.bind(this);
        this.ws.onerror = this.onerror.bind(this);
        this.ws.onclose = this.onclose.bind(this);
    }

    Buffer(arr) {
        return new DataView(new ArrayBuffer(arr));
    }

    onopen() {
        this.spawn();
        this.ping();
        this.sendmouse();
        setInterval(() => {
            this.sendmouse();
        }, 200);
    }

    sendchat(msg) {}

    sendmouse() {
        this.send(window.mousepos);
    }

    ping() {
        let time = 268435455 & Date.now();
        var n = new ArrayBuffer(5);
        var i = new DataView(n);
        i.setUint8(0, 1)
        i.setUint32(1, time, true)
        this.send(n);
    }

    split() {}

    eject() {}

    spawn() {
        let name = "test";
        let appearance = 255;
        var n = new ArrayBuffer(52);
        var i = new DataView(n);
        i.setUint8(0, 22);
        var o = 0;
        for(; o < 25; ++o) {
            i.setUint16(1 + 2 * o, o < name.length ? name.charCodeAt(o) : 0, true);
        }
        i.setUint8(51, appearance)
        this.send(n);
    }


    send(msg) {
        if(this.ws && this.ws.readyState === WebSocket.OPEN) this.ws.send(msg);
    }
    onmessage(msg) {}

    onclose(e) {
        usr.botamt--
        console.log("Disconnected");

    }

    onerror(e) {}
}