UserscriptSettings

none

当前为 2025-04-29 提交的版本,查看 最新版本

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

  1. // ==UserScript==
  2. // @name UserscriptSettings
  3. // @description none
  4. // @version 1.0.0
  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. // Apply formatter if defined
  24. if (def?.formatter && typeof def.formatter === "function") {
  25. try {
  26. value = def.formatter(rawValue);
  27. } catch (e) {
  28. console.warn(`Formatter error for setting "${settingKey}":`, e);
  29. return;
  30. }
  31. }
  32.  
  33. const storedSettings = GM_getValue("settings", {});
  34. storedSettings[settingKey] = value;
  35. GM_setValue("settings", storedSettings);
  36. }
  37.  
  38. function define(settingsObj) {
  39. for (const [key, def] of Object.entries(settingsObj)) {
  40. if (def && def.default !== undefined) {
  41. settingsDefinition[key] = def;
  42. }
  43. }
  44. }
  45.  
  46. function createMenu() {
  47. const storedSettings = GM_getValue("settings", {});
  48. for (const [key, setting] of Object.entries(settingsDefinition)) {
  49. const currentValue = key in storedSettings ? storedSettings[key] : setting.default;
  50.  
  51. if (typeof setting.default === "boolean") {
  52. const menuTitle = () => `${get(key) ? "✔️" : "❌"} ${setting.name}`;
  53. GM_registerMenuCommand(menuTitle(), () => {
  54. const newValue = !get(key);
  55. set(key, newValue);
  56. location.reload();
  57. });
  58. } else {
  59. GM_registerMenuCommand(setting.name, () => {
  60. // Use display function if available
  61. const rawValue = get(key);
  62. const shownValue = setting.display ? setting.display(rawValue) : String(rawValue);
  63. const input = prompt(setting.name, shownValue);
  64. if (input !== null) {
  65. const parsedValue = typeof setting.default === "number" ? Number(input) : input;
  66. set(key, parsedValue);
  67. }
  68. });
  69. }
  70. }
  71. }
  72.  
  73. return {
  74. define,
  75. get,
  76. set,
  77. createMenu,
  78. };
  79. })();