Geoguessr Hide Results

Hide challenges results

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Geoguessr Hide Results
// @namespace    http://tampermonkey.net/
// @author       BrainyGPT
// @version      1.4
// @description  Hide challenges results
// @match        https://www.geoguessr.com/*
// @icon         https://i.imgur.com/IG8yPEV.png
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    const TOPBAR_OVERLAY_ID = 'tampermonkey-blackout-overlay-topbar';
    const FULLSCREEN_OVERLAY_ID = 'tampermonkey-blackout-overlay-fullscreen';

    // ---------- Top Bar Overlay ----------

    function createTopBarOverlay() {
        let overlay = document.getElementById(TOPBAR_OVERLAY_ID);
        if (!overlay) {
            overlay = document.createElement('div');
            overlay.id = TOPBAR_OVERLAY_ID;
            Object.assign(overlay.style, {
                position: 'fixed',
                backgroundColor: 'black',
                zIndex: '4',       // higher than top bar's 3
                pointerEvents: 'none',
            });
            document.body.appendChild(overlay);
            console.log('[Tampermonkey] Top bar black overlay created.');
        }
        updateTopBarOverlayPosition();
    }

    function updateTopBarOverlayPosition() {
        const overlay = document.getElementById(TOPBAR_OVERLAY_ID);
        const topBar = document.querySelector('[data-qa="result-view-top"]');
        if (!overlay || !topBar) return;

        const rect = topBar.getBoundingClientRect();

        Object.assign(overlay.style, {
            top: rect.top + 'px',
            left: rect.left + 'px',
            width: rect.width + 'px',
            height: rect.height + 'px',
        });
    }

    function removeTopBarOverlay() {
        const overlay = document.getElementById(TOPBAR_OVERLAY_ID);
        if (overlay) {
            overlay.remove();
            console.log('[Tampermonkey] Top bar black overlay removed.');
        }
    }

    // ---------- Fullscreen Overlay ----------

    function createFullscreenOverlay() {
        let overlay = document.getElementById(FULLSCREEN_OVERLAY_ID);
        if (!overlay) {
            overlay = document.createElement('div');
            overlay.id = FULLSCREEN_OVERLAY_ID;
            Object.assign(overlay.style, {
                position: 'fixed',
                top: '0',
                left: '0',
                width: '100vw',
                height: '100vh',
                backgroundColor: 'black',
                zIndex: '99999',
                pointerEvents: 'none',
            });
            document.body.appendChild(overlay);
            console.log('[Tampermonkey] Fullscreen black overlay created.');
        }
    }

    function removeFullscreenOverlay() {
        const overlay = document.getElementById(FULLSCREEN_OVERLAY_ID);
        if (overlay) {
            overlay.remove();
            console.log('[Tampermonkey] Fullscreen black overlay removed.');
        }
    }

    // ---------- Elements to Remove ----------

    const selectorsToRemove = [
        '.round-result_pointsIndicatorWrapper__7JxD_',
        '.round-result_distanceIndicatorWrapper__qNO6y',
        '.status_section__RVR6u[data-qa="score"]',
        '.game-reactions_root__TSjX_',

    ];

    function removeMatchingElements() {
        selectorsToRemove.forEach(selector => {
            document.querySelectorAll(selector).forEach(el => {
                el.remove();
                console.log(`[Tampermonkey] Removed element matching: ${selector}`);
            });
        });
    }

    // ---------- Main Observer & Logic ----------

    let mutationObserver = null;

    function checkURLAndManageOverlay() {
        const currentURL = window.location.href;
        const resultsUrlPrefix = 'https://www.geoguessr.com/results/';

        const onResultsPage = currentURL.startsWith(resultsUrlPrefix);

        if (onResultsPage) {
            // Show fullscreen overlay, hide top bar overlay
            createFullscreenOverlay();
            removeTopBarOverlay();
        } else {
            // Hide fullscreen overlay, handle top bar overlay per results screen presence
            removeFullscreenOverlay();

            const resultScreen = document.querySelector('.result-layout_root__fRPgH');
            if (resultScreen) {
                createTopBarOverlay();
                updateTopBarOverlayPosition();
            } else {
                removeTopBarOverlay();
            }
        }

        // Always remove unwanted elements
        removeMatchingElements();
    }

    function startObserving() {
        if (mutationObserver) return;

        mutationObserver = new MutationObserver(() => {
            checkURLAndManageOverlay();
        });

        mutationObserver.observe(document.body, {
            childList: true,
            subtree: true
        });
    }

    // Listen for history changes (single page app navigation)
    function listenToUrlChanges() {
        const pushState = history.pushState;
        history.pushState = function () {
            pushState.apply(this, arguments);
            setTimeout(checkURLAndManageOverlay, 50);
        };
        window.addEventListener('popstate', () => {
            setTimeout(checkURLAndManageOverlay, 50);
        });
    }

    // Resize handler for top bar overlay
    window.addEventListener('resize', () => {
        updateTopBarOverlayPosition();
    });

    // Initial
    removeMatchingElements();
    checkURLAndManageOverlay();
    startObserving();
    listenToUrlChanges();

})();