implement a better way to convert string to array

This commit is contained in:
Elvyra 2025-01-13 04:33:22 +01:00
parent 6166a8ef17
commit f5e455e041
7 changed files with 28 additions and 27 deletions

View file

@ -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<Def>,

View file

@ -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));

View file

@ -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);

View file

@ -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()),
}
});

View file

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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: "|",
},
});

View file

@ -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,

View file

@ -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;
}