Drawaria Hide And Show Menus

Control visibility of elements on Drawaria.online (Gradient Blue/White Menu)

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         Drawaria Hide And Show Menus
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Control visibility of elements on Drawaria.online (Gradient Blue/White Menu)
// @author       YouTubeDrawaria
// @match        https://drawaria.online/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=drawaria.online
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Inject CSS first
    const style_css = `
        #draggable-menu {
            background: linear-gradient(135deg, #e0f2f7, #a7d9f7); /* Light blue to a slightly darker blue */
            border: 1px solid #7cb9e8; /* A coordinating blue border */
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); /* Slightly stronger, softer shadow */
            color: #333; /* Darker text for readability */
        }

        #draggable-menu div:first-child { /* Control Menu title */
            color: #004080; /* A dark blue for the title */
        }

        #element-selector {
            border: 1px solid #80a4e8; /* Blue border for the selector */
            background-color: #f8f8f8; /* Slightly off-white background */
            color: #333;
        }

        #show-element {
            background-color: #007bff; /* Standard Bootstrap blue */
            color: white;
            border: none;
            transition: background-color 0.2s ease; /* Smooth transition on hover */
        }

        #show-element:hover {
            background-color: #0056b3; /* Darker blue on hover */
        }

        #hide-element {
            background-color: #dc3545; /* Standard Bootstrap red */
            color: white;
            border: none;
            transition: background-color 0.2s ease;
        }

        #hide-element:hover {
            background-color: #bd2130; /* Darker red on hover */
        }
    `;

    const styleElement = document.createElement('style');
    styleElement.textContent = style_css;
    document.head.appendChild(styleElement);


    // Inject HTML for the draggable menu
    const menu_html = `
        <div id="draggable-menu" style="
            position: fixed;
            top: 50px;
            left: 50px;
            z-index: 99999; /* High z-index to be on top of everything */
            padding: 10px;
            cursor: grab; /* Indicates it's draggable */
            font-family: sans-serif;
            border-radius: 5px;
            display: flex;
            flex-direction: column;
            pointer-events: auto; /* Ensure menu itself is interactive */
        ">
            <div style="padding-bottom: 10px; text-align: center; font-weight: bold; cursor: default;">Drawaria Hide And Show Menus</div>
            <select id="element-selector" style="width: 100%; box-sizing: border-box; margin-bottom: 10px; padding: 5px; cursor: pointer;"></select>
            <div style="display: flex; justify-content: space-between;">
                <button id="show-element">Show</button>
                <button id="hide-element">Hide</button>
            </div>
        </div>
    `;

    document.body.insertAdjacentHTML('beforeend', menu_html);

    const menu = document.getElementById('draggable-menu');
    const selector = document.getElementById('element-selector');
    const showButton = document.getElementById('show-element');
    const hideButton = document.getElementById('hide-element');

    // Make the DIV element draggable
    let isDragging = false;
    let currentX;
    let currentY;
    let initialX;
    let initialY;
    let xOffset = 0;
    let yOffset = 0;

    // Use a flag to prevent click event on selector when dragging just finished
    let wasDragging = false;

    menu.addEventListener("mousedown", dragStart);
    document.addEventListener("mouseup", dragEnd);
    document.addEventListener("mousemove", drag);

    function dragStart(e) {
        if (e.target === menu || e.target === menu.children[0]) {
            initialX = e.clientX - xOffset;
            initialY = e.clientY - yOffset;
            isDragging = true;
            wasDragging = false;
            e.preventDefault();
            menu.style.cursor = 'grabbing';
        } else {
            isDragging = false;
        }
    }

    function dragEnd(e) {
        initialX = currentX;
        initialY = currentY;
        isDragging = false;
        menu.style.cursor = 'grab';
        if (Math.abs(e.clientX - initialX) > 5 || Math.abs(e.clientY - initialY) > 5) {
            wasDragging = true;
            setTimeout(() => wasDragging = false, 100);
        }
    }

    function drag(e) {
        if (isDragging) {
            e.preventDefault();
            currentX = e.clientX - initialX;
            currentY = e.clientY - initialY;

            xOffset = currentX;
            yOffset = currentY;

            setTranslate(currentX, currentY, menu);
        }
    }

    function setTranslate(xPos, yPos, el) {
        el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)";
    }

    // Comprehensive list of common elements on Drawaria.online
    const allKnownElements = [
        // --- General Page Layout / Top Level ---
        { selector: 'body', label: 'Page Body' },
        { selector: '#main', label: 'Main Game Area' }, // Contains game UI
        { selector: '#login', label: 'Login/Home Area' }, // Main login container
        { selector: '.modal-backdrop', label: 'Modal Backdrop (If Active)' }, // Appears behind modals
        { selector: '#loading', label: 'Loading Screen' }, // Appears during loading

        // --- Login/Home Screen Specific Elements ---
        { selector: '#login-leftcol', label: 'Login: Left Column' },
        { selector: '#login-midcol', label: 'Login: Middle Column' },
        { selector: '#login-rightcol', label: 'Login: Right Column' },
        { selector: '.sitelogo', label: 'Login: Site Logo' },
        { selector: '#avatarcontainer', label: 'Login: Avatar Container' },
        { selector: '#playername', label: 'Login: Player Name Input' },
        { selector: '#playernamebuttons', label: 'Login: Player Name Buttons' },
        { selector: '#langselector', label: 'Login: Language Selector' },
        { selector: '#quickplay', label: 'Login: Quick Play Button' },
        { selector: '#createroom', label: 'Login: Create Room Button' },
        { selector: '#joinplayground', label: 'Login: Join Playground Button' },
        { selector: '#showroomlist', label: 'Login: Showroom List' },
        { selector: '#continueautosaved-group', label: 'Login: Continue Autosaved Drawing' },
        { selector: '#abortjoin', label: 'Login: Abort Join Button' },
        { selector: 'a[href="/scoreboards/"]', label: 'Login: Scoreboards Link' }, // Using href to match
        { selector: 'a[href="/gallery/"]', label: 'Login: Gallery Link' }, // Using href to match
        { selector: '#discordprombox2', label: 'Login: Discord Promo Box (Bottom)' },
        { selector: '#discordprombox', label: 'Login: Discord Promo Box (Footer)' }, // This is the one in the footer
        { selector: '.promlinks', label: 'Login: Promo Links Container' },
        { selector: '.extimages', label: 'Login: External Image Links' },
        { selector: '.footer', label: 'Login: Footer' },
        { selector: '#socbuttons', label: 'Login: Social Buttons (FB/Twitter)' },
        { selector: '#howtoplaybox', label: 'Login: How to Play Box' },
        { selector: '#gameadsbanner', label: 'Login: Game Ads Banner' },
        { selector: '#rightbanner', label: 'Login: Right Banner' }, // Often an ad or event
        { selector: '#eventbanner-button', label: 'Login: Event Banner Button' },
        { selector: '#eventlogo', label: 'Login: Event Logo' },

        // --- In-Game Specific Elements ---
        { selector: '#leftbar', label: 'Game: Left Sidebar' },
        { selector: '#rightbar', label: 'Game: Right Sidebar' },
        { selector: '#canvas', label: 'Game: Drawing Canvas' },
        { selector: '#playerlist', label: 'Game: Player List' },
        { selector: '#cyclestatus', label: 'Game: Cycle Status' },
        { selector: '#votingbox', label: 'Game: Voting Box' },
        { selector: '#passturnbutton', label: 'Game: Pass Turn Button' },
        { selector: '.timer', label: 'Game: Round Timer' },
        { selector: '#roomcontrols', label: 'Game: Room Controls' },
        { selector: '#infotext', label: 'Game: Info Text' },
        { selector: '#gesturespickerselector', label: 'Game: Gestures Picker' },
        { selector: '#chatbox_messages', label: 'Game: Chat Messages' },
        { selector: '#drawcontrols', label: 'Game: Draw Controls' },
        { selector: '#turnresults', label: 'Game: Turn Results' },
        { selector: '#roundresults', label: 'Game: Round Results' },
        { selector: '#snapmessage_container', label: 'Game: Snap Message Container' },
        { selector: '#accountbox', label: 'Game: Account Box' },
        { selector: '#customvotingbox', label: 'Game: Custom Voting Box' },
        { selector: '#showextmenu', label: 'Game: Show Ext Menu Button' },
        { selector: '#playgroundroom_next', label: 'Game: Playground Next Button' },
        { selector: '#homebutton', label: 'Game: Home Button' },
        { selector: '.invbox', label: 'Game: Invitation Box' },

        // --- Modals (can appear in both states) ---
        { selector: '#howtoplaydialog', label: 'Modal: How to Play' },
        { selector: '#newroomdialog', label: 'Modal: New Room Options' },
        { selector: '#musictracks', label: 'Modal: Music Tracks' },
        { selector: '#inventorydlg', label: 'Modal: Inventory' },
        { selector: '#extmenu', label: 'Modal: Extra Menu' },
        { selector: '#pressureconfigdlg', label: 'Modal: Pressure Settings' },
        { selector: '#palettechooser', label: 'Modal: Palette Chooser' },
        { selector: '#wordchooser', label: 'Modal: Word Chooser' },
        { selector: '#targetword', label: 'Modal: Target Word Info' },
        { selector: '#invitedlg', label: 'Modal: Invite Dialog' },
        { selector: '#reportdlg', label: 'Modal: Report Dialog' },
        { selector: '#turtabortedmsg', label: 'Modal: Turn Aborted Msg' },
        { selector: '#drawsettings', label: 'Modal: Draw Settings' },

        // Add more specific modal sub-elements for finer control
        { selector: '.modal-header', label: 'Modal: Header (Any)' },
        { selector: '.modal-body', label: 'Modal: Body (Any)' },
        { selector: '.modal-footer', label: 'Modal: Footer (Any)' },
        { selector: '.form-group', label: 'Modal: Form Group (Any)' },
        { selector: '.table', label: 'Table (Any)' },
        { selector: '.spinner-border', label: 'Spinner/Loading Icon (Any)' },
    ];

    // Function to populate the selector
    function populateSelector() {
        const currentSelectedValue = selector.value;

        selector.innerHTML = ''; // Clear current options
        const addedSelectors = new Set();

        const placeholderOption = document.createElement('option');
        placeholderOption.value = '';
        placeholderOption.text = '-- Select an element --';
        selector.appendChild(placeholderOption);

        allKnownElements.forEach(item => {
            try {
                if (document.querySelector(item.selector) && !addedSelectors.has(item.selector)) {
                    const option = document.createElement('option');
                    option.value = item.selector;
                    option.text = item.label;
                    selector.appendChild(option);
                    addedSelectors.add(item.selector);
                }
            } catch (e) {
                console.warn("Invalid selector encountered:", item.selector, e);
            }
        });

        if (currentSelectedValue && Array.from(selector.options).some(opt => opt.value === currentSelectedValue)) {
            selector.value = currentSelectedValue;
        } else {
            selector.value = '';
        }

        console.log("Selector repopulated. Current selected value:", selector.value);
    }

    showButton.addEventListener('click', () => {
        const selectedValue = selector.value;
        if (!selectedValue) {
            console.log("No element selected to show.");
            return;
        }
        try {
            document.querySelectorAll(selectedValue).forEach(el => {
                if (el.dataset.originalDisplay) {
                    el.style.display = el.dataset.originalDisplay;
                    delete el.dataset.originalDisplay;
                } else {
                    el.style.display = '';
                }
                el.style.visibility = '';
                console.log(`Showing element: ${selectedValue}`, el);
            });
        } catch (e) {
            console.error(`Error showing element ${selectedValue}:`, e);
        }
    });

    hideButton.addEventListener('click', () => {
        const selectedValue = selector.value;
        if (!selectedValue) {
            console.log("No element selected to hide.");
            return;
        }
        try {
            document.querySelectorAll(selectedValue).forEach(el => {
                if (el.style.display && el.style.display !== 'none') {
                    el.dataset.originalDisplay = el.style.display;
                }
                el.style.display = 'none';
                console.log(`Hiding element: ${selectedValue}`, el);
            });
            if (selectedValue.includes('.modal-backdrop')) {
                document.querySelectorAll(selectedValue).forEach(el => el.remove());
                console.log(`Removed modal backdrop: ${selectedValue}`);
            }
        } catch (e) {
            console.error(`Error hiding element ${selectedValue}:`, e);
        }
    });

    const observer = new MutationObserver((mutations) => {
        clearTimeout(observer._timer);
        observer._timer = setTimeout(() => {
            console.log("DOM changed, repopulating selector...");
            populateSelector();
        }, 500);
    });

    observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });

    window.addEventListener('load', () => {
        console.log("Page loaded, initial selector population.");
        populateSelector();
    });
    if (document.readyState === 'complete') {
        populateSelector();
    } else {
        setTimeout(populateSelector, 1500);
    }

})();