Greasy Fork 支持简体中文。

GeoGuessr Mode and Leaderboard Sync

Leaderboard is synced with the selected game mode.

// ==UserScript==
// @name         GeoGuessr Mode and Leaderboard Sync
// @namespace    http://tampermonkey.net/
// @version      5.5
// @description  Leaderboard is synced with the selected game mode.
// @author       Rotski
// @license      MIT
// @match        https://www.geoguessr.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let lastURL = window.location.href;
    let observer;
    let lastSyncedMode = ''; // Keeps track of the last synchronized mode to avoid redundant updates

    function simulateClickOnSwitch(labelText) {
        const targetSwitch = [...document.querySelectorAll('.switch_label__KrnMF')].find(label => label.textContent.trim() === labelText);
        if (targetSwitch) {
            targetSwitch.click();
        } else {
            console.error(`Leaderboard switch for "${labelText}" not found.`);
        }
    }

    function checkAndSyncLeaderboard() {
        const activeModeButton = document.querySelector('.play-setting-button_root__AfG8z.play-setting-button_selected__A0_ik label');
        if (activeModeButton) {
            const activeModeText = activeModeButton.textContent.trim();
            if (activeModeText !== lastSyncedMode) { // Only sync if the mode has changed
                lastSyncedMode = activeModeText;
                simulateClickOnSwitch(activeModeText);
            }
        } else {
            console.error('Active mode button not found.');
        }
    }

    function setupObserver() {
        observer = new MutationObserver(mutations => {
            if (mutations.some(mutation => mutation.addedNodes.length || mutation.attributeName)) {
                checkAndSyncLeaderboard();
            }
        });

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

    function monitorUrlChanges() {
        setInterval(() => {
            const currentURL = window.location.href;
            if (currentURL !== lastURL && currentURL.includes('/maps/')) {
                lastSyncedMode = ''; // Reset to ensure sync occurs
                checkAndSyncLeaderboard();
                lastURL = currentURL;
            }
        }, 5000); // Reduced frequency to lessen impact
    }

    document.addEventListener('click', function(event) {
        if (event.target.closest('.play-setting-button_root__AfG8z.play-setting-button_selected__A0_ik')) {
            setTimeout(checkAndSyncLeaderboard, 100);
        }
    });

    window.addEventListener('load', () => {
        setupObserver();
        checkAndSyncLeaderboard();
        monitorUrlChanges();
    });
})();