diff --git a/src/equicordplugins/noNitroUpsell/index.ts b/src/equicordplugins/noNitroUpsell/index.ts index e4dba7699..d7b2eaf5d 100644 --- a/src/equicordplugins/noNitroUpsell/index.ts +++ b/src/equicordplugins/noNitroUpsell/index.ts @@ -6,61 +6,23 @@ import { Devs } from "@utils/constants"; import definePlugin from "@utils/types"; -import { User } from "@vencord/discord-types"; -import { UserStore } from "@webpack/common"; - -let user: ModifiedUser | undefined; -let lastUserId: string | undefined; - -interface ModifiedUser extends User { - _realPremiumType?: number; -} - -const onChange = () => { - const newUser = UserStore.getCurrentUser(); - if (newUser && newUser.id !== lastUserId) { - user = newUser; - ready(user); - } -}; - -function ready(user: ModifiedUser) { - if (!user) return; - if ("_realPremiumType" in user) return; - - user._realPremiumType = user.premiumType ?? 0; - user.premiumType = 2; - lastUserId = user.id; -} +import { OverridePremiumTypeStore } from "@webpack/common"; export default definePlugin({ name: "NoNitroUpsell", description: "Removes ALL of Discord's nitro upsells by tricking the client into thinking you have nitro.", authors: [Devs.thororen], - patches: [ - { - find: "#{intl::USER_PROFILE_ENTRY_POINTS_AMP_UP_YOUR_PROFILE}", - replacement: [ - { - match: /}\);return \i\?.*?}\)}}/, - replace: "});return null}}" - } - ], + flux: { + CONNECTION_OPEN() { + const state = OverridePremiumTypeStore.getState(); + if (state.premiumTypeActual !== 2 || state.premiumTypeOverride === 2) return; + state.premiumTypeOverride = 2; } - ], + }, start() { - user = UserStore.getCurrentUser(); - if (user) ready(user); - - UserStore.addChangeListener(onChange); + OverridePremiumTypeStore.getState().premiumTypeOverride = 2; }, stop() { - const user = UserStore.getCurrentUser(); - if (!user) return; - if (!("_realPremiumType" in user)) return; - // @ts-ignore - user.premiumType = user._realPremiumType; - delete user._realPremiumType; - UserStore.removeChangeListener(onChange); + OverridePremiumTypeStore.getState().premiumTypeOverride = undefined; } }); diff --git a/src/equicordplugins/statusPresets/index.tsx b/src/equicordplugins/statusPresets/index.tsx index b10790794..461fda86d 100644 --- a/src/equicordplugins/statusPresets/index.tsx +++ b/src/equicordplugins/statusPresets/index.tsx @@ -28,7 +28,7 @@ import { openModalLazy } from "@utils/modal"; import { useForceUpdater } from "@utils/react"; import definePlugin, { OptionType, StartAt } from "@utils/types"; import { extractAndLoadChunksLazy, findByPropsLazy, findComponentByCodeLazy, findModuleId, wreq } from "@webpack"; -import { Clickable, Menu, Toasts, UserStore, useState } from "@webpack/common"; +import { Clickable, Menu, OverridePremiumTypeStore, Toasts, useState } from "@webpack/common"; import managedStyle from "./fixActionBar.css?managed"; @@ -126,8 +126,7 @@ const RenderStatusMenuItem = ({ status, update, disabled }: { status: DiscordSta const StatusSubMenuComponent = () => { - // @ts-ignore - const premiumType = UserStore?.getCurrentUser()?._realPremiumType ?? UserStore?.getCurrentUser()?.premiumType ?? 0; + const premiumType = OverridePremiumTypeStore.getState().premiumTypeActual ?? 0; const update = useForceUpdater(); return { }}> {Object.entries((settings.store.StatusPresets as { [k: string]: DiscordStatus | undefined; })).map(([index, status]) => status != null ? 0; + return (OverridePremiumTypeStore.getState().premiumTypeActual ?? 0) > 0; }, get canUseStickers() { - return (premiumType) > 1; + return (OverridePremiumTypeStore.getState().premiumTypeActual ?? 0) > 1; }, handleProtoChange(proto: any, user: any) { try { if (proto == null || typeof proto === "string") return; + const premiumType = OverridePremiumTypeStore.getState().premiumTypeActual ?? 0; if (premiumType !== 2) { proto.appearance ??= AppearanceSettingsActionCreators.create(); @@ -419,6 +417,7 @@ export default definePlugin({ }, handleGradientThemeSelect(backgroundGradientPresetId: number | undefined, theme: number, original: () => void) { + const premiumType = OverridePremiumTypeStore.getState().premiumTypeActual ?? 0; if (premiumType === 2 || backgroundGradientPresetId == null) return original(); if (!PreloadedUserSettingsActionCreators || !AppearanceSettingsActionCreators || !ClientThemeSettingsActionsCreators || !BINARY_READ_OPTIONS) return; diff --git a/src/plugins/superReactionTweaks/index.ts b/src/plugins/superReactionTweaks/index.ts index 6e102c20d..e6b33bb28 100644 --- a/src/plugins/superReactionTweaks/index.ts +++ b/src/plugins/superReactionTweaks/index.ts @@ -7,7 +7,7 @@ import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -import { UserStore } from "@webpack/common"; +import { OverridePremiumTypeStore } from "@webpack/common"; export const settings = definePluginSettings({ superReactByDefault: { @@ -77,7 +77,6 @@ export default definePlugin({ }, get shouldSuperReactByDefault() { - // @ts-ignore - return settings.store.superReactByDefault && (UserStore.getCurrentUser()?._realPremiumType ?? UserStore.getCurrentUser().premiumType != null); + return settings.store.superReactByDefault && (OverridePremiumTypeStore.getState().premiumTypeActual != null); } }); diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts index bc5b870ac..1a0bd6f3a 100644 --- a/src/webpack/common/stores.ts +++ b/src/webpack/common/stores.ts @@ -57,6 +57,7 @@ export let ThemeStore: t.ThemeStore; export let WindowStore: t.WindowStore; export let DraftStore: t.DraftStore; export let StreamerModeStore: t.StreamerModeStore; +export let OverridePremiumTypeStore: GenericStore; /** * @see jsdoc of {@link t.useStateFromStores} @@ -88,6 +89,7 @@ waitForStore("StickersStore", m => StickersStore = m); waitForStore("TypingStore", m => TypingStore = m); waitForStore("VoiceStateStore", m => VoiceStateStore = m); waitForStore("StreamerModeStore", m => StreamerModeStore = m); +waitForStore("OverridePremiumTypeStore", m => OverridePremiumTypeStore = m); waitForStore("ThemeStore", m => { ThemeStore = m; // Importing this directly can easily cause circular imports. For this reason, use a non import access here.