设置获取配置的APIs
Version vom
Dieses Skript sollte nicht direkt installiert werden. Es handelt sich hier um eine Bibliothek für andere Skripte, welche über folgenden Befehl in den Metadaten eines Skriptes eingebunden wird // @require https://update.greasyfork.org/scripts/476522/1263413/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';
const config = {};
let register;
const inplace = (() => {
const id = "test";
const cap = GM_registerMenuCommand("测试", Function.prototype, {id});
return (cap === id);
})();
(() => {
(() => {
'use strict';
const _APIs = ["GM_getValue", "GM_setValue", "GM_addValueChangeListener", "GM_registerMenuCommand", "GM_unregisterMenuCommand"];
for (const val in _APIs)
if (eval("typeof " + val) === 'undefined') throw new Error("需要" + val + " API权限!!!");
})();
const boolean_prefix = ["❌(已禁用) ", "✅(已启用) "];
const int_family = ['uint', 'int'];
register = ({name, default: def, type = "other", decs: prompts, tips: ipt, input: func = prompt, callback: listener = Function.prototype, init = false, autoClose = true}) => {
let val = GM_getValue(name, def);
config[name] = val;
if (typeof init === 'function') init(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), {id: name, autoClose});
if (true == init) listener(name, val, val, cont);
GM_addValueChangeListener(name, !inplace ? (_1, ov, newval) => {
config[name] = val = newval;
GM_unregisterMenuCommand(cont);
reg();
listener(name, ov, newval, cont);
} : (_1, ov, nv) => (config[name] = val = nv, reg(), listener(name, ov, nv, cont)));
reg();
} else if (type === "other") {
const cont = GM_registerMenuCommand(prompts, () => GM_setValue(name, func()), {id: name, autoClose});
if (true == init) listener(name, val, val, cont);
GM_addValueChangeListener(name, (_1, ov, newval) => (config[name] = newval, listener(name, ov, newval, cont)));
}
console.debug(type, name, "\nRegistered!");
};
})();