Blooket Hacks GUI

script ported over from https://github.com/therealgliz/blooket-hacks

Versione datata 04/05/2024. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         Blooket Hacks GUI
// @namespace    http://tampermonkey.net/
// @version      2024-05-04
// @description  script ported over from https://github.com/therealgliz/blooket-hacks
// @author       You
// @match        https://*.blooket.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    (() => {
        let n = document.createElement('iframe');
        document.body.append(n);
        window.alert = n.contentWindow.alert.bind(window);
        window.prompt = n.contentWindow.prompt.bind(window);
        window.confirm = n.contentWindow.confirm.bind(window);
        n.remove();
    })();
    (() => {
        let style = document.createElement('style');
        style.innerHTML = (`details > summary {
    cursor: pointer;
    transition: 0.15s;
    list-style: none;
}
details > summary:hover {
    color: hsl(0, 0%, 50%)
}
details > summary::-webkit-details-marker {
    display: none;
}
details summary ~ * {
    animation: sweep .5s ease-in-out;
}

@keyframes sweep {
    0%    {opacity: 0; transform: translateY(-10px)}
    100%  {opacity: 1; transform: translateY(0)}
}
.cheat {
    border: none;
    background: hsl(0, 0%, 20%);
    padding: 5px;
    margin: 3px;
    width: 60%;
    color: hsl(0, 0%, 100%);
    transition: 0.2s;
    border-radius: 5px;
    cursor: pointer;
}
.cheat:hover {
    background: hsl(0, 0%, 30%);
}`);

        const GUI = document.createElement('div');
        GUI.appendChild(style);
        GUI.style.width = '400px';
        //GUI.style.height = '500px';
        GUI.style.background = 'hsl(0, 0%, 10%)';
        GUI.style.borderRadius = '10px';
        GUI.style.position = 'absolute';
        GUI.style.textAlign = 'center';
        GUI.style.fontFamily = 'Nunito';
        GUI.style.color = 'white';
        GUI.style.overflow = 'hidden';
        GUI.style.top = '50px';
        GUI.style.left = '50px';

        var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
        GUI.onmousedown = ((e = window.event) => {
            e.preventDefault();
            pos3 = e.clientX;
            pos4 = e.clientY;
            document.onmouseup = (() => {
                document.onmouseup = null;
                document.onmousemove = null;
            });
            document.onmousemove = ((e) => {
                e = e || window.event;
                e.preventDefault();
                pos1 = pos3 - e.clientX;
                pos2 = pos4 - e.clientY;
                pos3 = e.clientX;
                pos4 = e.clientY;
                GUI.style.top = (GUI.offsetTop - pos2) + "px";
                GUI.style.left = (GUI.offsetLeft - pos1) + "px";
            });
        });

        let header = document.createElement('div');
        GUI.appendChild(header);
        header.style.width = '100%';
        header.style.height = '35px';
        header.style.paddingTop = '2px';
        header.style.fontSize = '1.5rem';
        header.style.textAlign = 'center'
        header.innerHTML = `Blooket Cheats <span style="font-size: 0.75rem">v4.10.22</span>`;

        let loop;

        let close = document.createElement('button');
        header.appendChild(close);
        close.style.background = 'red';
        close.style.height = '45px';
        close.style.width = '45px';
        close.style.border = 'none';
        close.style.cursor = 'pointer';
        close.style.position = 'absolute';
        close.style.top = '-10px';
        close.style.right = '-10px';
        close.style.fontSize = '1.5rem';
        close.style.borderRadius = '10px';
        close.style.fontFamily = 'Nunito';
        close.style.fontWeight = 'bolder';
        close.style.paddingTop = '10px';
        close.style.paddingRight = '15px';
        close.innerText = 'X';
        close.onclick = () => {
            GUI.remove();
            clearInterval(loop);
            removeEventListener('keypress', toggleHidden)
        }

        let minimize = document.createElement('button');
        header.appendChild(minimize);
        minimize.style.background = '#444444';
        minimize.style.height = '45px';
        minimize.style.width = '45px';
        minimize.style.border = 'none';
        minimize.style.cursor = 'pointer';
        minimize.style.position = 'absolute';
        minimize.style.top = '-10px';
        minimize.style.left = '-10px';
        minimize.style.fontSize = '1.5rem';
        minimize.style.borderRadius = '10px';
        minimize.style.fontFamily = 'Nunito';
        minimize.style.fontWeight = 'bolder';
        minimize.style.paddingTop = '10px';
        minimize.style.paddingLeft = '15px';
        minimize.innerText = '-';
        minimize.onclick = () => {
            bodyDiv.hidden = !bodyDiv.hidden;
        }
        let bodyDiv = document.createElement('div');
        let body = document.createElement('div');
        bodyDiv.appendChild(body);
        GUI.appendChild(bodyDiv);

        body.innerHTML = (`<span id="curPageEl">${getSite(true) ? `Current gamemode: ${getSite(true)}` : 'No game detected'}</span><br><span>(Press E to hide)</span><br>`);
        body.style.display = 'block';
        body.style.margin = '10px';
        //body.style.background = 'white';
        body.style.minHeight = '70px';

        let activeCheats = document.createElement('span');
        body.appendChild(activeCheats);

        document.body.append(GUI);

        let footer = document.createElement('div');
        bodyDiv.appendChild(footer);
        footer.style.fontSize = '0.9rem';
        footer.style.paddingBottom = '5px';
        footer.innerHTML = (`<span>GUI by OneMinesraft2#5394<br>Cheats by <a style="color: lightblue" href="https://twitter.com/glizuwu">gliz</a></span>`);

        var getValues = () => new Promise((e, t) => {
            try {
                let n = window.webpackJsonp.map(e => Object.keys(e[1]).map(t => e[1][t])).reduce((e, t) => [...e, ...t], []).find(e => /\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/.test(e.toString()) && /\(new TextEncoder\)\.encode\(\"(.+?)\"\)/.test(e.toString())).toString();
                e({
                    blooketBuild: n.match(/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/)[0],
                    secret: n.match(/\(new TextEncoder\)\.encode\(\"(.+?)\"\)/)[1]
                })
            } catch {
                t("Could not fetch auth details")
            }
        })
        var encodeValues = async (e, t) => {
            let d = window.crypto.getRandomValues(new Uint8Array(12));
            return window.btoa(Array.from(d).map(e => String.fromCharCode(e)).join("") + Array.from(new Uint8Array(await window.crypto.subtle.encrypt({
                name: "AES-GCM",
                iv: d
            }, await window.crypto.subtle.importKey("raw", await window.crypto.subtle.digest("SHA-256", (new TextEncoder).encode(t)), {
                name: "AES-GCM"
            }, !1, ["encrypt"]), (new TextEncoder).encode(JSON.stringify(e))))).map(e => String.fromCharCode(e)).join(""))
        };

        function reactHandler() {
            return Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner;
        }

        let autoAnswer, highlightAnswers, choiceESP, autoPassword, chestESP;

        let cheats = {
            global: {
                'Get Daily Rewards': () => {
                    fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
                        getValues().then(async e => {
                            fetch("https://api.blooket.com/api/users/add-rewards", {
                                method: "put",
                                credentials: "include",
                                headers: {
                                    "content-type": "application/json",
                                    "X-Blooket-Build": e.blooketBuild
                                },
                                body: await encodeValues({
                                    name: x.name,
                                    addedTokens: 250,
                                    addedXp: 300
                                }, e.secret)
                            });
                            fetch("https://api.blooket.com/api/users/add-rewards", {
                                method: "put",
                                credentials: "include",
                                headers: {
                                    "content-type": "application/json",
                                    "X-Blooket-Build": e.blooketBuild
                                },
                                body: await encodeValues({
                                    name: x.name,
                                    addedTokens: 250,
                                    addedXp: 300
                                }, e.secret)
                            }).then(() => alert('Added daily rewawrds!')).catch(() => alert('There was an error when adding rewards!'));;
                        }).catch(() => alert('There was an error encoding requests!'));
                    }).catch(() => alert('There was an error getting username!'));
                },
                'Spoof Blooks': () => {
                    if (!window.location.pathname.split('/').includes('lobby')) return alert('You must be in a game lobby! (e.g. https://www.blooket.com/play/lobby)');
                    reactHandler().stateNode.setState({ lockedBlooks: [], takenBlooks: [] });
                },
                'Toggle Auto Answer': () => { autoAnswer = !autoAnswer },
                'Toggle Highlight Answers': () => { highlightAnswers = !highlightAnswers },
                'Spam Open Boxes': () => {
                    let box = prompt(`Which box do you want to open? (e.g. Space)`);
                    let boxes = {
                        safari: 25,
                        aquatic: 20,
                        bot: 20,
                        space: 20,
                        breakfast: 15,
                        medieval: 15,
                        wonderland: 15
                    }
                    if (!Object.keys(boxes).includes(box.toLowerCase())) return alert('I could not find that box!');
                    let amount = prompt('How many boxes do you want to open?');
                    fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
                        if (x.tokens < boxes[box.toLowerCase()] * amount) amount = Math.floor(x.tokens / boxes[box.toLowerCase()]);
                        if (!amount) return alert('You do not have enough tokens!');
                        let wait = ms => new Promise(r => setTimeout(r, ms));
                        getValues().then(async e => {
                            let error = false,
                                blooks = [];
                            for (let i = 0; i < amount; i++) {
                                fetch("https://api.blooket.com/api/users/unlockblook", {
                                    method: "put",
                                    credentials: "include",
                                    headers: {
                                        "content-type": "application/json",
                                        "X-Blooket-Build": e.blooketBuild
                                    },
                                    body: await encodeValues({
                                        name: x.name,
                                        box: box.charAt(0).toUpperCase() + box.slice(1).toLowerCase()
                                    }, e.secret)
                                }).then(async x => {
                                    let blook = await x.json();
                                    blooks.push(blook.unlockedBlook);
                                    alert(`${blook.unlockedBlook} (${i + 1}/${amount})`);
                                }).catch(() => { error = true });
                                await wait(750);
                                if (error) break;
                            }
                            let count = {};
                            blooks.forEach(blook => { count[blook] = (count[blook] || 0) + 1 });
                            alert(`Results:\n` + Object.entries(count).map((x) => `    ${x[1]} ${x[0]}`).join(`\n`));
                        }).catch(() => alert('There was an error encoding requests!'));
                    }).catch(() => alert('There was an error getting username!'));
                },
                'Auto Sell Dupes': () => {
                    fetch("https://api.blooket.com/api/users", { credentials: "include" }).then(x => x.json()).then(x => {
                        let blooks = Object.entries(x.unlocks).map(x => [x[0], x[1] - 1]).filter(x => x[1] > 0);
                        let wait = ms => new Promise(r => setTimeout(r, ms));
                        getValues().then(async e => {
                            let error = false;
                            alert('Selling duplicate blooks, please wait');
                            for (let [blook, numSold] of blooks) {
                                fetch("https://api.blooket.com/api/users/sellblook", {
                                    method: "put",
                                    credentials: "include",
                                    headers: {
                                        "content-type": "application/json",
                                        "X-Blooket-Build": e.blooketBuild
                                    },
                                    body: await encodeValues({
                                        name: x.name,
                                        blook,
                                        numSold
                                    }, e.secret)
                                }).catch(() => { error = true });
                                await wait(750);
                                if (error) break;
                            }
                            alert(`Results:\n` + blooks.map((x) => `    ${x[1]} ${x[0]}`).join(`\n`));
                        }).catch(() => alert('There was an error encoding requests!'));
                    }).catch(() => alert('There was an error getting user data!'));
                }
            },
            cafe: {
                'Infinite Food': () => {
                    if (document.location.pathname != "/cafe") return alert("This cheat doesn't work in the shop!");
                    reactHandler().stateNode.state.foods.forEach(e => e.stock = 99999);
                    reactHandler().stateNode.forceUpdate();
                },
                'Max Levels': () => {
                    if (document.location.pathname != "/cafe/shop") return alert("This cheat only works in the shop!");
                    Object.keys(reactHandler().stateNode.state.items).forEach(x => reactHandler().stateNode.state.items[x] = 5);
                    reactHandler().stateNode.forceUpdate();
                },
                'Set Cash': () => {
                    reactHandler().stateNode.setState({ cafeCash: Number(parseFloat(prompt('How much cash would you like?'))) });
                },
                'Reset Abilities': () => {
                    Object.keys(reactHandler().stateNode.state.abilities).forEach(x => reactHandler().stateNode.state.abilities[x] = 5);
                    reactHandler().stateNode.forceUpdate();
                }
            },
            kingdom: {
                'Choice ESP': () => { choiceESP = !choiceESP },
                'Max Stats': () => {
                    reactHandler().stateNode.setState({ materials: 100, people: 100, happiness: 100, gold: 100 });
                },
                'Disable Toucan': () => {
                    reactHandler().stateNode.taxCounter = Number.MAX_VALUE;
                },
                'Set Guests': () => {
                    let guestScore = Number(parseFloat(prompt('How many guests do you want?')));
                    reactHandler().stateNode.setState({ guestScore });
                },
                'Skip Guest': () => {
                    reactHandler().stateNode.nextGuest();
                }
            },
            crypto: {
                'Auto Hack': () => { autoPassword = !autoPassword },
                'Set Crypto': () => {
                    let amount = Number(parseFloat(prompt('How much crypto do you want?')));
                    reactHandler().stateNode.setState({ crypto2: amount, crypto: amount });
                },
                'Custom Password': () => {
                    let password = Number(parseFloat(prompt('What do you want to set your password to?')));
                    reactHandler().stateNode.setState({ password });
                },
                'Remove Hack': () => {
                    reactHandler().stateNode.setState({ hack: '' })
                },
                'Reset Player\'s Crypto': () => {
                    let target = prompt("Name of player");
                    let e = reactHandler();
                    !target || e.memoizedProps.firebase.getDatabaseVal(e.memoizedProps.client.hostId, "c", (...o) => {
                        let data = Object.keys(o[0]);
                        if (data.some(e => e == target)) data.forEach(player => {
                            if (player == target) {
                                e.memoizedProps.firebase.setVal({
                                    id: e.memoizedProps.client.hostId,
                                    path: "c/" + e.memoizedProps.client.name,
                                    val: {
                                        p: e.stateNode.state.password,
                                        b: e.memoizedProps.client.blook,
                                        cr: e.stateNode.state.crypto,
                                        tat: player + ":" + (o[0][player].cr || 0)
                                    }
                                }); alert('Reset player\'s crypto')
                            };
                        });
                        else alert("Player does not exist");
                    })
                }
            },
            factory: {
                'All Mega Bot': () => {
                    let blooks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].fill({ name: "Mega Bot", color: "#d71f27", class: "🤖", rarity: "Legendary", cash: [80000, 430000, 4200000, 62000000, 1000000000], time: [5, 5, 3, 3, 3], price: [7000000, 120000000, 1900000000, 35000000000], active: false, level: 4, bonus: 5.5 })
                    reactHandler().stateNode.setState({ blooks });
                },
                'Remove Glitches': () => {
                    reactHandler().stateNode.setState({
                        glitch: "",
                        bites: 0,
                        ads: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                        hazards: ["", "", "", "", ""],
                        lol: false,
                        joke: false,
                        slow: false,
                        dance: false,
                        popUpAmount: 0,
                    });
                },
                'Max Blooks': () => {
                    reactHandler().stateNode.state.blooks.forEach(blook => { blook.level = 4 });
                },
                'Set Cash': () => {
                    let cash = Number(parseFloat(prompt('How much cash do you want?')));
                    reactHandler().stateNode.setState({ cash });
                },
            },
            fishing: {
                'Set Weight': () => {
                    let weight = Number(parseFloat(prompt('How much weight do you want?')));
                    reactHandler().stateNode.setState({ weight2: weight, weight });
                },
                'Set Lure': () => {
                    let lure = Number(parseFloat(prompt('What do you want to set your lure to? (1 - 5)'))) - 1;
                    reactHandler().stateNode.setState({ lure: lure < 0 ? 0 : lure > 4 ? 4 : lure });
                }
            },
            gold: {
                'Set Gold': () => {
                    let gold = Number(parseFloat(prompt('How much gold do you want?')));
                    reactHandler().stateNode.setState({ gold2: gold, gold });
                },
                'Chest ESP': () => { chestESP = !chestESP },
                "Set Player's Gold": () => {
                    let e = reactHandler(),
                        player = prompt("Player to set gold"),
                        amount = Number(parseFloat(prompt("Amount to set gold to")));
                    e.memoizedProps.firebase.setVal({
                        id: e.memoizedProps.client.hostId,
                        path: "c/" + e.memoizedProps.client.name,
                        val: {
                            b: e.memoizedProps.client.blook,
                            g: e.stateNode.state.gold,
                            tat: player + ":swap:" + amount
                        }
                    })
                }
            },
            racing: {
                'Instant Win': () => {
                    reactHandler().stateNode.setState({ progress: reactHandler().stateNode.state.goalAmount });
                    setTimeout(() => {
                        try {
                            Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click();
                        } catch {
                            try {
                                Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click();
                            } catch { };
                        };
                    }, 100);
                }
            },
            defense: {
                'Clear Enemies': () => {
                    reactHandler().stateNode.enemies = [];
                },
                'Max Towers': () => {
                    reactHandler().stateNode.towers.forEach(tower => {
                        tower.damage = 99999999;
                        tower.range = 99999999;
                        tower.fullCd = 0;
                    });
                },
                'Remove Ducks': () => {
                    data = reactHandler().stateNode;
                    data.ducks.forEach(x => { data.tiles[x.y][x.x] = 0; });
                    data.ducks.length = 0;
                },
                'Place Towers Anywhere': () => {
                    reactHandler().stateNode.tiles = reactHandler().stateNode.tiles.map(x => x.map(e => e == 2 ? 0 : e));
                },
                'Set Damage': () => {
                    let dmg = Number(parseFloat(prompt('How much damage do you want?')));
                    reactHandler().stateNode.dmg = dmg;
                },
                'Set Round': () => {
                    let round = Number(parseFloat(prompt('What round do you want to set it to?')));
                    reactHandler().stateNode.setState({ round });
                },
                'Set Tokens': () => {
                    let tokens = Number(parseFloat(prompt('How many tokens do you want?')));
                    reactHandler().stateNode.setState({ tokens });
                }
            },
            doom: {
                'Set Coins': () => {
                    try {
                        reactHandler().stateNode.props.setTowerCoins(Number(parseFloat(prompt('How many coins do you want?'))));
                    } catch { }
                },
                'Lower Enemy Stats': () => {
                    let data = reactHandler().stateNode.state;
                    if (data.phase != 'select') return alert('You must be on the attribute selection page!');
                    reactHandler().stateNode.setState({ enemyCard: { ...data.enemyCard, strength: 0, charisma: 0, wisdom: 0 } })
                },
                'Max Player Stats': () => {
                    let data = reactHandler().stateNode.state;
                    if (data.phase != 'select') return alert('You must be on the attribute selection page!');
                    reactHandler().stateNode.setState({ myCard: { ...data.myCard, strength: 20, charisma: 20, wisdom: 20 } })
                },
                'Heal Player': () => {
                    reactHandler().stateNode.setState({ myLife: 100 });
                }
            },
            rush: {
                'Set Defense': () => {
                    let e = reactHandler();
                    e.stateNode.props.firebase.setVal({
                        id: e.stateNode.props.client.hostId,
                        path: 'c/' + e.stateNode.props.client.name + '/d',
                        val: Number(parseFloat(prompt('How much defense do you want?')))
                    });
                },
                'Set Blooks': () => {
                    let e = reactHandler();
                    e.stateNode.props.firebase.setVal({
                        id: e.stateNode.props.client.hostId,
                        path: 'c/' + e.stateNode.props.client.name + '/bs',
                        val: Number(parseFloat(prompt('How many blooks do you want?')))
                    });
                }
            }
        };

        let global = document.createElement('details');
        global.innerHTML = (`<summary style="padding: 10px; font-size: 1.5em; font-weight: bolder">Global</summary>`);
        for (var i = 0; i < Object.keys(cheats.global).length; i++) {
            let cheat = createButton(Object.keys(cheats.global)[i]);
            cheat.onclick = cheats.global[Object.keys(cheats.global)[i]];
            global.appendChild(cheat);
        }
        global.open = true;
        global.style.paddingBottom = '10px';
        body.appendChild(global);

        let cheatDiv = document.createElement('div');
        body.appendChild(cheatDiv);

        loop = setInterval(() => {
            if (curPage != getSite()) {
                curPage = getSite();
                curPageEl.innerText = getSite(true) ? `Current gamemode: ${getSite(true)}` : 'No game detected'
                Array.from(cheatDiv.children).forEach(x => x.remove());
                if (curPage && cheats[curPage]) Object.keys(cheats[curPage]).forEach(cheat => {
                    let button = createButton(cheat);
                    button.onclick = cheats[curPage][cheat];
                    cheatDiv.appendChild(button);
                    cheatDiv.appendChild(document.createElement('br'));
                })
            };
            let activeCheatsText = (`Auto Answer: ${autoAnswer ? 'Enabled' : 'Disabled'}\nHighlight Answers: ${highlightAnswers ? 'Enabled' : 'Disabled'}${curPage == 'kingdom' ? `\nChoice ESP: ${choiceESP ? 'Enabled' : 'Disabled'}` : curPage == 'crypto' ? `\nAuto Hack: ${autoPassword ? 'Enabled' : 'Disabled'}` : curPage == 'gold' ? `\nChest ESP: ${chestESP ? 'Enabled' : 'Disabled'}` : ''}`);
            activeCheats.innerText != activeCheatsText && (activeCheats.innerText = activeCheatsText);
            if (autoAnswer) {
                try {
                    Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedState.question.correctAnswers[0])[0].click();
                } catch {
                    try {
                        Array.from(document.body.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML == reactHandler().memoizedProps.client.question.correctAnswers[0])[0].click();
                    } catch { };
                };
            };
            if (highlightAnswers) {
                try {
                    Array.from(document.querySelector('div[class*="answersHolder"').children).forEach(x => {
                        if (reactHandler().memoizedState.question.correctAnswers.includes(x.innerText) || reactHandler().memoizedProps.client.question.correctAnswers.includes(x.innerText)) x.firstChild.style = 'background-color: rgb(0, 207, 119);';
                        else x.firstChild.style = 'background-color: rgb(225, 40, 33);';
                    });
                } catch { }
            };
            if (curPage == 'kingdom') {
                Array.from(document.getElementsByClassName('choiceESP')).forEach(x => x.remove())
                if (choiceESP) {
                    try {
                        let elements = {
                            materials: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('tree'))),
                            people: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('users') && e.parentElement.className.includes('statContainer'))),
                            happiness: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('grin'))),
                            gold: Array.from(document.querySelectorAll('div')).find(x => Array.from(x.children).find(e => e.className.includes('coins')))
                        }
                        let data = reactHandler().stateNode.state.guest;
                        Object.entries(data.yes).forEach(x => {
                            if (x[0] == 'msg') return;
                            let element = document.createElement('div');
                            element.className = 'choiceESP';
                            element.style = 'font-size: 24px; color: rgb(75, 194, 46); font-weight: bolder;';
                            element.innerText = String(x[1])
                            elements[x[0]].appendChild(element);
                        })
                        Object.entries(data.no).forEach(x => {
                            if (x[0] == 'msg') return;
                            let element = document.createElement('div');
                            element.className = 'choiceESP';
                            element.style = 'font-size: 24px; color: darkred; font-weight: bolder;';
                            element.innerText = String(x[1])
                            elements[x[0]].appendChild(element);
                        })
                    } catch (e) { }
                };
            }
            if (curPage == 'crypto' && autoPassword) {
                let { stage, correctPassword } = Object.values(document.querySelector('#app > div > div'))[1].children[1]._owner.stateNode.state;
                if (stage == "hack") Array.from(document.querySelectorAll('div')).filter(x => x.innerHTML == correctPassword)[0].click();
            };
            if (curPage == 'gold' && chestESP) {
                try {
                    if (reactHandler().stateNode.state.stage == 'prize') {
                        let { choices } = reactHandler().stateNode.state;
                        let div = document.querySelector("div[class*='regularBody']").children[1];
                        if (div) {
                            if (!document.querySelectorAll(".chest-esp").length) choices.forEach((box, i) => {
                                textElement = document.createElement('p');
                                textElement.className = "chest-esp";
                                textElement.innerText = box.text;
                                textElement.style = `text-align: center;
                    font-size: 30px;
                    color: white;
                    font-family:Titan One;
                    sans-serif;
                    border-color: black;
                    margin-top: 200px;`
                                try { div.children[i].appendChild(textElement); } catch (e) { console.log(e) }
                            });
                            else choices.forEach((box, i) => {
                                if (div.children.length == 3 && div.children[i].children[1].innerText != box.text) div.children[i].children[1].innerText = box.text;
                            })
                        }
                    }
                } catch (e) { console.log(e) }
            };
        });

        let curPage = getSite();
        if (curPage && cheats[curPage]) Object.keys(cheats[curPage]).forEach(cheat => {
            let button = createButton(cheat);
            button.onclick = cheats[curPage][cheat];
            cheatDiv.appendChild(button);
            cheatDiv.appendChild(document.createElement('br'));
        })

        function createButton(cheat) {
            let button = document.createElement('button');
            button.classList.add('cheat');
            button.innerText = cheat;
            return button
        }
        function getSite(capitalize) {
            switch (window.location.pathname.split('/')[2]) {
                case 'rush': return capitalize ? 'Blook Rush' : 'rush';
                case 'gold': return capitalize ? 'Gold Quest' : 'gold';
                case 'fishing': return capitalize ? 'Fishing Frenzy' : 'fishing';
                case 'hack': return capitalize ? 'Crypto Hack' : 'crypto';
                case 'battle-royale': return capitalize ? 'Battle Royale' : 'royale';
                case 'factory': return capitalize ? 'Factory' : 'factory';
                case 'racing': return capitalize ? 'Racing' : 'racing';
                case 'classic': return capitalize ? 'Classic' : 'classic';
                default: switch (window.location.pathname.split('/')[1]) {
                    case 'defense': return capitalize ? 'Tower Defense' : 'defense';
                    case 'cafe': return capitalize ? 'Café' : 'cafe';
                    case 'tower': return capitalize ? 'Tower of Doom' : 'doom';
                    case 'kingdom': return capitalize ? 'Crazy Kingdom' : 'kingdom';
                    default: return false;
                }
            };
        };
        function toggleHidden(e) {
            e.code == 'KeyE' && (GUI.hidden = !GUI.hidden)
        };
        addEventListener('keypress', toggleHidden);
    })()
})();