diff --git a/src/equicordplugins/questify/index.tsx b/src/equicordplugins/questify/index.tsx index 1e92ba6ce..d68462834 100644 --- a/src/equicordplugins/questify/index.tsx +++ b/src/equicordplugins/questify/index.tsx @@ -14,31 +14,39 @@ import definePlugin, { StartAt } from "@utils/types"; import { ContextMenuApi, Menu, NavigationRouter } from "@webpack/common"; import { JSX } from "react"; -import { addIgnoredQuest, autoFetchCompatible, fetchAndAlertQuests, maximumAutoFetchIntervalValue, minimumAutoFetchIntervalValue, removeIgnoredQuest, rerenderQuests, settings, startAutoFetchingQuests, stopAutoFetchingQuests, validateAndOverwriteIgnoredQuests } from "./settings"; -import { GuildlessServerListItem, Quest, QuestIcon, QuestMap, QuestStatus, RGB } from "./utils/components"; -import { adjustRGB, decimalToRGB, fetchAndDispatchQuests, formatLowerBadge, getFormattedNow, getQuestStatus, isDarkish, leftClick, middleClick, normalizeQuestName, q, QuestifyLogger, questPath, QuestsStore, refreshQuest, reportPlayGameQuestProgress, reportVideoQuestProgress, rightClick, waitUntilEnrolled } from "./utils/misc"; +import { addIgnoredQuest, autoFetchCompatible, fetchAndAlertQuests, maximumAutoFetchIntervalValue, minimumAutoFetchIntervalValue, questIsIgnored, removeIgnoredQuest, rerenderQuests, settings, startAutoFetchingQuests, stopAutoFetchingQuests, validateAndOverwriteIgnoredQuests } from "./settings"; +import { ExcludedQuestMap, GuildlessServerListItem, Quest, QuestIcon, QuestMap, QuestStatus, RGB } from "./utils/components"; +import { adjustRGB, decimalToRGB, fetchAndDispatchQuests, formatLowerBadge, getFormattedNow, getIgnoredQuestIDs, getQuestStatus, isDarkish, leftClick, middleClick, normalizeQuestName, q, QuestifyLogger, questPath, QuestsStore, refreshQuest, reportPlayGameQuestProgress, reportVideoQuestProgress, rightClick, setIgnoredQuestIDs, waitUntilEnrolled } from "./utils/misc"; const patchedMobileQuests = new Set(); export const activeQuestIntervals = new Map(); -function questMenuUnignoreClicked(): void { - validateAndOverwriteIgnoredQuests(""); +function questMenuUnignoreAllClicked(): void { + validateAndOverwriteIgnoredQuests([]); } -function questMenuIgnoreClicked(): void { +function questMenuIgnoreAllClicked(): void { const quests = (QuestsStore.quests as QuestMap); - const ignoredQuestsSet = new Set(); + const excludedQuests = (QuestsStore.excludedQuests as ExcludedQuestMap); + const ignoredQuestsSet = new Set(); + const ignoredQuestIDs = getIgnoredQuestIDs(); for (const quest of quests.values()) { - const questName = normalizeQuestName(quest.config.messages.questName); + const questID = quest.id; const questStatus = getQuestStatus(quest, false); - if (questStatus === QuestStatus.Unclaimed) { - ignoredQuestsSet.add(questName); + if (questStatus === QuestStatus.Unclaimed || ignoredQuestIDs.includes(questID)) { + ignoredQuestsSet.add(questID); } } - settings.store.ignoredQuests = Array.from(ignoredQuestsSet).join("\n"); + for (const quest of excludedQuests.values()) { + if (ignoredQuestIDs.includes(quest.id)) { + ignoredQuestsSet.add(quest.id); + } + } + + setIgnoredQuestIDs(Array.from(ignoredQuestsSet)); settings.store.unclaimedUnignoredQuests = 0; } @@ -86,14 +94,14 @@ export function QuestButton(): JSX.Element { { addIgnoredQuest(props.quest.config.messages.questName); }} + action={() => { addIgnoredQuest(props.quest.id); }} /> { removeIgnoredQuest(props.quest.config.messages.questName); }} + action={() => { removeIgnoredQuest(props.quest.id); }} /> {activeQuestIntervals.has(props.quest.id) && { const { restyleQuests, - ignoredQuests, + ignoredQuestIDs, + ignoredQuestProfile } = settings.use([ "restyleQuests", - "ignoredQuests", + "ignoredQuestIDs", + "ignoredQuestProfile" ]); const style: Record = {}; @@ -479,10 +493,10 @@ export function getQuestTileStyle(quest: Quest | null): Record { themeColor = dummyProvided ? dummyColor : claimedColor || null; } else if (questStatus === QuestStatus.Unclaimed) { themeColor = dummyProvided ? dummyColor : unclaimedColor || null; - } else if (questStatus === QuestStatus.Ignored) { - themeColor = dummyProvided ? dummyColor : ignoredColor || null; } else if (questStatus === QuestStatus.Expired) { themeColor = dummyProvided ? dummyColor : expiredColor || null; + } else if (questStatus === QuestStatus.Ignored) { + themeColor = dummyProvided ? dummyColor : ignoredColor || null; } if (!themeColor) return style; diff --git a/src/equicordplugins/questify/settings.tsx b/src/equicordplugins/questify/settings.tsx index c8c974430..7907ac345 100644 --- a/src/equicordplugins/questify/settings.tsx +++ b/src/equicordplugins/questify/settings.tsx @@ -9,12 +9,12 @@ import { ErrorBoundary } from "@components/index"; import { Logger } from "@utils/Logger"; import { OptionType } from "@utils/types"; import { findLazy } from "@webpack"; -import { Button, ColorPicker, ContextMenuApi, Forms, Menu, Select, TextArea, TextInput, useEffect, useRef, useState } from "@webpack/common"; +import { Button, ColorPicker, ContextMenuApi, Forms, Menu, Select, TextInput, useEffect, useRef, useState } from "@webpack/common"; import { JSX } from "react"; import { activeQuestIntervals, getQuestTileClasses, getQuestTileStyle } from "./index"; -import { DynamicDropdown, DynamicDropdownSettingOption, GuildlessServerListItem, Quest, QuestIcon, QuestStatus, QuestTile, RadioGroup, RadioOption, SelectOption, SoundIcon } from "./utils/components"; -import { AudioPlayer, decimalToRGB, fetchAndDispatchQuests, getFormattedNow, getQuestStatus, isDarkish, isSoundAllowed, leftClick, middleClick, normalizeQuestName, q, QuestifyLogger, QuestsStore, rightClick, validCommaSeparatedList } from "./utils/misc"; +import { DynamicDropdown, DynamicDropdownSettingOption, ExcludedQuest, GuildlessServerListItem, Quest, QuestIcon, QuestStatus, QuestTile, RadioGroup, RadioOption, SelectOption, SoundIcon } from "./utils/components"; +import { AudioPlayer, decimalToRGB, fetchAndDispatchQuests, getFormattedNow, getIgnoredQuestIDs, getQuestStatus, isDarkish, isSoundAllowed, leftClick, middleClick, q, QuestifyLogger, QuestsStore, rightClick, setIgnoredQuestIDs, validCommaSeparatedList } from "./utils/misc"; let defaultSounds: string[] | null = null; let autoFetchInterval: null | ReturnType = null; @@ -129,49 +129,54 @@ export const intervalScales = { } }; -export function removeIgnoredQuest(questName: string): void { - const ignoredQuests = settings.store.ignoredQuests.split("\n"); - validateAndOverwriteIgnoredQuests(ignoredQuests.filter(name => normalizeQuestName(name) !== normalizeQuestName(questName)).join("\n")); +export function removeIgnoredQuest(questID: string): void { + const ignoredQuests = getIgnoredQuestIDs(); + const newIgnoredQuests = ignoredQuests.filter(id => id !== questID); + validateAndOverwriteIgnoredQuests(newIgnoredQuests); } -export function addIgnoredQuest(questName: string): void { - const { ignoredQuests } = settings.store; - validateAndOverwriteIgnoredQuests(ignoredQuests + "\n" + normalizeQuestName(questName)); +export function addIgnoredQuest(questID: string): void { + const ignoredQuests = getIgnoredQuestIDs(); + const newIgnoredQuests = ignoredQuests.concat(questID); + validateAndOverwriteIgnoredQuests(newIgnoredQuests); } -export function questIsIgnored(questName: string): boolean { - const ignoredQuests = new Set(settings.store.ignoredQuests.split("\n").map(normalizeQuestName)); - return ignoredQuests.has(normalizeQuestName(questName)); +export function questIsIgnored(questID: string): boolean { + const ignoredQuests = getIgnoredQuestIDs(); + return ignoredQuests.includes(questID); } -export function validateIgnoredQuests(ignoredQuests?: string, questsData?: Quest[]): [string, number] { +export function validateIgnoredQuests(ignoredQuests?: string[], questsData?: Quest[]): [string[], number] { const quests = questsData ?? Array.from(QuestsStore.quests.values()) as Quest[]; - const currentlyIgnored = new Set((ignoredQuests ?? settings.store.ignoredQuests).split("\n").map(normalizeQuestName)); + const excludedQuests = Array.from(QuestsStore.excludedQuests.values()) as ExcludedQuest[]; + const currentlyIgnored = ignoredQuests ? new Set(ignoredQuests) : new Set(getIgnoredQuestIDs()); const validIgnored = new Set(); let numUnclaimedUnignoredQuests = 0; for (const quest of quests) { const questStatus = getQuestStatus(quest, false); - const normalizedName = normalizeQuestName(quest.config.messages.questName); - if (questStatus === QuestStatus.Unclaimed) { - if (currentlyIgnored.has(normalizedName)) { - validIgnored.add(normalizedName); - } else { - numUnclaimedUnignoredQuests++; - } + if (currentlyIgnored.has(quest.id)) { + validIgnored.add(quest.id); + } else if (questStatus === QuestStatus.Unclaimed) { + numUnclaimedUnignoredQuests++; } } - const ignoredStr = Array.from(validIgnored).join("\n"); - return [ignoredStr, numUnclaimedUnignoredQuests]; + for (const quest of excludedQuests) { + if (currentlyIgnored.has(quest.id)) { + validIgnored.add(quest.id); + } + } + + return [Array.from(validIgnored), numUnclaimedUnignoredQuests]; } -export function validateAndOverwriteIgnoredQuests(ignoredQuests?: string, questsData?: Quest[]): string { - const [ignoredStr, numUnclaimedUnignoredQuests] = validateIgnoredQuests(ignoredQuests, questsData); +export function validateAndOverwriteIgnoredQuests(ignoredQuests?: string[], questsData?: Quest[]): string[] { + const [validIgnored, numUnclaimedUnignoredQuests] = validateIgnoredQuests(ignoredQuests, questsData); settings.store.unclaimedUnignoredQuests = numUnclaimedUnignoredQuests; - settings.store.ignoredQuests = ignoredStr; - return ignoredStr; + setIgnoredQuestIDs(validIgnored); + return validIgnored; } interface DummyQuestButtonProps { @@ -689,48 +694,6 @@ function DisableQuestsSetting(): JSX.Element { ); } -function IgnoredQuestsSetting(): JSX.Element { - const [ignoredQuests, setIgnoredQuests] = useState(settings.store.ignoredQuests); - validateAndOverwriteIgnoredQuests(ignoredQuests); - - return ( - - -
- -
- - Ignored Quests - - - A list of Quest names to exclude from the Unclaimed Indicator. -

- One Quest name per line. Names must match the spelling displayed on the Quests page. - Alternatively, click the three dots on a Quest tile and select the Mark as Ignored option. -
-
-
-