GI AppSample Map - More Markable Markers

Gets the markers_all json file and change user defined markers to be markable.

当前为 2025-01-03 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         GI AppSample Map - More Markable Markers
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Gets the markers_all json file and change user defined markers to be markable.
// @author       2KRN4U
// @match        https://genshin-impact-map.appsample.com/*
// @icon         https://genshin-impact-map.appsample.com/favicon.ico
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    // List of markers to change
    const list = "o596, o601, o602, o639, o641, o647, o128"; // EDIT THIS LINE ONLY, seperate by comma. Example "o596, o317";

    const targetFilenameStart = "markers_all"; // Filename of the markers file

    const keys = list.split(",").map(key => key.trim()); // Convert list to an array of trimmed keys

    const allowMarkComment = 5; // Value to allow marking and commenting

    // Save references to the original XHR methods
    const originalOpen = XMLHttpRequest.prototype.open;
    const originalSend = XMLHttpRequest.prototype.send;

    // Override the open method
    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
        this._filename = url.split('/').pop(); // Extract the filename from the URL
        this._url = url; // Store the URL for later use
        originalOpen.apply(this, arguments); // Call the original open method
    };

    // Override the send method
    XMLHttpRequest.prototype.send = function (body) {
        this.addEventListener('readystatechange', function () {
            // Only process requests if the filename matches the target prefix
            if (
                this.readyState === 4 &&
                this.status === 200 &&
                this._filename.startsWith(targetFilenameStart) // Check if filename starts with the target string
            ) {
                try {
                    let modifiedResponseText = this.responseText;

                    // Apply replacements for each key in the list
                    keys.forEach(key => {
                        const searchPattern = new RegExp(`("${key}",\\d+,)(\\d+)(,)`, 'g'); // Search pattern for markers
                        modifiedResponseText = modifiedResponseText.replace(
                            searchPattern,
                            (_, prefix, lastDigits, suffix) => `${prefix}${allowMarkComment}${suffix}`
                        ); // Replace to allow marking and commenting
                    });

                    // Overwrite the responseText property with the modified content
                    Object.defineProperty(this, 'responseText', {
                        value: modifiedResponseText,
                        configurable: true,
                    });

                    // Optional: Overwrite response (useful if response is accessed differently)
                    Object.defineProperty(this, 'response', {
                        value: modifiedResponseText,
                        configurable: true,
                    });
                } catch (e) {
                    console.error('Error modifying JSON response:', e);
                }
            }
        });

        // Call the original send method
        originalSend.apply(this, arguments);
    };

    // Wait for the DOM to fully load
    window.addEventListener('load', function () {
        // Function to modify the title
        const modifyTitle = (originalTitle, dataTestId) => {
            // Trim the first 4 characters of data-testid
            const trimmedData = dataTestId ? dataTestId.slice(4) : 'Unknown';
            // Combine the original title with the trimmed data-testid
            return `${originalTitle}: ${trimmedData}`;
        };

        // Select all buttons with the class "MuiButtonBase-root"
        const buttons = document.querySelectorAll('.MuiButtonBase-root');

        // Iterate over each button
        buttons.forEach(button => {
            const originalTitle = button.getAttribute('title');
            const dataTestId = button.getAttribute('data-testid');

            // Only proceed if both title and data-testid exist
            if (originalTitle && dataTestId) {
                const newTitle = modifyTitle(originalTitle, dataTestId);
                button.setAttribute('title', newTitle);
            }
        });
    });
})();