diff --git a/src/api/SettingsStores.ts b/src/api/SettingsStores.ts
deleted file mode 100644
index 18139e4e..00000000
--- a/src/api/SettingsStores.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Vencord, a modification for Discord's desktop app
- * Copyright (c) 2023 Vendicated and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
-*/
-
-import { proxyLazy } from "@utils/lazy";
-import { Logger } from "@utils/Logger";
-import { findModuleId, proxyLazyWebpack, wreq } from "@webpack";
-
-import { Settings } from "./Settings";
-
-interface Setting {
- /**
- * Get the setting value
- */
- getSetting(): T;
- /**
- * Update the setting value
- * @param value The new value
- */
- updateSetting(value: T | ((old: T) => T)): Promise;
- /**
- * React hook for automatically updating components when the setting is updated
- */
- useSetting(): T;
- settingsStoreApiGroup: string;
- settingsStoreApiName: string;
-}
-
-export const SettingsStores: Array> | undefined = proxyLazyWebpack(() => {
- const modId = findModuleId('"textAndImages","renderSpoilers"') as any;
- if (modId == null) return new Logger("SettingsStoreAPI").error("Didn't find stores module.");
-
- const mod = wreq(modId);
- if (mod == null) return;
-
- return Object.values(mod).filter((s: any) => s?.settingsStoreApiGroup) as any;
-});
-
-/**
- * Get the store for a setting
- * @param group The setting group
- * @param name The name of the setting
- */
-export function getSettingStore(group: string, name: string): Setting | undefined {
- if (!Settings.plugins.SettingsStoreAPI.enabled) throw new Error("Cannot use SettingsStoreAPI without setting as dependency.");
-
- return SettingsStores?.find(s => s?.settingsStoreApiGroup === group && s?.settingsStoreApiName === name);
-}
-
-/**
- * getSettingStore but lazy
- */
-export function getSettingStoreLazy(group: string, name: string) {
- return proxyLazy(() => getSettingStore(group, name));
-}
diff --git a/src/api/UserSettings.ts b/src/api/UserSettings.ts
new file mode 100644
index 00000000..4de92a81
--- /dev/null
+++ b/src/api/UserSettings.ts
@@ -0,0 +1,81 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2023 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+import { proxyLazy } from "@utils/lazy";
+import { Logger } from "@utils/Logger";
+import { findModuleId, proxyLazyWebpack, wreq } from "@webpack";
+
+interface UserSettingDefinition {
+ /**
+ * Get the setting value
+ */
+ getSetting(): T;
+ /**
+ * Update the setting value
+ * @param value The new value
+ */
+ updateSetting(value: T): Promise;
+ /**
+ * Update the setting value
+ * @param value A callback that accepts the old value as the first argument, and returns the new value
+ */
+ updateSetting(value: (old: T) => T): Promise;
+ /**
+ * Stateful React hook for this setting value
+ */
+ useSetting(): T;
+ userSettingsAPIGroup: string;
+ userSettingsAPIName: string;
+}
+
+export const UserSettings: Record> | undefined = proxyLazyWebpack(() => {
+ const modId = findModuleId('"textAndImages","renderSpoilers"');
+ if (modId == null) return new Logger("UserSettingsAPI ").error("Didn't find settings module.");
+
+ return wreq(modId as any);
+});
+
+/**
+ * Get the setting with the given setting group and name.
+ *
+ * @param group The setting group
+ * @param name The name of the setting
+ */
+export function getUserSetting(group: string, name: string): UserSettingDefinition | undefined {
+ if (!Vencord.Plugins.isPluginEnabled("UserSettingsAPI")) throw new Error("Cannot use UserSettingsAPI without setting as dependency.");
+
+ for (const key in UserSettings) {
+ const userSetting = UserSettings[key];
+
+ if (userSetting.userSettingsAPIGroup === group && userSetting.userSettingsAPIName === name) {
+ return userSetting;
+ }
+ }
+}
+
+/**
+ * {@link getUserSettingDefinition}, lazy.
+ *
+ * Get the setting with the given setting group and name.
+ *
+ * @param group The setting group
+ * @param name The name of the setting
+ */
+export function getUserSettingLazy(group: string, name: string) {
+ return proxyLazy(() => getUserSetting(group, name));
+}
diff --git a/src/api/index.ts b/src/api/index.ts
index 737e06d6..d4d7b461 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -31,8 +31,8 @@ import * as $Notices from "./Notices";
import * as $Notifications from "./Notifications";
import * as $ServerList from "./ServerList";
import * as $Settings from "./Settings";
-import * as $SettingsStores from "./SettingsStores";
import * as $Styles from "./Styles";
+import * as $UserSettings from "./UserSettings";
/**
* An API allowing you to listen to Message Clicks or run your own logic
@@ -118,4 +118,7 @@ export const ChatButtons = $ChatButtons;
*/
export const MessageUpdater = $MessageUpdater;
-export const SettingsStores = $SettingsStores;
+/**
+ * An API allowing you to get an user setting
+ */
+export const UserSettings = $UserSettings;
diff --git a/src/plugins/_api/settingsStores.ts b/src/plugins/_api/userSettings.ts
similarity index 55%
rename from src/plugins/_api/settingsStores.ts
rename to src/plugins/_api/userSettings.ts
index a888532e..3a00bc11 100644
--- a/src/plugins/_api/settingsStores.ts
+++ b/src/plugins/_api/userSettings.ts
@@ -20,23 +20,30 @@ import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
export default definePlugin({
- name: "SettingsStoreAPI",
- description: "Patches Discord's SettingsStores to expose their group and name",
+ name: "UserSettingsAPI",
+ description: "Patches Discord's UserSettings to expose their group and name.",
authors: [Devs.Nuckyz],
patches: [
{
find: ",updateSetting:",
replacement: [
+ // Main setting definition
{
- match: /(?<=INFREQUENT_USER_ACTION.{0,20}),useSetting:/,
- replace: ",settingsStoreApiGroup:arguments[0],settingsStoreApiName:arguments[1]$&"
+ match: /(?<=INFREQUENT_USER_ACTION.{0,20},)useSetting:/,
+ replace: "userSettingsAPIGroup:arguments[0],userSettingsAPIName:arguments[1],$&"
},
- // some wrapper. just make it copy the group and name
+ // Selective wrapper
{
- match: /updateSetting:.{0,20}shouldSync/,
- replace: "settingsStoreApiGroup:arguments[0].settingsStoreApiGroup,settingsStoreApiName:arguments[0].settingsStoreApiName,$&"
+ match: /updateSetting:.{0,100}SELECTIVELY_SYNCED_USER_SETTINGS_UPDATE/,
+ replace: "userSettingsAPIGroup:arguments[0].userSettingsAPIGroup,userSettingsAPIName:arguments[0].userSettingsAPIName,$&"
+ },
+ // Override wrapper
+ {
+ match: /updateSetting:.{0,60}USER_SETTINGS_OVERRIDE_CLEAR/,
+ replace: "userSettingsAPIGroup:arguments[0].userSettingsAPIGroup,userSettingsAPIName:arguments[0].userSettingsAPIName,$&"
}
+
]
}
]
diff --git a/src/plugins/betterRoleContext/index.tsx b/src/plugins/betterRoleContext/index.tsx
index d69e188c..bf4cf0f3 100644
--- a/src/plugins/betterRoleContext/index.tsx
+++ b/src/plugins/betterRoleContext/index.tsx
@@ -5,7 +5,7 @@
*/
import { definePluginSettings } from "@api/Settings";
-import { getSettingStoreLazy } from "@api/SettingsStores";
+import { getUserSettingLazy } from "@api/UserSettings";
import { ImageIcon } from "@components/Icons";
import { Devs } from "@utils/constants";
import { getCurrentGuild, openImageModal } from "@utils/discord";
@@ -15,7 +15,7 @@ import { Clipboard, GuildStore, Menu, PermissionStore } from "@webpack/common";
const GuildSettingsActions = findByPropsLazy("open", "selectRole", "updateGuild");
-const DeveloperMode = getSettingStoreLazy("appearance", "developerMode")!;
+const DeveloperMode = getUserSettingLazy("appearance", "developerMode")!;
function PencilIcon() {
return (
@@ -65,7 +65,7 @@ export default definePlugin({
name: "BetterRoleContext",
description: "Adds options to copy role color / edit role / view role icon when right clicking roles in the user profile",
authors: [Devs.Ven, Devs.goodbee],
- dependencies: ["SettingsStoreAPI"],
+ dependencies: ["UserSettingsAPI"],
settings,
diff --git a/src/plugins/customRPC/index.tsx b/src/plugins/customRPC/index.tsx
index 7e4e9a93..eebcd4dd 100644
--- a/src/plugins/customRPC/index.tsx
+++ b/src/plugins/customRPC/index.tsx
@@ -17,7 +17,7 @@
*/
import { definePluginSettings, Settings } from "@api/Settings";
-import { getSettingStoreLazy } from "@api/SettingsStores";
+import { getUserSettingLazy } from "@api/UserSettings";
import { ErrorCard } from "@components/ErrorCard";
import { Link } from "@components/Link";
import { Devs } from "@utils/constants";
@@ -33,8 +33,7 @@ const useProfileThemeStyle = findByCodeLazy("profileThemeStyle:", "--profile-gra
const ActivityComponent = findComponentByCodeLazy("onOpenGameProfile");
const ActivityClassName = findByPropsLazy("activity", "buttonColor");
-const ShowCurrentGame = getSettingStoreLazy("status", "showCurrentGame")!;
-
+const ShowCurrentGame = getUserSettingLazy("status", "showCurrentGame")!;
async function getApplicationAsset(key: string): Promise {
if (/https?:\/\/(cdn|media)\.discordapp\.(com|net)\/attachments\//.test(key)) return "mp:" + key.replace(/https?:\/\/(cdn|media)\.discordapp\.(com|net)\//, "");
@@ -394,7 +393,7 @@ export default definePlugin({
name: "CustomRPC",
description: "Allows you to set a custom rich presence.",
authors: [Devs.captain, Devs.AutumnVN, Devs.nin0dev],
- dependencies: ["SettingsStoreAPI"],
+ dependencies: ["UserSettingsAPI"],
start: setRpc,
stop: () => setRpc(true),
settings,
diff --git a/src/plugins/gameActivityToggle/index.tsx b/src/plugins/gameActivityToggle/index.tsx
index 4e2a390d..7aeb470d 100644
--- a/src/plugins/gameActivityToggle/index.tsx
+++ b/src/plugins/gameActivityToggle/index.tsx
@@ -17,8 +17,8 @@
*/
import { definePluginSettings } from "@api/Settings";
-import { getSettingStoreLazy } from "@api/SettingsStores";
import { disableStyle, enableStyle } from "@api/Styles";
+import { getUserSettingLazy } from "@api/UserSettings";
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
@@ -28,7 +28,7 @@ import style from "./style.css?managed";
const Button = findComponentByCodeLazy("Button.Sizes.NONE,disabled:");
-const ShowCurrentGame = getSettingStoreLazy("status", "showCurrentGame")!;
+const ShowCurrentGame = getUserSettingLazy("status", "showCurrentGame")!;
function makeIcon(showCurrentGame?: boolean) {
const { oldIcon } = settings.use(["oldIcon"]);
@@ -87,7 +87,7 @@ export default definePlugin({
name: "GameActivityToggle",
description: "Adds a button next to the mic and deafen button to toggle game activity.",
authors: [Devs.Nuckyz, Devs.RuukuLada],
- dependencies: ["SettingsStoreAPI"],
+ dependencies: ["UserSettingsAPI"],
settings,
patches: [
diff --git a/src/plugins/ignoreActivities/index.tsx b/src/plugins/ignoreActivities/index.tsx
index 6e34c79f..78c1c5cf 100644
--- a/src/plugins/ignoreActivities/index.tsx
+++ b/src/plugins/ignoreActivities/index.tsx
@@ -6,7 +6,7 @@
import * as DataStore from "@api/DataStore";
import { definePluginSettings, Settings } from "@api/Settings";
-import { getSettingStoreLazy } from "@api/SettingsStores";
+import { getUserSettingLazy } from "@api/UserSettings";
import ErrorBoundary from "@components/ErrorBoundary";
import { Flex } from "@components/Flex";
import { Devs } from "@utils/constants";
@@ -28,7 +28,7 @@ interface IgnoredActivity {
const RunningGameStore = findStoreLazy("RunningGameStore");
-const ShowCurrentGame = getSettingStoreLazy("status", "showCurrentGame")!;
+const ShowCurrentGame = getUserSettingLazy("status", "showCurrentGame")!;
function ToggleIcon(activity: IgnoredActivity, tooltipText: string, path: string, fill: string) {
return (
@@ -208,7 +208,7 @@ export default definePlugin({
name: "IgnoreActivities",
authors: [Devs.Nuckyz],
description: "Ignore activities from showing up on your status ONLY. You can configure which ones are specifically ignored from the Registered Games and Activities tabs, or use the general settings below.",
- dependencies: ["SettingsStoreAPI"],
+ dependencies: ["UserSettingsAPI"],
settings,
diff --git a/src/plugins/messageLinkEmbeds/index.tsx b/src/plugins/messageLinkEmbeds/index.tsx
index 70681fb2..cf180d0d 100644
--- a/src/plugins/messageLinkEmbeds/index.tsx
+++ b/src/plugins/messageLinkEmbeds/index.tsx
@@ -19,7 +19,7 @@
import { addAccessory, removeAccessory } from "@api/MessageAccessories";
import { updateMessage } from "@api/MessageUpdater";
import { definePluginSettings } from "@api/Settings";
-import { getSettingStoreLazy } from "@api/SettingsStores";
+import { getUserSettingLazy } from "@api/UserSettings";
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants.js";
import { classes } from "@utils/misc";
@@ -54,7 +54,7 @@ const ChannelMessage = findComponentByCodeLazy("childrenExecutedCommand:", ".hid
const SearchResultClasses = findByPropsLazy("message", "searchResult");
const EmbedClasses = findByPropsLazy("embedAuthorIcon", "embedAuthor", "embedAuthor");
-const MessageDisplayCompact = getSettingStoreLazy("textAndImages", "messageDisplayCompact")!;
+const MessageDisplayCompact = getUserSettingLazy("textAndImages", "messageDisplayCompact")!;
const messageLinkRegex = /(? }
- // FIXME: wtf is this? do we need to pass some proper component??
+ // Don't render forward message button
renderForwardComponent={() => null}
shouldHideMediaOptions={false}
shouldAnimate
diff --git a/src/webpack/common/index.ts b/src/webpack/common/index.ts
index 5da3cc68..4193330c 100644
--- a/src/webpack/common/index.ts
+++ b/src/webpack/common/index.ts
@@ -20,9 +20,9 @@ export * from "./classes";
export * from "./components";
export * from "./menu";
export * from "./react";
-export * from "./settingsStores";
export * from "./stores";
export * as ComponentTypes from "./types/components.d";
export * as MenuTypes from "./types/menu.d";
export * as UtilTypes from "./types/utils.d";
+export * from "./userSettings";
export * from "./utils";
diff --git a/src/webpack/common/types/index.d.ts b/src/webpack/common/types/index.d.ts
index 01c96855..a536cdcf 100644
--- a/src/webpack/common/types/index.d.ts
+++ b/src/webpack/common/types/index.d.ts
@@ -21,6 +21,5 @@ export * from "./components";
export * from "./fluxEvents";
export * from "./i18nMessages";
export * from "./menu";
-export * from "./settingsStores";
export * from "./stores";
export * from "./utils";
diff --git a/src/webpack/common/types/settingsStores.ts b/src/webpack/common/types/settingsStores.ts
deleted file mode 100644
index 5453ca35..00000000
--- a/src/webpack/common/types/settingsStores.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Vencord, a Discord client mod
- * Copyright (c) 2024 Vendicated and contributors
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
-
-export interface SettingsStore {
- getSetting(): T;
- updateSetting(value: T): void;
- useSetting(): T;
-}
diff --git a/src/webpack/common/types/utils.d.ts b/src/webpack/common/types/utils.d.ts
index 7f6249be..ee3f6994 100644
--- a/src/webpack/common/types/utils.d.ts
+++ b/src/webpack/common/types/utils.d.ts
@@ -82,7 +82,7 @@ interface RestRequestData {
retries?: number;
}
-export type RestAPI = Record<"delete" | "get" | "patch" | "post" | "put", (data: RestRequestData) => Promise>;
+export type RestAPI = Record<"del" | "get" | "patch" | "post" | "put", (data: RestRequestData) => Promise>;
export type Permissions = "CREATE_INSTANT_INVITE"
| "KICK_MEMBERS"
diff --git a/src/webpack/common/settingsStores.ts b/src/webpack/common/userSettings.ts
similarity index 100%
rename from src/webpack/common/settingsStores.ts
rename to src/webpack/common/userSettings.ts