您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Useful library for running a basic settings wizard.
当前为
此脚本不应直接安装,它是供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/405840/819509/Monkey%20Wizard.js
// ==UserScript== // @name Monkey Wizard // @namespace https://rafaelgssa.gitlab.io/monkey-scripts // @version 1.0.2 // @author rafaelgssa // @description Useful library for running a basic settings wizard. // @match *://*/* // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // @require https://gf.qytechs.cn/scripts/405831-monkey-storage/code/Monkey%20Storage.js // @require https://gf.qytechs.cn/scripts/405813-monkey-utils/code/Monkey%20Utils.js // @grant GM.setValue // @grant GM.getValue // @grant GM.deleteValue // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // ==/UserScript== /* global MonkeyStorage, MonkeyUtils */ /** * @typedef {Object} WizardSchema * @property {'string' | 'number' | 'multi'} type * @property {string} id * @property {string} message * @property {unknown} defaultValue * @property {number} [min] Only available for 'number' type. * @property {number} [max] Only available for 'number' type. * @property {WizardChoiceSchema[]} [choices] Only available for 'multi' type. * @typedef {Object} WizardChoiceSchema * @property {string} id * @property {string} template * @property {unknown} value * */ // eslint-disable-next-line const MonkeyWizard = (() => { let _id = ''; let _name = ''; /** @type {WizardSchema[]} */ let _schemas = []; /** * Initializes the wizard. * @param {string} id The ID to use for the wizard URL. * @param {string} name The name to show in dialogs. * @param {WizardSchema[]} schemas The schemas for the settings. * @returns {Promise<void>} */ const init = (id, name, schemas) => { _id = id; _name = name; _schemas = schemas; return run(); }; /** * Runs the wizard. * @returns {Promise<void>} */ const run = async () => { if (window.location.search !== `?${_id}=wizard`) { return; } const mainTitle = `${_name} Wizard`; for (const schema of _schemas) { const value = _readValue(mainTitle, schema); MonkeyStorage.setSetting(schema.id, value); } await MonkeyStorage.saveSettings(); window.alert(`${mainTitle}\n\nDone!`); }; /** * Reads a value in the wizard. * @param {string} mainTitle * @param {WizardSchema} schema * @returns {unknown} */ const _readValue = (mainTitle, schema) => { const title = `${mainTitle}\n\n${schema.message}`; switch (schema.type) { case 'string': return _readStringValue(title); case 'number': return _readNumberValue(title, schema); case 'multi': return _readMultiValue(title, schema); // no default } }; /** * @param {string} title * @returns {string} */ const _readStringValue = (title) => { const inputValue = window.prompt(`${title} Enter the string.`); return MonkeyUtils.isSet(inputValue) ? inputValue : ''; }; /** * @param {string} title * @param {WizardSchema} schema * @returns {number} */ const _readNumberValue = (title, schema) => { let value = 0.0; do { const inputValue = window.prompt( `${title} Enter the number from ${schema.min} to ${schema.max}.` ); try { value = MonkeyUtils.isSet(inputValue) ? parseFloat(inputValue) : 0.0; if (Number.isNaN(value)) { throw new Error('Invalid number'); } } catch (err) { // Value is not a number, just ignore. value = 0.0; } } while (value < schema.min || value > schema.max); return value; }; /** * @param {string} title * @param {WizardSchema} schema * @returns {unknown} */ const _readMultiValue = (title, schema) => { let choice; const choiceList = schema.choices .map((schemaChoice) => schemaChoice.template.replace(/%/, schemaChoice.id)) .join(' or '); do { const inputValue = window.prompt(`${title} Type ${choiceList}`); choice = schema.choices.find((schemaChoice) => schemaChoice.id === inputValue); } while (!MonkeyUtils.isSet(choice)); return choice.value; }; return { init, run, }; })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址