MooMoo.io Gold bots

just fucking gold bots dont care it.

// ==UserScript==
// @name        MooMoo.io Gold bots
// @namespace   http://tampermonkey.net/
// @version     1
// @description  just fucking gold bots dont care it.
// @author       Bianos
// @require      https://cdn.jsdelivr.net/npm/msgpack-lite@0.1.26/dist/msgpack.min.js
// @license      MIT
// @match       *://*.moomoo.io/*
// @grant       none
// ==/UserScript==

let teams = [];
let teammates = [];
let msgpack_lite = window.msgpack
let color;
let name;
let oweb = window.WebSocket;
let socket;
var bot = [];
let ownplayer = {sid: undefined, x: undefined, y: undefined, dir: undefined, skinIndex: undefined, name: undefined}
let getAngleDist = (e, t) => {
    const i = Math.abs(t - e) % (Math.PI * 2);
    return i > Math.PI ? Math.PI * 2 - i : i
}
function gettoken() {
    return new Promise((resolve, reject) => {
        window.grecaptcha.ready(() => {
            window.grecaptcha.execute('6LfahtgjAAAAAF8SkpjyeYMcxMdxIaQeh-VoPATP', { action: 'homepage' })
                .then(token => resolve(token))
                .catch(err => reject(err));
        });
    });
}
window.WebSocket = function(...args) {
    socket = new oweb(...args);
    socket.addEventListener('message', async (event) => {
        let decoded = msgpack_lite.decode(new Uint8Array(event.data));
        let hooked;
        if (decoded.length > 1 && Array.isArray(decoded[1])) {
            hooked = [decoded[0], ...decoded[1]];
        } else {
            hooked = decoded
        }

        if(hooked[0] === 'io-init') {
            let religion = socket.url.split('/')[2]
            for(let i = 0; i <= 3; i++) {
                let token = await gettoken();
                bot.push(new Bot(religion , token));
            }
        }

        if(hooked[0] === "C") {
            if(ownplayer.sid == null || ownplayer.sid == undefined) {
                ownplayer.sid = hooked[1];
            }
        }

        if(hooked[0] === 'D') {
            if(hooked[1][1] === ownplayer.sid) {
                ownplayer.name = hooked[1][2];
                console.log(ownplayer.name);
            }
        }

        if (hooked[0] === "a") {
            for (let i = 0; i < hooked[1].length / 13; i++) {
                let playerInfo = hooked[1].slice(13 * i, 13 * i + 13);
                if (playerInfo[0] == ownplayer.sid) {
                    ownplayer.x = playerInfo[1];
                    ownplayer.y = playerInfo[2];
                    ownplayer.dir = playerInfo[3];
                    ownplayer.skinIndex = playerInfo[9];
                }
            }
            for(let bots of bot) {
                bots.autm.x = ownplayer.x
                bots.autm.y = ownplayer.y
            }
        }
    });
    return socket;
};
let randomhats = [28, 29, 30, 36, 37, 38, 44, 42, 43, 49];
class Bot {
    constructor(region, token) {
        this.socket = new WebSocket(`wss://${region}/?token=re:${token}`);
        this.sid = undefined;
        this.x = undefined;
        this.y = undefined;
        this.dir = undefined;
        this.buildIndex = undefined;
        this.weaponIndex = undefined;
        this.team = undefined;
        this.skinIndex = undefined;
        this.tailIndex = undefined;
        this.health = 100;
        this.packetCount = 0;
        this.items = [0, 3, 6, 10];
        this.oldIndex = 0;
        this.oldWeapon;
        this.foodCount = 100;
        setInterval(() => { this.packetCount = 0 }, 1000);
        this.autm = {
            x: undefined,
            y: undefined,
            boolean: true
        };

        this.socket.addEventListener('open', () => {
            console.log('websocket true');
            this.socket.addEventListener('message', async event => {
                let arraybuf;
                if (event.data instanceof Blob) {
                    arraybuf = await event.data.arrayBuffer();
                } else {
                    return;
                }
                let u8array = new Uint8Array(arraybuf);
                let decoded;
                try {
                    decoded = msgpack_lite.decode(u8array);
                } catch (error) {
                }
                var hooked;
                if (decoded.length > 1){
                    hooked = [decoded[0], ...decoded[1]];
                    if (hooked[1] instanceof Array){
                        hooked = hooked;
                    }
                } else {
                    hooked = decoded;
                }

                if(hooked[0] === 'io-init') {
                    this.spawn(name, color)
                }

                if (hooked[0] === 'A') {
                    teams = hooked[1];
                }

                if (hooked[0] === 'C') {
                    if (this.sid == null) {
                        this.sid = hooked[1];
                    }
                }

                if(hooked[0] === 'D') {
                    if(hooked[1][1] === this.sid) {
                        this.foodCount = 100;
                        this.health = 100;
                    }
                    if(hooked[1][2] === ownplayer.name) {
                        this.sendMessage('6', 'Hi Owner!');
                    }
                }

                if(hooked[0] === '6') {
                    if(hooked[1] === ownplayer.sid) {
                        this.sendMessage('6', hooked[2]);
                    }
                }

                if(hooked[0] === 'O') {
                    if(hooked[1] === this.sid) {
                        this.health = hooked[2];
                    }
                }

                if(hooked[0] === 'N') {
                    let food = hooked.indexOf('food')
                    if (food !== -1 && food < hooked.length - 1) {
                        this.foodCount = hooked[food + 1];
                    } else {
                        this.foodCount = 0;
                    }
                }

                if (hooked[0] === 'a') {
                    teammates = [];
                    for (let i = 0; i < hooked[1].length / 13; i++) {
                        let playerInfo = hooked[1].slice(13 * i, 13 * i + 13);
                        if (playerInfo[0] == this.sid) {
                            this.x = playerInfo[1];
                            this.y = playerInfo[2];
                            this.dir = playerInfo[3]
                            this.buildIndex = playerInfo[4];
                            this.weaponIndex = playerInfo[5];
                            this.team = playerInfo[7];
                            this.skinIndex = playerInfo[9];
                            this.tailIndex = playerInfo[10];
                        } else if (playerInfo[7] == this.team && playerInfo[0] != this.sid) {
                            teammates.push({ sid: playerInfo[0], x: playerInfo[1], y: playerInfo[2], isOwner: playerInfo[8] });
                        }
                    }
                    this.oldWeapon = this.weaponIndex;
                    this.equipIndex(0, randomhats[Math.floor(Math.random() * randomhats.length)], 0);
                    if(this.health < 100) {
                        let { x, y } = this.autm;
                        let distance = Math.sqrt(Math.pow(this.y - y, 2) + Math.pow(this.x - x, 2));
                        if(distance >= 200) {
                            let hc = (Math.ceil((100 - this.health) / 20));
                            if(this.foodCount >= 10) {
                                for(let i = 0; i <= hc; i++) {
                                    setTimeout(() => {
                                        this.place(this.items[0], null);
                                    }, 70);
                                }
                            }
                        }
                    }
                    if (this.autm.boolean) {
                        let { x, y } = this.autm;
                        let distance = Math.sqrt(Math.pow(this.y - y, 2) + Math.pow(this.x - x, 2));
                        let angle = Math.atan2(y - this.y, x - this.x);
                        if(distance >= 105) {
                            this.sendMessage('a', angle);
                        } else {
                            if(getAngleDist(angle, ownplayer.dir) <= (Math.PI / 2.6)) {
                                this.sendMessage('a', null);
                            } else {
                                this.sendMessage('a', ownplayer.dir);
                            }
                        }
                    }
                    if(this.dir != ownplayer.dir) {
                        this.sendMessage('D', ownplayer.dir);
                    }
                }
                if(hooked[0] === 'P') {
                    this.spawn(name, color);
                }
            });
        });
    }

    spawn() {
        this.sendMessage('M', {
            name: 'BianosGoldBot',
            moofoll: true,
            skin: 0
        });
    }

    join(clan) {
        this.sendMessage('b', clan);
    }

    equipIndex(buy, id, index) {
        this.sendMessage('c', buy, id, index);
    }

    aimAt(angle) {
        this.sendMessage('D', angle);
    }

    doHit(hitting, angle) {
        this.sendMessage('d', hitting, angle);
    }

    place(id, ang) {
        this.sendMessage('G', id);
        this.doHit(1, ang);
        this.doHit(0, ang);
        this.sendMessage('G', this.oldWeapon, true);
    }

    sendMessage(type, ...args) {
        if (this.packetCount < 120) {
            let message = [type, args];
            let eM = msgpack_lite.encode(message);
            let mes = new Uint8Array(eM);
            this.socket.send(mes);
            this.packetCount++;
        }
    }
}