Config_Manager

设置获取配置的APIs

目前為 2023-10-08 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/476522/1261650/Config_Manager.js

// ==UserScript==
// @name        Config_Manager
// @namespace   Violentmonkey Scripts
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_addValueChangeListener
// @grant       GM_registerMenuCommand
// @grant       GM_unregisterMenuCommand
// @author      axototl
// @license     AGPL-3.0-or-later
// @description 设置获取配置的APIs
// ==/UserScript==
'use strict';

let config = {};
let register;

(() => {
    // const _APIs = ["GM_getValue", "GM_setValue", "GM_addValueChangeListener", "GM_registerMenuCommand", "GM_unregisterMenuCommand"];
    // for (const val in _APIs)
    //     if (!(val in globalThis)) throw new Error("需要API权限!!!");
    const boolean_prefix = ["❌(已禁用) ", "✅(已启用) "];
    const int_family = ['uint', 'int'];
    register = ({name, default: def, type = "other", prompts, tips: ipt, input: func = prompt, callback: listener = Function.prototype}) => {
        let val = GM_getValue(name, def);
        config[name] = val;
        if (int_family.includes(type)) {
            const judge = (type === 'uint') ? (s => (s|0) < 0) : (()=>false);
            if (func === prompt) {
                func = () => {
                    let p;
                    do {p = prompt(ipt);} while(isNaN(p) || judge(p));
                    return p;
                };
            }
            type = 'other';
        }
        if (type === 'bool') {
            let cont;
            const reg = () => cont = GM_registerMenuCommand(boolean_prefix[val | 0] + prompts, () => GM_setValue(name, !val));
            GM_addValueChangeListener(name, (_1, ov, newval) => {
                config[name] = val = newval;
                GM_unregisterMenuCommand(cont);
                reg();
                listener(name, ov, newval, cont);
            });
            reg();
        } else if (type === "other") {
            const cont = GM_registerMenuCommand(prompts, () => GM_setValue(name, func()));
            GM_addValueChangeListener(name, (_1, ov, newval) => (config[name] = newval, listener(name, ov, newval, cont)));
        }
        console.debug(type, name, "\nRegistered!");
    };
})();