none
Fra og med
Dette script bør ikke installeres direkte. Det er et bibliotek, som andre scripts kan inkludere med metadirektivet // @require https://update.greatest.deepsurf.us/scripts/534380/1580029/UserscriptSettings.js
// ==UserScript==
// @name UserscriptSettings
// @description none
// @version 1.0.0
// @grant GM_registerMenuCommand
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
const UserscriptSettings = (function () {
const settingsDefinition = {};
function get(settingKey) {
const storedSettings = GM_getValue("settings", {});
if (settingKey in storedSettings) return storedSettings[settingKey];
return settingsDefinition[settingKey]?.default;
}
function set(settingKey, rawValue) {
const def = settingsDefinition[settingKey];
let value = rawValue;
// Apply formatter if defined
if (def?.formatter && typeof def.formatter === "function") {
try {
value = def.formatter(rawValue);
} catch (e) {
console.warn(`Formatter error for setting "${settingKey}":`, e);
return;
}
}
const storedSettings = GM_getValue("settings", {});
storedSettings[settingKey] = value;
GM_setValue("settings", storedSettings);
}
function define(settingsObj) {
for (const [key, def] of Object.entries(settingsObj)) {
if (def && def.default !== undefined) {
settingsDefinition[key] = def;
}
}
}
function createMenu() {
const storedSettings = GM_getValue("settings", {});
for (const [key, setting] of Object.entries(settingsDefinition)) {
const currentValue = key in storedSettings ? storedSettings[key] : setting.default;
if (typeof setting.default === "boolean") {
const menuTitle = () => `${get(key) ? "✔️" : "❌"} ${setting.name}`;
GM_registerMenuCommand(menuTitle(), () => {
const newValue = !get(key);
set(key, newValue);
location.reload();
});
} else {
GM_registerMenuCommand(setting.name, () => {
// Use display function if available
const rawValue = get(key);
const shownValue = setting.display ? setting.display(rawValue) : String(rawValue);
const input = prompt(setting.name, shownValue);
if (input !== null) {
const parsedValue = typeof setting.default === "number" ? Number(input) : input;
set(key, parsedValue);
}
});
}
}
}
return {
define,
get,
set,
createMenu,
};
})();