From 863f5e89bdf39453e5da35746affa027e0b1e5d7 Mon Sep 17 00:00:00 2001 From: Etorix <92535668+EtorixDev@users.noreply.github.com> Date: Sat, 9 May 2026 11:50:20 -0700 Subject: [PATCH] Questify: Fix Button Logic.... (#1065) * Fix Button Logic. * Fix Quest Button Logic. --- .../components/questButtonSettings.tsx | 5 +-- src/equicordplugins/questify/index.tsx | 35 ++++++++++++------- .../questify/settings/restartTracking.ts | 4 +++ 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/equicordplugins/questify/components/questButtonSettings.tsx b/src/equicordplugins/questify/components/questButtonSettings.tsx index 6378bc130..e70ca09d2 100644 --- a/src/equicordplugins/questify/components/questButtonSettings.tsx +++ b/src/equicordplugins/questify/components/questButtonSettings.tsx @@ -7,6 +7,7 @@ import { QuestRewardType, QuestTaskType } from "@vencord/discord-types/enums"; import type { JSX } from "react"; +import { enabledOnStartup } from ".."; import { getQuestifySettings, useQuestifySettings } from "../settings/access"; import { type QuestButtonAction, type QuestButtonDisplayMode, type QuestButtonIncludedTypes, type QuestButtonIndicatorMode } from "../settings/def"; import { startAutoFetchingQuests } from "../settings/fetching"; @@ -142,7 +143,7 @@ export function QuestButtonSetting(): JSX.Element { Quest Button Show a Quest Button in the server list with an optional indicator for unclaimed and unignored Quests. - + {enabledOnStartup && - + } Button Behavior diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index 26e85c470..e58d447f6 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -8,7 +8,7 @@ import "./styles.css"; import { playAudio } from "@api/AudioPlayer"; import { addServerListElement, removeServerListElement, ServerListRenderPosition } from "@api/ServerList"; -import { Settings } from "@api/Settings"; +import { PlainSettings, Settings } from "@api/Settings"; import { ErrorBoundary } from "@components/index"; import { EquicordDevs } from "@utils/constants"; import definePlugin, { StartAt } from "@utils/types"; @@ -23,7 +23,7 @@ import { getQuestifySettings } from "./settings/access"; import { resetQuestsToResume, startAutoFetchingQuests, stopAutoFetchingQuests } from "./settings/fetching"; import { validateIgnoredQuests } from "./settings/ignoredQuests"; import { rerenderQuests, useQuestRerender } from "./settings/rerender"; -import { disposeRestartTracking, initializeRestartTracking, promptToRestartIfDirty } from "./settings/restartTracking"; +import { disposeRestartTracking, initializeRestartTracking, promptToRestartIfDirty, setRestartDirty } from "./settings/restartTracking"; import { settings } from "./settings/store"; import { getSettingsModalOpen, initialQuestDataFetched, setInitialQuestDataFetched, setSettingsModalOpen } from "./state"; import { canAutoCompleteQuest, getActiveAutoCompletes, getQuestAutoCompleteProgress, getQuestButtonProps, getQuestPanelSubtitleText, hasEnabledAutoCompleteQuestTypes, processQuestForAutoComplete, resumeInterruptedAutoCompletes, setHeartbeatStackTracePatchSucceeded, setVideoProgressStackTracePatchSucceeded, stopAllAutoCompletes, stopAutoCompletesForRunningGames, stopQuestAutoComplete } from "./utils/completion"; @@ -37,6 +37,7 @@ import { formatLowerBadge, QUEST_PAGE } from "./utils/ui"; let isSwitchingAccount = false; let didAttemptAutoCompleteResume = false; const notifiedCompletedQuests = new Set(); +export const enabledOnStartup = PlainSettings.plugins.Questify?.enabled; function setOnQuestsPage(force?: boolean): void { getQuestifySettings().isOnQuestsPage = force ?? (window.location.pathname === QUEST_PAGE); @@ -381,27 +382,28 @@ export default definePlugin({ replace: "!$self.canAutoCompleteQuest(arguments[0].quest)&&" }, // If this group becomes unruly due to Discord refactoring and is unfixable, - // the 2nd, 3rd, and 4th can be commented out in favor of just the 1st at the - // expense of not seeing CTA buttons on completed but unclaimed Quests. + // the 2nd, 3rd, and 4th can be commented out in favor of just the 1st at the expense + // of not seeing CTA buttons on completed but unclaimed Quests. Also, questifyCanAutoComplete + // would need to be replaced as the 2nd patch defines it. { // Always expose the CTA button when available instead of only for videos and activities. - match: /(?<=wrap:!1,children:\[)\i&&[^?]+/, - replace: "!!arguments[0].quest.config.ctaConfig" + match: /(?<=wrap:!1,children:\[)(\i&&[^?]+)/, + replace: "((!!arguments[0].quest.config.ctaConfig&&questifyCanAutoComplete)||($1))" }, { // Let completed/claimed expired Quests with CTAs use the CTA-aware completed branch. - match: /(?<=return\()(?=\i.enabled&&\i===\i\.\i\.EXPIRED_CLAIMABLE&&\i\.\i\.has\(\i\))/, - replace: "!arguments[0].quest.config.ctaConfig&&" + match: /(return\()(?=\i.enabled&&\i===\i\.\i\.EXPIRED_CLAIMABLE&&\i\.\i\.has\(\i\))/, + replace: "const questifyCanAutoComplete=$self.canAutoCompleteQuest(arguments[0].quest);$1(questifyCanAutoComplete?!arguments[0].quest.config.ctaConfig:true)&&" }, { // Let completed/claimed expired Quests with CTAs use the CTA-aware completed branch. - match: /(?<=\):\i\?\i=)(\i)(?=\?\(0,\i\.jsx\)\(\i,\{quest:\i,sourceQuestContent:\i,onClick:\i,text:\i\}\):\(0,\i\.\i\)\(\i\)\?)/, - replace: "arguments[0].quest.config.ctaConfig||$1" + match: /(?<=\):\i\?\i=)(\i)(?=\?\(0,\i\.jsx\)\(\i,\{quest:\i,sourceQuestContent:\i,onClick:\i,text:\i\}\):)/, + replace: "((arguments[0].quest.config.ctaConfig&&questifyCanAutoComplete)||($1))" }, { // Force the CTA-aware complete branch. - match: /(?<=analyticsCtxQuestContentRowIndex:\i}\)}\):\i&&\i)(.{0,200}?fullWidth:!0}\)}\):)(\i.enabled)(.{0,50}?CLAIMED\))&&\i.\i.has\(\i\)(\?\i=)\i/, - replace: "&&false$1arguments[0].quest.config.ctaConfig&&arguments[0].quest.userStatus?.completedAt&&($2||true)$3$4true" + match: /(?<=analyticsCtxQuestContentRowIndex:\i}\)}\):\i&&\i)(.{0,200}?fullWidth:!0}\)}\):)(\i.enabled.{0,50}?CLAIMED\)&&\i.\i.has\(\i\))(\?\i=)(\i)/, + replace: "&&!questifyCanAutoComplete$1((questifyCanAutoComplete&&arguments[0].quest.config.ctaConfig&&arguments[0].quest.userStatus?.completedAt)||($2))$3(questifyCanAutoComplete||$4)" } ] }, @@ -615,8 +617,15 @@ export default definePlugin({ renderQuestifyButton: ErrorBoundary.wrap(QuestButton, { noop: true }), start() { + if (!enabledOnStartup && PlainSettings.plugins.Questify?.enabled) { + setRestartDirty(true); + } + initializeRestartTracking(settings); - addServerListElement(ServerListRenderPosition.Above, this.renderQuestifyButton); + + if (enabledOnStartup) { + addServerListElement(ServerListRenderPosition.Above, this.renderQuestifyButton); + } onceReady.then(() => { if (!getQuestifySettings().disableQuestsEverything) { diff --git a/src/equicordplugins/questify/settings/restartTracking.ts b/src/equicordplugins/questify/settings/restartTracking.ts index 19aa59c03..93acdbe99 100644 --- a/src/equicordplugins/questify/settings/restartTracking.ts +++ b/src/equicordplugins/questify/settings/restartTracking.ts @@ -48,6 +48,10 @@ export function isRestartDirty(): boolean { return restartDirty; } +export function setRestartDirty(dirty: boolean): void { + restartDirty = dirty; +} + export function promptToRestartIfDirty(): boolean { if (!restartDirty) { return false;