From f5e455e041594f5b465cd8dd51d682eff0cca752 Mon Sep 17 00:00:00 2001 From: Elvyra <88881326+EepyElvyra@users.noreply.github.com> Date: Mon, 13 Jan 2025 04:33:22 +0100 Subject: [PATCH] implement a better way to convert string to array --- src/api/Settings.ts | 13 ------------- src/plugins/consoleJanitor/index.ts | 5 ++--- src/plugins/index.ts | 18 ++++++++++++++++-- src/plugins/invisibleChat.desktop/index.tsx | 5 ++--- src/plugins/loadingQuotes/index.ts | 4 ++-- src/plugins/messageLogger/index.tsx | 5 +---- src/utils/types.ts | 5 +++++ 7 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/api/Settings.ts b/src/api/Settings.ts index 1c3b634ae..1be12a01f 100644 --- a/src/api/Settings.ts +++ b/src/api/Settings.ts @@ -224,19 +224,6 @@ export function migratePluginSettings(name: string, ...oldNames: string[]) { } } -export function migrateSettingsToArrays(pluginName: string, settings: string[], stringSeparator: string | ((input: string) => string[]) = ",") { - const { plugins } = SettingsStore.plain; - if (plugins[pluginName] === undefined) - return logger.error(`Plugin '${pluginName}' does not exist and cannot be migrated! Did you spell it correctly?`); - for (const setting of settings) { - if (typeof plugins[pluginName][setting] !== "string") continue; - logger.info(`Migrating setting ${setting} from ${pluginName} to list`); - if (plugins[pluginName][setting] === "") plugins[pluginName][setting] = []; - else if (typeof stringSeparator === "string") plugins[pluginName][setting] = plugins[pluginName][setting].split(stringSeparator); - else plugins[pluginName][setting] = stringSeparator(plugins[pluginName][setting]); - } -} - export function definePluginSettings< Def extends SettingsDefinition, Checks extends SettingsChecks, diff --git a/src/plugins/consoleJanitor/index.ts b/src/plugins/consoleJanitor/index.ts index e7bbecedd..d2b6c3573 100644 --- a/src/plugins/consoleJanitor/index.ts +++ b/src/plugins/consoleJanitor/index.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: GPL-3.0-or-later */ -import { definePluginSettings, migrateSettingsToArrays } from "@api/Settings"; +import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType, StartAt } from "@utils/types"; @@ -24,8 +24,6 @@ const NoopLogger = { const logAllow = new Set(); -migrateSettingsToArrays("ConsoleJanitor", ["whitelistedLoggers"], s => s.split(";").map(x => x.trim())); - const settings = definePluginSettings({ disableLoggers: { type: OptionType.BOOLEAN, @@ -43,6 +41,7 @@ const settings = definePluginSettings({ type: OptionType.ARRAY, description: "List of loggers to allow even if others are hidden", default: ["GatewaySocket", "Routing/Utils"], + oldStringSeparator: s => s.split(";").map(x => x.trim()), onChange(newVal: string[]) { logAllow.clear(); newVal.forEach(logAllow.add.bind(logAllow)); diff --git a/src/plugins/index.ts b/src/plugins/index.ts index 129e42a0d..9ba11caa3 100644 --- a/src/plugins/index.ts +++ b/src/plugins/index.ts @@ -21,7 +21,7 @@ import { addContextMenuPatch, removeContextMenuPatch } from "@api/ContextMenu"; import { Settings } from "@api/Settings"; import { Logger } from "@utils/Logger"; import { canonicalizeFind } from "@utils/patches"; -import { Patch, Plugin, ReporterTestable, StartAt } from "@utils/types"; +import { OptionType, Patch, Plugin, ReporterTestable, StartAt } from "@utils/types"; import { FluxDispatcher } from "@webpack/common"; import { FluxEvents } from "@webpack/types"; @@ -215,7 +215,21 @@ export function subscribeAllPluginsFluxEvents(fluxDispatcher: typeof FluxDispatc } export const startPlugin = traceFunction("startPlugin", function startPlugin(p: Plugin) { - const { name, commands, contextMenus } = p; + const { name, commands, contextMenus, settings } = p; + + if (settings != null) + for (const setting of Object.keys(settings.def)) { + const { type } = settings.def[setting]; + if (type === OptionType.ARRAY || type === OptionType.USERS || type === OptionType.GUILDS || type === OptionType.CHANNELS) { + if (typeof settings.store[setting] === "string") { + logger.info(`Converting string values of setting ${setting} of plugin ${name} to array`); + + const sep = settings.def[setting].oldStringSeparator ?? ","; + if (typeof sep === "string") settings.store[setting] = settings.store[setting].split(sep); + else settings.store[setting] = sep(settings.store[setting]); + } + } + } if (p.start) { logger.info("Starting plugin", name); diff --git a/src/plugins/invisibleChat.desktop/index.tsx b/src/plugins/invisibleChat.desktop/index.tsx index e799ad4f2..c88a1c089 100644 --- a/src/plugins/invisibleChat.desktop/index.tsx +++ b/src/plugins/invisibleChat.desktop/index.tsx @@ -19,7 +19,7 @@ import { addChatBarButton, ChatBarButton } from "@api/ChatButtons"; import { addButton, removeButton } from "@api/MessagePopover"; import { updateMessage } from "@api/MessageUpdater"; -import { definePluginSettings, migrateSettingsToArrays } from "@api/Settings"; +import { definePluginSettings } from "@api/Settings"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; import { getStegCloak } from "@utils/dependencies"; @@ -93,13 +93,12 @@ const ChatBarIcon: ChatBarButton = ({ isMainChat }) => { }; -migrateSettingsToArrays("InvisibleChat", ["savedPasswords"], s => s.split(",").map(s => s.trim())); - const settings = definePluginSettings({ savedPasswords: { type: OptionType.ARRAY, default: ["password", "Password"], description: "Saved Passwords", + oldStringSeparator: s => s.split(",").map(s => s.trim()), } }); diff --git a/src/plugins/loadingQuotes/index.ts b/src/plugins/loadingQuotes/index.ts index 395f1d06e..7f7a25087 100644 --- a/src/plugins/loadingQuotes/index.ts +++ b/src/plugins/loadingQuotes/index.ts @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { definePluginSettings, migrateSettingsToArrays } from "@api/Settings"; +import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { OptionType } from "@utils/types"; @@ -25,7 +25,6 @@ import presetQuotesText from "file://quotes.txt"; const presetQuotes = presetQuotesText.split("\n").map(quote => /^\s*[^#\s]/.test(quote) && quote.trim()).filter(Boolean) as string[]; const noQuotesQuote = "Did you really disable all loading quotes? What a buffoon you are..."; -migrateSettingsToArrays("LoadingQuotes", ["additionalQuotes"], "|"); const settings = definePluginSettings({ replaceEvents: { @@ -46,6 +45,7 @@ const settings = definePluginSettings({ additionalQuotes: { description: "Additional custom quotes to possibly appear", type: OptionType.ARRAY, + oldStringSeparator: "|", }, }); diff --git a/src/plugins/messageLogger/index.tsx b/src/plugins/messageLogger/index.tsx index cd57294e7..c9a19e092 100644 --- a/src/plugins/messageLogger/index.tsx +++ b/src/plugins/messageLogger/index.tsx @@ -20,7 +20,7 @@ import "./messageLogger.css"; import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; import { updateMessage } from "@api/MessageUpdater"; -import { definePluginSettings, migrateSettingsToArrays, Settings } from "@api/Settings"; +import { definePluginSettings, Settings } from "@api/Settings"; import { disableStyle, enableStyle } from "@api/Styles"; import ErrorBoundary from "@components/ErrorBoundary"; import { Devs } from "@utils/constants"; @@ -36,9 +36,6 @@ import overlayStyle from "./deleteStyleOverlay.css?managed"; import textStyle from "./deleteStyleText.css?managed"; import { openHistoryModal } from "./HistoryModal"; -migrateSettingsToArrays("MessageLogger", ["ignoreChannels", "ignoreGuilds", "ignoreUsers"]); - - const settings = definePluginSettings({ deleteStyle: { type: OptionType.SELECT, diff --git a/src/utils/types.ts b/src/utils/types.ts index 8b35e7321..d304f6aa1 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -279,6 +279,11 @@ export interface PluginSettingArrayDef { popoutText?: string; hidePopout?: boolean; default?: any[]; + /** + * If the setting used to be a string with a custom delimiter, you can specify the delimiter or a function to split the string + * @default "," + */ + oldStringSeparator?: string | ((value: string) => string[]); onChange?(newValue: any[]): void; }