您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
ConfigManager: Manage(Get, set and update) your config with config path simply with a ruleset!
当前为
此脚本不应直接安装,它是供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.cn-greasyfork.org/scripts/449583/1082908/ConfigManager.js
- /* eslint-disable no-multi-spaces */
- // ==UserScript==
- // @name ConfigManager
- // @namespace ConfigManager
- // @version 0.3
- // @description ConfigManager: Manage(Get, set and update) your config with config path simply with a ruleset!
- // @author PY-DNG
- // @license GPL-v3
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_listValues
- // @grant GM_deleteValue
- // ==/UserScript==
- function ConfigManager(Ruleset) {
- const CM = this;
- const ConfigBase = new Proxy({}, {
- get: function(target, property, reciever) {
- return GM_getValue(property);
- },
- set: function(target, property, value, reciever) {
- return (GM_setValue(property, value), true);
- },
- has: function(target, property) {
- return GM_listValues().includes(property);
- }
- });
- CM.getConfig = getConfig;
- CM.setConfig = setConfig;
- CM.updateConfig = updateConfig;
- CM.updateAllConfigs = updateAllConfigs;
- CM.readPath = readPath;
- CM.pathExists = pathExists;
- CM.mergePath = mergePath;
- CM.getBaseName = getBaseName;
- CM.ConfigBase = ConfigBase;
- Object.freeze(CM);
- // Get config value from path (e.g. 'Users/username/' or ['Users', 12345])
- function getConfig(path) {
- // Split path
- path = arrPath(path);
- // Init config if need
- if (!GM_listValues().includes(path[0])) {
- ConfigBase[path[0]] = Ruleset.defaultValues[path[0]];
- }
- // Get config by path
- const target = path.pop();
- let config = readPath(ConfigBase, path);
- return config[target];
- }
- // Set config value to path
- function setConfig(path, value) {
- path = arrPath(path);
- const target = path.pop();
- if (path.length > 0) {
- const basekey = path.shift();
- const baseobj = ConfigBase[basekey];
- let config = readPath(baseobj, path);
- if (isObject(config)) {
- config[target] = value;
- ConfigBase[basekey] = baseobj;
- } else {
- Err('Attempt to set a property to a non-object value')
- }
- } else {
- ConfigBase[target] = value;
- }
- }
- function updateConfig(basename) {
- let updated = false;
- // Get updaters and config
- const updaters = Ruleset.updaters.hasOwnProperty(basename) ? Ruleset.updaters[basename] : [];
- const verKey = Ruleset['version-key'];
- const config = getConfig(basename);
- // Valid check
- if (Ruleset.ignores.includes(basename)) {
- return false;
- }
- if (!updaters.length) {
- return save();
- }
- // Update
- for (let i = (config[verKey] || 0); i < updaters.length; i++) {
- const updater = updaters[i];
- config = updater(config);
- updated = true;
- }
- // Set version and save
- return save();
- function save() {
- config[verKey] = updaters.length;
- setConfig(basename, config);
- return updated;
- }
- }
- function updateAllConfigs() {
- const keys = GM_listValues();
- keys.forEach((key) => (updateConfig(key)));
- }
- function readPath(obj, path) {
- path = arrPath(path);
- while (path.length > 0) {
- const key = path.shift();
- if (isObject(obj) && hasProp(obj, key)) {
- obj = obj[key]
- } else {
- Err('Attempt to read a property that is not exist (reading "' + key + '" in path "' + path + '")')
- }
- }
- return obj;
- }
- function pathExists(obj, path) {
- path = arrPath(path);
- while (path.length > 0) {
- const key = path.shift();
- if (isObject(obj) && hasProp(obj, key)) {
- obj = obj[key];
- } else {
- return false;
- }
- }
- return true;
- }
- function mergePath() {
- return Array.from(arguments).join('/');
- }
- function getBaseName(path) {
- return arrPath(path)[0];
- }
- function getPathWithoutBase(path) {
- const p = arrPath(path);
- p.shift();
- return p;
- }
- function arrPath(strpath) {
- return Array.isArray(strpath) ? [...strpath] : strpath.split('/');
- }
- function isObject(obj) {
- return typeof obj === 'object' && obj !== null;
- }
- function hasProp(obj, prop) {
- return obj === ConfigBase ? prop in obj : obj.hasOwnProperty(prop);
- }
- // type: [Error, TypeError]
- function Err(msg, type=0) {
- throw new [Error, TypeError][type](msg);
- }
- }