Greasy Fork is available in English.

Blooket Hacks; Test303

This is great for Blooket

// ==UserScript==
// @name         Blooket Hacks; Test303
// @namespace    
// @version      1.13
// @description This is great for Blooket
// @author       Gaskertube(also know as GaSk NT)
// @match        https://blooket.com
// @match        https://dashboard.blooket.com/stats
// @match        https://dashboard.blooket.com/blook
// @match        https://dashboard.blooket.com/market
// @match        https://dashboard.blooket.com/discover
// @match        https://play.blooket.com/play
// @match        https://dashboard.blooket.com/my-sets
// @run-at       document-end
// @license      Mit
// ==/UserScript==
 
(() => {
    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);
})();