UserscriptSettings

none

目前为 2025-04-29 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/534380/1580029/UserscriptSettings.js

// ==UserScript==
// @name        UserscriptSettings
// @description none
// @version     1.0.0
// @grant       GM_registerMenuCommand
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==

const UserscriptSettings = (function () {
    const settingsDefinition = {};

    function get(settingKey) {
        const storedSettings = GM_getValue("settings", {});
        if (settingKey in storedSettings) return storedSettings[settingKey];
        return settingsDefinition[settingKey]?.default;
    }

    function set(settingKey, rawValue) {
        const def = settingsDefinition[settingKey];
        let value = rawValue;

        // Apply formatter if defined
        if (def?.formatter && typeof def.formatter === "function") {
            try {
                value = def.formatter(rawValue);
            } catch (e) {
                console.warn(`Formatter error for setting "${settingKey}":`, e);
                return;
            }
        }

        const storedSettings = GM_getValue("settings", {});
        storedSettings[settingKey] = value;
        GM_setValue("settings", storedSettings);
    }

    function define(settingsObj) {
        for (const [key, def] of Object.entries(settingsObj)) {
            if (def && def.default !== undefined) {
                settingsDefinition[key] = def;
            }
        }
    }

    function createMenu() {
        const storedSettings = GM_getValue("settings", {});
        for (const [key, setting] of Object.entries(settingsDefinition)) {
            const currentValue = key in storedSettings ? storedSettings[key] : setting.default;

            if (typeof setting.default === "boolean") {
                const menuTitle = () => `${get(key) ? "✔️" : "❌"} ${setting.name}`;
                GM_registerMenuCommand(menuTitle(), () => {
                    const newValue = !get(key);
                    set(key, newValue);
                    location.reload();
                });
            } else {
                GM_registerMenuCommand(setting.name, () => {
                    // Use display function if available
                    const rawValue = get(key);
                    const shownValue = setting.display ? setting.display(rawValue) : String(rawValue);
                    const input = prompt(setting.name, shownValue);
                    if (input !== null) {
                        const parsedValue = typeof setting.default === "number" ? Number(input) : input;
                        set(key, parsedValue);
                    }
                });
            }
        }
    }

    return {
        define,
        get,
        set,
        createMenu,
    };
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址