Greasy Fork

Xero-Bots | .io Bots 2022

The best bots for popular agar.io clone games.

目前为 2022-04-06 提交的版本。查看 最新版本

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