UserscriptSettings

none

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/534380/1580503/UserscriptSettings.js

  1. // ==UserScript==
  2. // @name UserscriptSettings
  3. // @description none
  4. // @version 1.0.1
  5. // @grant GM_registerMenuCommand
  6. // @grant GM_getValue
  7. // @grant GM_setValue
  8. // ==/UserScript==
  9.  
  10. const UserscriptSettings = (function () {
  11. const settingsDefinition = {};
  12.  
  13. function get(settingKey) {
  14. const storedSettings = GM_getValue("settings", {});
  15. if (settingKey in storedSettings) return storedSettings[settingKey];
  16. return settingsDefinition[settingKey]?.default;
  17. }
  18.  
  19. function set(settingKey, rawValue) {
  20. const def = settingsDefinition[settingKey];
  21. let value = rawValue;
  22.  
  23. try {
  24.  
  25. if (typeof def.validator === "function" && !def.validator(value))
  26. return alert(`Invalid value for ${def.name}`);
  27.  
  28. if (typeof def.formatter === "function")
  29. value = def.formatter(rawValue);
  30.  
  31. } catch (e) {
  32. console.warn(`Error for setting "${settingKey}":`, e);
  33. return;
  34. }
  35. const storedSettings = GM_getValue("settings", {});
  36. storedSettings[settingKey] = value;
  37. GM_setValue("settings", storedSettings);
  38.  
  39. location.reload();
  40. }
  41.  
  42. function define(settingsObj) {
  43. for (const [key, def] of Object.entries(settingsObj)) {
  44. if (def && def.default !== undefined) {
  45. settingsDefinition[key] = def;
  46. }
  47. }
  48. }
  49.  
  50. function createMenu() {
  51. const storedSettings = GM_getValue("settings", {});
  52. for (const [key, setting] of Object.entries(settingsDefinition)) {
  53. const currentValue = key in storedSettings ? storedSettings[key] : setting.default;
  54.  
  55. const title = typeof setting.default === "boolean" && !setting?.onclick
  56. ? () => `${get(key) ? "✔️" : "❌"} ${setting.name}`
  57. : typeof setting.name === "function" ? setting.name(currentValue) : setting.name;
  58.  
  59. const handler = () => {
  60. if (typeof setting.onclick === "function") {
  61. setting.onclick(currentValue, (newValue) => set(key, newValue));
  62. } else if (typeof setting.default === "boolean") {
  63. set(key, !currentValue);
  64. } else {
  65. const shownValue = setting.display ? setting.display(currentValue) : String(currentValue);
  66. const input = prompt(setting.name, shownValue);
  67. if (input !== null) {
  68. const parsedValue = typeof setting.default === "number" ? Number(input) : input;
  69. set(key, parsedValue);
  70. }
  71. }
  72. };
  73.  
  74. GM_registerMenuCommand(
  75. typeof title === 'function' ? title() : title,
  76. handler
  77. );
  78. }
  79. }
  80. return {
  81. define,
  82. get,
  83. set,
  84. createMenu,
  85. };
  86. })();