Drawaria Hide And Show Menus

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

// ==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);
    }

})();