Xero-Bots | .io Bots 2022

The best bots for popular agar.io clone games.

Versión del día 06/04/2022. Echa un vistazo a la versión más reciente.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Xero-Bots | .io Bots 2022
// @namespace    https://discord.com/invite/bAstbAfem9
// @version      30.0.1
// @description  The best bots for popular agar.io clone games.
// @author       Tatsuya & Enes
// @match        *.oceanar.io/*
// @match        *.aquar.io/*
// @match        *.agar.live/*
// @run-at       document-start
// @icon         https://www.google.com/s2/favicons?sz=64&domain=cellcraft.io
// @grant        none
// ==/UserScript==
function _classCallCheck(instance, Constructor) {
    if(!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
    }
}
var _createClass = function() {
    function defineProperties(target, props) {
        for(var i = 0; i < props.length; i++) {
            var descriptor = props[i];
            descriptor.enumerable = descriptor.enumerable || false;
            descriptor.configurable = true;
            if("value" in descriptor) descriptor.writable = true;
            Object.defineProperty(target, descriptor.key, descriptor);
        }
    }
    return function(Constructor, protoProps, staticProps) {
        if(protoProps) defineProperties(Constructor.prototype, protoProps);
        if(staticProps) defineProperties(Constructor, staticProps);
        return Constructor;
    };
}();

function _defineProperty(obj, key, value) {
    if(key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}
var Client = new(function() {
    function _class41() {
        _classCallCheck(this, _class41);
    }
    _createClass(_class41, [{
        key: 'init',
        value: function init() {
            this.bots = [];
            this.BotAmount = this.hookAmt;
            this.serverIP = '';
            this.positioning = {
                'x': 0,
                'y': 0
            };
            this.movebuf = null;
            this.started = false;
            this.gui = GUI.init(this.startBots.bind(this), this.stopBots.bind(this), this.split.bind(this), this.eject.bind(this));
            this.setup();
        }
    }, {
        key: 'hookAmt',
        get: function hookAmt() {
            let url = /(\w+)\:\/\/(\w+.\w+)/gi.exec(window.location.origin)[2];
            if(url == "agma.io" || url == "cellcraft.io" || url == "oceanar.io" || url == "aquar.io" || url == 'agar.live') {
                return 50;
            } else {
                return 15;
            }
        }
    }, {
        key: 'spawned',
        get: function spawned() {
            return this.bots.filter(b => b.ws && b.ws.readyState === WebSocket.OPEN).length;
        }
    }, {
        key: 'setup',
        value: function setup() {
            for(let i = 0; i < this.BotAmount; i++) {
                this.bots.push(new Bot())
            };
            this.UpdateCount();
        }
    }, {
        key: 'UpdateCount',
        value: function UpdateCount() {
            this.updateCounter = setInterval(() => {
                GUI.updateCount(this.spawned, this.BotAmount)
            }, 1000)
        }
    }, {
        key: 'split',
        value: function split() {
            this.bots.forEach((bot, i) => {
                bot.split()
            })
        }
    }, {
        key: 'eject',
        value: function eject() {
            this.bots.forEach((bot, i) => {
                bot.eject()
            })
        }
    }, {
        key: 'startBots',
        value: function startBots() {
            if(this.started || !this.serverIP) return;
            if(this.serverIP == undefined) return;
            this.bots.forEach((bot, i) => {
                bot.connect(this.serverIP)
            });
            this.started = true
        }
    }, {
        key: 'stopBots',
        value: function stopBots() {
            if(!this.started) return;
            this.bots.forEach((bot, i) => {
                bot.disconnect()
            });
            this.started = false
        }
    }]);
    return _class41;
}())();
var GUI = new(function() {
    function _class3() {
        _classCallCheck(this, _class3);
    }
    _createClass(_class3, [{
        key: 'init',
        value: function init(start, stop, split, eject) {
            this.IDs = {
                'startButton': 'startB',
                'stopButton': 'stopB',
                'botCount': 'casteramount',
                'DiscordURL': 'title'
            };
            this.injected = false;
            this.startBots = start;
            this.stopBots = stop;
            this.splitBots = split;
            this.ejectBots = eject;
            this.inject();
            this.setupKeys();
        }
    }, {
        key: 'inject',
        value: async function inject() {
            this.uiCode = await this.getGUI();
            if(!this.uiCode) {
                return alert('Failed to load bot GUI. If this keeps happening, contact a developer.');
            }
            this.append(this.uiCode);
        }
    }, {
        key: 'getGUI',
        value: async function getGUI() {
            const UI = await fetch('https://uttermost-inky-aardvark.glitch.me/');
            if(!UI.ok) {
                return console.log('[GUI STATUS]', UI);
            }
            return await UI.text();
        }
    }, {
        key: 'append',
        value: function append(html) {
            const BOTUI = document.createElement('div');
            BOTUI.innerHTML = html;
            document.body.appendChild(BOTUI);
            this.injected = true;
            this.divScramble('startB', 'startButton');
            this.divScramble('stopB', 'stopButton');
            this.divScramble('casteramount', 'botCount');
            this.divScramble('title', 'DiscordURL');
            document.getElementById(this.IDs.startButton).onclick = () => {
                this.startBots();
                document.getElementById(this.IDs.stopButton).style.display = 'block';
                document.getElementById(this.IDs.startButton).style.display = 'none';
            };
            document.getElementById(this.IDs.stopButton).onclick = () => {
                this.stopBots();
                document.getElementById(this.IDs.stopButton).style.display = 'none';
                document.getElementById(this.IDs.startButton).style.display = 'block';
            };
            document.getElementById(this.IDs.DiscordURL).onclick = () => {
                window.location.href = 'https://discord.gg/bAstbAfem9'
            };
            document.querySelector("#okbtn").onclick = () => {
                document.querySelector("#popup").style.display = "none";
                document.querySelector("#blackout").style.display = "none";
            };
            this.showPopUp(
                "Webpack Module Successfully initiated. Bypass injected. 𝙉𝙞𝙘𝙚 𝙥𝙖𝙩𝙘𝙝 𝘼𝙜𝙖𝙧.𝙡𝙞𝙫𝙚 𝙙𝙚𝙫𝙨, 𝙩𝙧𝙮 𝙩𝙤 𝙗𝙡𝙤𝙘𝙠 𝙢𝙮 𝙂𝙐𝙄 𝙖𝙜𝙖𝙞𝙣 :)"
                );
        }
    }, {
        key: 'setupKeys',
        value: function setupKeys() {
            window.addEventListener('keypress', (event) => {
                switch(event.key) {
                    case 'q':
                        this.splitBots();
                        break;
                    case 'w':
                        this.ejectBots();
                        break;
                }
            });
        }
    }, {
        key: 'divScramble',
        value: function GenerateScrambledID(div, callback) {
            const scrambledID = (((1 + Math.random()) * 0x10000) | 0);
            document.getElementById(div).id = scrambledID;
            this.IDs[callback] = scrambledID;
        }
    }, {
        key: 'updateCount',
        value: function updateCount(spawned, max) {
            document.getElementById(this.IDs.botCount).innerText = spawned + " / " + max
        }
    }, {
        key: 'showPopUp',
        value: function showPopUp(msg) {
            document.getElementById("msgpop").innerHTML = msg;
            document.querySelector("#popup").style.display = "block";
            document.querySelector("#blackout").style.display = "block";
        }
    }]);
    return _class3;
}())();
class Bot {
    constructor() {
        this.origin = /(\w+)\:\/\/(\w+.\w+)/gi.exec(window.location.origin)[2];
        this.Hooks = {
            botNames: ["discord.gg/bAstbAfem9", "rb.gy/kafgsw", "Xero-Bots", "Nice try devs!"],
            getBotName() {
                return this.botNames[Math.floor(Math.random() * this.botNames.length)]
            }
        }
    }
    connect(url) {
        this.serverUrl = url;

        this.ws = new WebSocket(url);

        this.ws.binaryType = "arraybuffer";

        this.ws.onmessage = this.onMessage.bind(this);
        this.ws.onopen = this.onOpen.bind(this);
        this.ws.onclose = this.onClose.bind(this);
        this.ws.onerror = this.onError.bind(this);

        this.randomMovement = false;

        this.id = Math.floor(Math.pow(2, 14) * Math.random()).toString(36);
        this.name = this.Hooks.getBotName() + ' | ' + this.id;
    }
    disconnect() {
        if(this.ws) {
            this.ws.close();
            delete this.ws;
        }
        clearInterval(this.moveInterval);

        clearInterval(this.pingInterval);

        clearTimeout(this.spawnTimeout);
    }
    onMessage(message) {
        if (this.dependency == 3) {
            var view = new DataView(message.data);
            var offset = 0;
            switch(240 == view.getUint8(offset) && (offset = offset + 5), view.getUint8(offset++)) {
                    case 64:
                    offset += 34;
                    var next = view.getUint32(offset, true);
                    offset += 4;
                    var code = view.getUint32(offset, true);
                    if(next === code) {
                        if(70 > 60) {
                            this.buildKey.xor = next;
                            this.Auth(33000);
                        }
                    } else {
                        this.ws.close();
                        console.log("Err in 64!");
                    }
                    break;
                   case 244:
                    this.readyToSpawn = true;
                    this.send(new Uint8Array([0x04, 0x07, 0x01]))
                    this.send(new Uint8Array([0x04, 0x08, 0x00]))
                    this.send(new Uint8Array([0x04, 0x03, 0x01]))
                    break;
            }
        }
    }
    Auth(secretKey) {
        var xorKey = this.Buffer(13);
        xorKey.setUint8(0, 2 * (100 + 30) - (this.buildKey.xor - 5) % 10 - 5);
        xorKey.setUint32(1, ~~(this.buildKey.xor / 1.84 + 100 / 2 - 2 * (0 ? 0.5 : 1)) + ~~(~~(21.2 * (~~(this.buildKey.xor + 4.42 * this.buildKey.zn + 555) % --secretKey + 36360)) / 4.2), true)
        xorKey.setUint32(5, this.offsetKey() + 103, true);
        xorKey.setUint32(9, this.buildKey.vd(xorKey, 0, 9, 255), true);
        this.send(xorKey, true);
    }
    offsetKey() {
        for (var d = 0, b = 0; b < this.On.length; b++) {
        d += ~~(this.buildKey.xor / this.On[b] - this.On[b] % 103);
        }
        return d;
    }
    get On() {
        var wrapper = "~9B\\x$";
        return [
            wrapper.charCodeAt(0),
            wrapper.charCodeAt(1),
            wrapper.charCodeAt(2) + 73,
            wrapper.charCodeAt(3),
            wrapper.charCodeAt(4) + 227,
            wrapper.charCodeAt(5)
        ];
    }
    onOpen() {
        if(this.dependency == 1) {
            this.spawn();
            this.ping();
        } else if (this.dependency == 2) {
            let Init = this.Buffer(5);
            Init.setUint8(0, 254);
            Init.setUint32(1, 5, true);
            this.send(Init, true);
            Init = this.Buffer(5);
            Init.setUint8(0, 255);
            Init.setUint32(1, 123456789, true);
            this.send(Init, true);
            this.spawn();
            this.pingInterval = setInterval(this.sendlatency.bind(this), 1e3);
        } else if (this.dependency == 3) {

            this.buildKey = {
                zn: 8730,
                xor: -1,
                vd(d, b, x, _) {
                    b + x > d.byteLength && (x = 0);
                    for (var e = 12345678 + _, t = 0; x > t; t++) {
                        e += d.getUint8(b + t) * (t + 1);
                    }
                    return e;
                }
            };

            const Init = this.Buffer(13);
            Init.setUint8(0, 245);
            Init.setUint16(1, 22, true);
            Init.setUint16(3, 118, true);
            Init.setUint32(5, this.buildKey.zn, true);
            Init.setUint32(9, this.buildKey.vd(Init, 0, 9, 245), true);
            this.send(Init, true);

            this.pingInterval = setInterval(() => { if(this.readyToSpawn) this.send([0x5f])}, 18e3);

        } else if (this.dependency == 0) {
        }
        this.spawnTimeout = setInterval(this.spawn.bind(this), 3000);
        this.moveInterval = setInterval(this.move.bind(this), 150);
    }
    onClose() {
        clearInterval(this.moveInterval);

        clearInterval(this.pingInterval);

        clearTimeout(this.spawnTimeout);
    }
    onError() {}
    spawn() {
        if(this.dependency == 1) {
            let spawnBuf = this.Buffer(52);
            spawnBuf.setUint8(0, 22);
            var o = 0;
            for(; o < 25; ++o) {
                spawnBuf.setUint16(1 + 2 * o, o < this.name.length ? this.name.charCodeAt(o) : 0, true);
            }
            spawnBuf.setUint8(51, 255)
            this.send(spawnBuf);
        } else if (this.dependency == 2) {
            var rassan = this.Buffer(1 + 2 * this.name.length);
            rassan.setUint8(0, 129);
            for (var i = 0; i < this.name.length; ++i) {
                rassan.setUint16(1 + 2 * i, this.name.charCodeAt(i), true);
            }
            this.send(rassan, true);
        } else if (this.dependency == 3) {
            if(!this.readyToSpawn) return;
            var es = [1], _s = 0;
            var spawnBuf = this.Buffer(4 + 2 * es.length + 2 * this.name.length);
            spawnBuf.setUint8(0, 1);
            for(var b = 4, x = 0; x < es.length; x++) spawnBuf.setUint16(b, 0, true);
            for(x = 0; x < this.name.length; ++x) spawnBuf.setUint16(b + 2 * x, this.name.charCodeAt(x), true);
            this.sendUint8(34);
            this.send(spawnBuf, true);
            this.sendUint8(34);;
        } else if (this.dependency == 0) {
        }
    }
    sendUint8(offset) {
        var singleByte = this.Buffer(1);
        singleByte.setUint8(0, offset);
        this.send(singleByte);
    }
    sendlatency() {
        const latency = this.Buffer(5);
        latency.setUint8(0, 90);
        latency.setUint32(1, 123456789, true);
        this.send(latency, true);
    }
    ping() {
        let ParseTime = 268435455 & Date.now();
        let oneByte = this.Buffer(0x5);
        oneByte.setUint8(0x0, 0x1);
        oneByte.setUint32(0x1, ParseTime);
        this.send(oneByte);
    }
    split() {
        this.send(new Uint8Array([0x11]))
    }
    eject() {
        this.send(new Uint8Array([0x24]))
    }
    chat(message) {
        if (this.dependency == 2) {
            var haowen = this.Buffer(4 + 2 * message.length);
            var kydan = 0;
            haowen.setUint8(kydan++, 199);
            haowen.setUint8(kydan++, 0);
            for (var hiya = 0; hiya < message.length; ++hiya) {
                haowen.setUint16(kydan, message.charCodeAt(hiya), true);
                kydan += 2;
            }
            haowen.setUint16(kydan, 57344, true);
            this.send(haowen)
        } else if (this.dependency == 3) {
            var b = this.Buffer(2 + 2 * message.length);
            var x = 0;
            b.setUint8(x++, 98);
            b.setUint8(x++, 1);
            for(var _ = 0; _ < message.length; ++_) {
                b.setUint16(x, message.charCodeAt(_), true)
            }
            x += 2;
            this.send(b, true);
        } else if (this.dependency == 0) {
        }
    }
    move() {
        if(this.dependency == 1 || this.dependency == 3) {
            this.send(Client.movebuf)
        } else if (this.dependency == 2) {
            const mouseBuf = this.Buffer(21);
            mouseBuf.setUint8(0, 185);
            mouseBuf.setFloat64(1, Client.positioning.x, true);
            mouseBuf.setFloat64(9, Client.positioning.y, true);
            mouseBuf.setUint32(17, 0, true);
            this.send(mouseBuf, true);
        } else if (this.dependency == 0) {
        }
    }
    Buffer(buf) {
        return new DataView(new ArrayBuffer(!buf ? 1 : buf))
    }
    get active() {
        return this.ws && this.ws.readyState === WebSocket.OPEN;
    }
    get dependency() {
        switch(true) {
            case /oceanar.io/.test(this.origin):
            case /aquar.io/.test(this.origin):
                return 1;
            case /agar.live/.test(this.origin):
                return 2;
            case /cellcraft.io/.test(this.origin):
                return 3;
        }
        return 0;
    }
    send(data, encrypt) {
        if(this.active) {
            if(encrypt) {
                this.ws.send(data.buffer);
            } else this.ws.send(data);
        }
    }
}

if (location.host.includes('agma.io') || location.host.includes('cellcraft.io')) {
        window.WebSocket = class extends WebSocket {
		constructor() {
			let ws = super(...arguments);
			window.sockets?.push(this);

			setTimeout(() => {
				ws.onmessage = new Proxy(ws.onmessage, {
					apply(target, thisArg, argArray) {
						let data = argArray[0].data;
						return target.apply(thisArg, argArray);
					}
				});
			});
		}
	}

	WebSocket.prototype.send = new Proxy(WebSocket.prototype.send, {
		apply(target, thisArg, argArray) {
            var res = target.apply(thisArg, argArray);
			let pkt = argArray[0];
            if (typeof pkt == 'string') return res;
			if (pkt instanceof ArrayBuffer) pkt = new DataView(pkt);
            else if (pkt instanceof DataView) pkt = pkt;
            else pkt = new DataView(pkt.buffer);
            switch (pkt.getUint8(0, true)) {
                case 0:
                    switch (pkt.byteLength) {
                        case 9:
                            Client.movebuf = pkt;
							break;
                    }
                    break;
            }
            if (Client.serverIP !== thisArg.url) {
                Client.serverIP = thisArg.url;
            }
			return res;
		}
	});
        window.addEventListener('load', () => {
            Client.init();
        });
} else {
window.addEventListener('load', () => {
    Client.init();
    WebSocket.prototype.send = new Proxy(WebSocket.prototype.send, {
        apply(target, thisArg, argArray) {
            var res = target.apply(thisArg, argArray);
            let pkt = argArray[0];
            if(!Client) return;
            if(typeof pkt == 'string') return res;
            if(thisArg.url.includes('localhost')) return res;
            if(pkt instanceof ArrayBuffer) pkt = new DataView(pkt);
            else if(pkt instanceof DataView) pkt = pkt;
            else pkt = new DataView(pkt.buffer);
            switch(pkt.getUint8(0, true)) {
                case 16:
                case 185:
                    Client.positioning.x = pkt.getFloat64(1, true);
                    Client.positioning.y = pkt.getFloat64(9, true);
                    break;
                case 5:
                case 14:
                case 239:
                    Client.movebuf = pkt.buffer;
                    break;
            }
            if(Client.serverIP !== thisArg.url) {
                Client.serverIP = thisArg.url;
            }
            return res;
        }
    });
})
}