Blooket Hacks

Blooket hacks menu for enhancing gameplay.

Versão de: 28/03/2024. Veja: a última versão.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         Blooket Hacks
// @namespace    http://tampermonkey.net/
// @version      2024-03-28
// @description  Blooket hacks menu for enhancing gameplay.
// @author       Jesse Nicolaï
// @match        https://*.blooket.com/*
// @icon         https://ac.blooket.com/play-l/favicon.ico
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Create the menu
    const menuContent = document.createElement('div');
    menuContent.id = 'menuContent';
    menuContent.style.cssText = `
        position: fixed;
        top: 1%;
        left: 1%;
        color: #fff;
        background: #1c1c1c;
        padding-top: 1vh;
        padding-bottom: 1vh;
        padding-left: 3vh;
        padding-right: 3vh;
        border-radius: 12px;
        z-index: 9999;
        cursor: move;
        font-size: 14px; /* Adjust font size */
    `;

    menuContent.innerHTML = `
        <h1 style="margin-bottom: 5px; text-align: center;">Blooket Hacks</h1>
        <br>
        <div id="menuList" style="text-align: center;">
            <button id="highlightAnswers" class="menu-button">Highlight Answers: Off</button><br>
            <button id="removeWrongAnswers" class="menu-button">Remove Wrong Answers: Off</button><br>
            <button id="autoAnswer" class="menu-button">Auto Answer: Off</button><br>
        </div>
        <div style="text-align: center; margin-top: 5px;">
        <br>
            <h4 style="margin: 0; padding: 0;">Press q to hide</h4><br><h5 style="margin-top: -2vh; padding: 0;">Made By Jesse Nicolaï</h5>
        </div>
    `;
    document.body.appendChild(menuContent);

    // Function to toggle the menu
    function toggleMenu() {
        menuContent.style.display = menuContent.style.display === 'none' ? 'block' : 'none';
    }

    // Toggle the menu when the Q key is pressed
    document.addEventListener('keydown', function(event) {
        if (event.key === 'q' || event.key === 'Q') {
            toggleMenu();
        }
    });

    // Function to toggle feature and change button style
    function toggleFeature(button, isActive) {
        if (isActive) {
            button.classList.add('active');
            button.textContent = button.textContent.replace(': Off', ': On');
        } else {
            button.classList.remove('active');
            button.textContent = button.textContent.replace(': On', ': Off');
        }
    }

    // Toggle feature when clicking on buttons
    const highlightButton = document.getElementById('highlightAnswers');
    let highlightActive = false;
    let highlightInterval = null; // Variable to hold the interval ID
    highlightButton.addEventListener('click', function() {
        highlightActive = !highlightActive;
        toggleFeature(highlightButton, highlightActive);
        if (highlightActive) {
            // Add your code for toggling highlight answers feature here
            highlightInterval = 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])) answer.style.backgroundColor = "rgb(0, 207, 119)";
                    else answer.style.backgroundColor = "rgb(189, 15, 38)";
                });
            });
        } else {
            clearInterval(highlightInterval); // Stop the interval when toggled off
            // Reset background color of answer containers when turning off highlight
            [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer) => {
                answer.style.backgroundColor = "";
            });
        }
    });

    const removeButton = document.getElementById('removeWrongAnswers');
    let removeActive = false;
    let removeInterval = null; // Variable to hold the interval ID
    removeButton.addEventListener('click', function() {
        removeActive = !removeActive;
        toggleFeature(removeButton, removeActive);
        if (removeActive) {
            // Add your code for toggling remove wrong answers feature here
            removeInterval = 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])) answer.style.display = "none";
                    else answer.style.display = "";
                });
            });
        } else {
            clearInterval(removeInterval); // Stop the interval when toggled off
            // Reset display of answer containers when turning off remove wrong answers
            [...document.querySelectorAll(`[class*="answerContainer"]`)].forEach((answer) => {
                answer.style.display = "";
            });
        }
    });

    const autoButton = document.getElementById('autoAnswer');
    let autoActive = false;
    let autoInterval = null; // Variable to hold the interval ID
    autoButton.addEventListener('click', function() {
        autoActive = !autoActive;
        toggleFeature(autoButton, autoActive);
        if (autoActive) {
            // Add your code for auto-answering here
            autoInterval = setInterval(() => {
                try {
                    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;
                    Array.from(document.querySelectorAll('div[class*="answerText"]')).filter(t => t.firstChild.innerHTML === (state.question || props.client.question).correctAnswers[0])[0].click();
                } catch {}
            });
        } else {
            clearInterval(autoInterval); // Stop the interval when toggled off
        }
    });

    // Make the menu draggable
    let isDragging = false;
    let offsetX, offsetY;

    menuContent.addEventListener('mousedown', function(event) {
        isDragging = true;
        offsetX = event.clientX - parseFloat(window.getComputedStyle(menuContent).left);
        offsetY = event.clientY - parseFloat(window.getComputedStyle(menuContent).top);
    });

    document.addEventListener('mousemove', function(event) {
        if (isDragging) {
            menuContent.style.left = (event.clientX - offsetX) + 'px';
            menuContent.style.top = (event.clientY - offsetY) + 'px';
        }
    });

    document.addEventListener('mouseup', function() {
        isDragging = false;
    });

    // Style the menu
    GM_addStyle(`
        .menu-button {
            margin-bottom: 5px;
            cursor: pointer;
            background-color: darkred;
            color: #fff;
            border: none;
            padding: 5px 10px;
            border-radius: 3px;
            width: 200px;
        }
        .menu-button.active {
            background-color: green;
        }
    `);
})();