Greasy Fork 支持简体中文。

Coverage Preference Settings

filter specific coverage on map-making page

// ==UserScript==
// @name         Coverage Preference Settings
// @namespace    https://greasyfork.org/users/1179204
// @version      1.0.5
// @description  filter specific coverage on map-making page
// @author       KaKa
// @match        *://map-making.app/maps/*
// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11
// @license      MIT
// @grant        unsafeWindow
// @icon         https://www.google.com/s2/favicons?domain=geoguessr.com
// ==/UserScript==

(function() {
    let panoId,startTimestamp,endTimestamp,searchState,getState,preference,pIndex=0
    let preferences=['default','Unofficial','Specific Date']

    function showAlert(preference) {
        Swal.fire({
            title: 'Preference',
            text: `The default coverage has been set to "${preference}"`,
            icon: 'info',
            timer: 1500,
            showConfirmButton: false,
        });
        if (preference==='Specific Date'){
            setTimeout(async function(){await getDateRange()},1000)
        }
    }

    async function getDateRange(){
        const dateFormatRegex = /^\d{4}-(0\d|1[0-2]|[1-9])-(0\d|1\d|2\d|3[01]|[1-9])$/;

        await Swal.fire({
            title: 'Enter Date Range',
            icon:'question',
            html:
            '<input id="start-date" class="swal2-input" placeholder="Start Date (yyyy-mm-dd)">' +
            '<input id="end-date" class="swal2-input" placeholder="End Date (yyyy-mm-dd)">',
            focusConfirm: false,
            showCancelButton: false,
            preConfirm: () => {
                const startDate = document.getElementById('start-date').value.trim();
                const endDate = document.getElementById('end-date').value.trim();

                if (!startDate.match(dateFormatRegex) || !endDate.match(dateFormatRegex)) {
                    Swal.showValidationMessage('Please enter valid date range!')
                    return false;
                }

                if (startDate&&endDate) {
                    startTimestamp = Date.parse(startDate) / 1000;
                    endTimestamp = Date.parse(endDate) / 1000;
                }
            }
        });

    }


    const THE_WINDOW = unsafeWindow || window;

    THE_WINDOW.fetch = function(originalFetch) {
        return async function (...args) {
            const url = args[0].toString();
            if (pIndex===0){
                return originalFetch.apply(THE_WINDOW, args);
            }
            if (url.includes('SingleImageSearch') || url.includes('GetMetadata')) {
                try {
                    let requestData = JSON.parse(args[1].body);

                    if (url.includes('SingleImageSearch')&&!searchState) {

                        if(pIndex===1){
                            requestData[1][1]=30
                            requestData[2][10][0][0][0]=3
                        }

                        else if (pIndex===2){
                            requestData[1][1]=15
                            requestData[2][0] = [null, null, false, null, null, null, null, null, null, null, [startTimestamp, endTimestamp]];
                            requestData[3] = [[2, 6]]
                        }

                        args[1].body = JSON.stringify(requestData);
                    }

                    if (url.includes('GetMetadata')) {
                        requestData[2][0][0][1] = panoId
                        searchState=null
                        args[1].body = JSON.stringify(requestData);
                    }

                    const response = await originalFetch.apply(THE_WINDOW, args);

                    if (!response.ok) {
                        throw new Error(`HTTP error! Status: ${response.status}`);
                    }

                    const responseData = await response.json();

                    if (url.includes('SingleImageSearch')){
                        if (responseData&&!responseData[0].includes('generic')){
                            if(!searchState){
                                panoId=responseData[1][1][1]
                            }}
                        else{panoId=null}
                    }

                    return originalFetch.apply(THE_WINDOW, args);
                } catch (error) {
                    console.error('Error fetching data:', error);
                    throw error;
                }
            } else {
                return originalFetch.apply(THE_WINDOW, args);
            }
        };
    }(THE_WINDOW.fetch);

    let onKeyDown = async (e) => {
        if (e.key === 'q' || e.key === 'Q') {
            e.stopImmediatePropagation();
            if (pIndex>=3)pIndex=0
            else{pIndex+=1}
            preference=preferences[pIndex]
            showAlert(preference)
        };
    }
    document.addEventListener("keydown", onKeyDown);
})();