- '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 = {};
-
- const inplace = (() => {
- const id = "test";
- const cap = GM_registerMenuCommand("测试", Function.prototype, {id});
- GM_unregisterMenuCommand(cap);
- return (cap === id);
- })();
-
- const register = (() => {
- const boolean_prefix = ["❌(已禁用) ", "✅(已启用) "];
- const int_family = ['uint', 'int'];
- return ({name, default: def, type = "other", desc: prompts, tips: ipt, input: func = prompt, callback: listener = Function.prototype, init = false, autoClose = true, judge: _jud}) => {
- // let val = GM_getValue(name, def);
- // config[name] = val;
- const judge = (() => {
- if (typeof _jud === 'function') return _jud;
- return () => true;
- })();
- Object.defineProperty(config, name, {
- get: () => GM_getValue(name, def),
- set: val => GM_setValue(name, val)
- });
- if (typeof init === 'function') init(name, config[name]);
- 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 | 0;
- };
- }
- type = 'other';
- }
- const cfg = {id: name, autoClose};
- if (type === 'bool') {
- let cont;
- const reg = () => cont = GM_registerMenuCommand(boolean_prefix[config[name] | 0] + prompts, () => {
- const newval = !config[name];
- if (judge(name, newval))
- config[name] = newval;
- }, cfg);
- if (true == init) listener(name, config[name], config[name], cont);
- const stn = (() => {
- const re_reg = inplace ? reg : () => (GM_unregisterMenuCommand(cont), reg());
- return (_1, ov, nv) => (reg(), listener(name, ov, nv, cont));
- })();
- GM_addValueChangeListener(name, stn);
- reg();
- } else if (type === "other") {
- if (func === prompt) func = () => prompt(ipt);
- const cont = GM_registerMenuCommand(prompts, () => {
- const inp = func();
- if (judge(name, inp))
- GM_setValue(name, inp);
- }, cfg);
- if (true == init) listener(name, config[name], config[name], cont);
- GM_addValueChangeListener(name, (_1, ov, nv) => listener(name, ov, nv, cont));
- }
- console.debug(type, name, "\nRegistered!");
- };
- })();