// ==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';
(() => {
'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 config = {};
let register;
const inplace = (() => {
const id = "test";
const cap = GM_registerMenuCommand("测试", Function.prototype, {id});
GM_unregisterMenuCommand(cap);
return (cap === id);
})();
(() => {
const boolean_prefix = ["❌(已禁用) ", "✅(已启用) "];
const int_family = ['uint', 'int'];
const tt = () => true;
register = ({name, default: def, type = "other", desc: prompts, tips: ipt, input: func = prompt, callback: listener = Function.prototype, init = false, autoClose = true, judge}) => {
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 change = (() => {
if (typeof judge !== 'function')
return () => GM_setValue(name, !val);
else return () => (judge(name, val) && GM_setValue(name, val));
})();
const reg = () => cont = GM_registerMenuCommand(boolean_prefix[val | 0] + prompts, change, {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 change = (() => {
if (typeof judge !== 'function') return () => GM_setValue(name, func());
return () => (judge(name, val) && GM_setValue(name, func()));
})();
const cont = GM_registerMenuCommand(prompts, change, {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!");
};
})();