Xero-Bots | .io Bots 2022

The best bots for popular agar.io clone games.

Από την 06/04/2022. Δείτε την τελευταία έκδοση.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

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

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

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

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==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;
        }
    });
})
}