NoNitroUpsell: Use Override Store

This commit is contained in:
thororen1234 2025-10-13 22:41:24 -04:00
parent 190003d648
commit 1d7dd68d9f
No known key found for this signature in database
5 changed files with 20 additions and 59 deletions

View file

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

View file

@ -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 <Menu.Menu navId="sp-custom-status-submenu" onClose={() => { }}>
{Object.entries((settings.store.StatusPresets as { [k: string]: DiscordStatus | undefined; })).map(([index, status]) => status != null ? <Menu.MenuItem

View file

@ -27,13 +27,10 @@ import definePlugin, { OptionType, Patch } from "@utils/types";
import type { Emoji, Message } from "@vencord/discord-types";
import { StickerFormatType } from "@vencord/discord-types/enums";
import { findByCodeLazy, findByPropsLazy, findStoreLazy, proxyLazyWebpack } from "@webpack";
import { Alerts, ChannelStore, DraftType, EmojiStore, FluxDispatcher, GuildMemberStore, lodash, Parser, PermissionsBits, PermissionStore, StickersStore, UploadHandler, UserSettingsActionCreators, UserStore } from "@webpack/common";
import { Alerts, ChannelStore, DraftType, EmojiStore, FluxDispatcher, GuildMemberStore, lodash, OverridePremiumTypeStore, Parser, PermissionsBits, PermissionStore, StickersStore, UploadHandler, UserSettingsActionCreators } from "@webpack/common";
import { applyPalette, GIFEncoder, quantize } from "gifenc";
import type { ReactElement, ReactNode } from "react";
// @ts-ignore
const premiumType = UserStore?.getCurrentUser()?._realPremiumType ?? UserStore?.getCurrentUser()?.premiumType ?? 0;
const UserSettingsProtoStore = findStoreLazy("UserSettingsProtoStore");
const BINARY_READ_OPTIONS = findByPropsLazy("readerFactory");
@ -389,16 +386,17 @@ export default definePlugin({
},
get canUseEmotes() {
return (premiumType) > 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;

View file

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

View file

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