map-making 按键脚本

在制作geoguessr地图时,我们可以为map-making增加按键快捷功能,按1即可加入标签,2可加入二号标签,按空格可保存标签,按r键可以删除标签,按q键可以旋转地图180度

// ==UserScript==
// @name         map-making 按键脚本
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  在制作geoguessr地图时,我们可以为map-making增加按键快捷功能,按1即可加入标签,2可加入二号标签,按空格可保存标签,按r键可以删除标签,按q键可以旋转地图180度
// @author       yukejun
// @match        https://map-making.app/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';


    function simulateMouseEvents(element, eventName, coord) {
        let event = new MouseEvent(eventName, {
            view: window,
            bubbles: true,
            cancelable: true,
            clientX: coord.x,
            clientY: coord.y
        });
        element.dispatchEvent(event);
    }

    function rotateView() {
        // 获取 Google 地图的元素
        let mapElem = document.querySelector('.mapsConsumerUiSceneInternalCoreScene__root');

        if (!mapElem) return;

        let rect = mapElem.getBoundingClientRect();
        let centerX = rect.left + rect.width / 2;
        let centerY = rect.top + rect.height / 2;

        // 模拟鼠标按下事件
        simulateMouseEvents(mapElem, "mousedown", {x: centerX, y: centerY});

        // 模拟拖拽效果
        let steps = 5;
        let distancePerStep = 220;

        function simulateStep(i) {
            if (i < steps) {
                simulateMouseEvents(mapElem, "mousemove", {x: centerX + i * distancePerStep, y: centerY});
                setTimeout(() => simulateStep(i + 1), 10);  // 添加10毫秒的延迟
            } else {
                // 模拟鼠标释放事件
                simulateMouseEvents(mapElem, "mouseup", {x: centerX + steps * distancePerStep, y: centerY});
            }
        }

        simulateStep(0);
    }
    // 提取 -item- 后面的数字
    function extractItemNumber(elementId) {
        const match = /-item-(\d+)$/.exec(elementId);
        return match ? parseInt(match[1], 10) : -1;
    }

    // 尝试点击数字最大的选择器
    function clickLargestItemNumber() {
        // 获取所有匹配 '[id^="downshift-"][id*="-item-"]' 选择器的元素
        let elems = Array.from(document.querySelectorAll('[id^="downshift-"][id*="-item-"]'));
        if (!elems.length) return;

        // 从这些元素中找到 id 后缀数字最大的元素
        elems.sort((a, b) => extractItemNumber(b.id) - extractItemNumber(a.id));
        const largestElem = elems[0];

        // 点击该元素
        largestElem.click();
    }

        // 尝试点击给定选择器
    function tryClicking(selector) {
        let elem = document.querySelector(selector);
        if (elem) {
            elem.click();
        }
    }

        // 定义选择器与按键的映射关系
    const SELECTORS = {
        '1': '[id^="downshift-"][id$="-item-0"]',
        '2': 'button[hidden] > font > font',  // 使用属性选择器,匹配以 "downshift-" 开头并以 "-item-1" 结尾的 id

        '4': '[id^="downshift-"][id$="-item-3"]',
         ' ': 'button.button.button--primary[type="button"]', // 按下空格键
         'e': 'button.tag__button.tag__button--delete[type="button"]', // 按下e键
        'r': 'button.button.button--destructive[type="button"]'  //按下删除
    };


    // 监听键盘事件
    document.addEventListener('keydown', event => {
        // 如果事件的目标是文本输入框或文本区域,则不执行任何操作
        if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
            return;
        }

        // 如果按键对应于 SELECTORS 中的选择器,则尝试点击
        if (SELECTORS[event.key]) {
            tryClicking(SELECTORS[event.key]);
        }

        // 如果按键是 'q',则尝试旋转视图
        if (event.key === 'q') {
            rotateView();
        }

        // 如果按键是 '3',则尝试点击数字最大的选择器
        if (event.key === '3') {
            clickLargestItemNumber();
        }
    });

})();