Greasy Fork is available in English.

Darken Blooket Answers

Only You Can See The Right Answers!

// ==UserScript==
// @name         Darken Blooket Answers
// @namespace    http://greasyfork.org/
// @version      1.3
// @description  Only You Can See The Right Answers!
// @author       Solomon Wylie
// @match        https://*.blooket.com/*
// @exclude      https://play.blooket.com/play
// @icon         https://res.cloudinary.com/blooket/image/upload/v1613003832/Blooks/blackAstronaut.svg
// @grant        none
// @license      MIT
// ==/UserScript==

(() => {
    const cheat = (async () => {
        setInterval(() => {
            const { stateNode: { state, props } } = Object.values((function react(r = document.querySelector("body>div")) { return Object.values(r)[1]?.children?.[0]?._owner.stateNode ? r : react(r.querySelector(":scope>div")) })())[1].children[0]._owner;
            [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer, i) => {
                if ((state.question || props.client.question).correctAnswers.includes((state.question || props.client.question).answers[i])) {
                    // Modify only the correct answer to a darker shade
                    const originalColor = window.getComputedStyle(answer).backgroundColor;
                    const darkerColor = darkenColor(originalColor, 0.003); // Adjust the darkness speed as needed
                    answer.style.backgroundColor = darkerColor;
                }
            });
        });
    });
    let img = new Image;
    img.src = "https://raw.githubusercontent.com/05Konz/Blooket-Cheats/main/autoupdate/timestamps/global/intervals/highlightAnswers.png?" + Date.now();
    img.crossOrigin = "Anonymous";
    img.onload = function() {
        const c = document.createElement("canvas");
        const ctx = c.getContext("2d");
        ctx.drawImage(img, 0, 0, this.width, this.height);
        let { data } = ctx.getImageData(0, 0, this.width, this.height), decode = "", last;
        for (let i = 0; i < data.length; i += 4) {
            let char = String.fromCharCode(data[i + 1] * 256 + data[i + 2]);
            decode += char;
            if (char == "/" && last == "*") break;
            last = char;
        }
        const [_, time, error] = decode.match(/LastUpdated: (.+?); ErrorMessage: "([\s\S]+?)"/);
        if (parseInt(time) <= 1708817191528) cheat();
    }
    img.onerror = img.onabort = () => {
        img.onerror = img.onabort = null;
        cheat();
    }

    // Function to darken a given color
    function darkenColor(color, factor) {
        // Parse the RGB values
        const match = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        if (!match) return color;

        // Calculate darker RGB values
        const r = Math.floor(parseInt(match[1]) * (1 - factor));
        const g = Math.floor(parseInt(match[2]) * (1 - factor));
        const b = Math.floor(parseInt(match[3]) * (1 - factor));

        // Return the darker color in RGB format
        return `rgb(${r}, ${g}, ${b})`;
    }
})();

(function(){
    function getStateNode(){
    for(let i of Object.keys(document.querySelector("#app>div>div"))){
        if(i.toString().includes("__reactEventHandlers")){
            for(let p of Object.values(document.querySelector("#app>div>div")[i].children.filter(n=>n))){
                if(p._owner&&p._owner.stateNode)return p._owner.stateNode
            }
        }
    }
}
    window.setInterval(()=>{
        try{
            Array.from(document.querySelectorAll("div")).find(n=>n.innerText===getStateNode().state.correctPassword).click()}
        catch{
        }
    },10);
})();