diff --git a/src/controllers/api/updateChallengeProgressController.ts b/src/controllers/api/updateChallengeProgressController.ts index b75e820a4..e0547c7ff 100644 --- a/src/controllers/api/updateChallengeProgressController.ts +++ b/src/controllers/api/updateChallengeProgressController.ts @@ -10,6 +10,7 @@ import { logger } from "@/src/utils/logger"; export const updateChallengeProgressController: RequestHandler = async (req, res) => { const challenges = getJSONfromString(String(req.body)); const account = await getAccountForRequest(req); + logger.debug(`challenge report:`, challenges); const inventory = await getInventory( account._id.toString(), @@ -17,7 +18,7 @@ export const updateChallengeProgressController: RequestHandler = async (req, res ); let affiliationMods: IAffiliationMods[] = []; if (challenges.ChallengeProgress) { - affiliationMods = addChallenges( + affiliationMods = await addChallenges( account, inventory, challenges.ChallengeProgress, diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 8d2295d65..c89495138 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -1904,25 +1904,87 @@ export const addLoreFragmentScans = (inventory: TInventoryDatabaseDocument, arr: }); }; -export const addChallenges = ( +const challengeRewardsInboxMessages: Record = { + SentEvoEphemeraRankOne: { + sub: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockAName", + sndr: "/Lotus/Language/Bosses/Ordis", + msg: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockADesc", + icon: "/Lotus/Interface/Icons/Npcs/Ordis.png", + att: ["/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraB"] + }, + SentEvoEphemeraRankTwo: { + sub: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockBName", + sndr: "/Lotus/Language/Bosses/Ordis", + msg: "/Lotus/Language/Inbox/EvolvingEphemeraUnlockBDesc", + icon: "/Lotus/Interface/Icons/Npcs/Ordis.png", + att: ["/Lotus/Upgrades/Skins/Effects/NarmerEvolvingEphemeraC"] + }, + SentEvoSyandanaRankOne: { + sub: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockAName", + sndr: "/Lotus/Language/Bosses/Ordis", + msg: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockADesc", + icon: "/Lotus/Interface/Icons/Npcs/Ordis.png", + att: ["/Lotus/Upgrades/Skins/Scarves/NarmerEvolvingSyandanaBCape"] + }, + SentEvoSyandanaRankTwo: { + sub: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockBName", + sndr: "/Lotus/Language/Bosses/Ordis", + msg: "/Lotus/Language/Inbox/EvolvingSyandanaUnlockBDesc", + icon: "/Lotus/Interface/Icons/Npcs/Ordis.png", + att: ["/Lotus/Upgrades/Skins/Scarves/NarmerEvolvingSyandanaCCape"] + }, + SentEvoSekharaRankOne: { + sub: "/Lotus/Language/Inbox/EvolvingSekharaUnlockAName", + sndr: "/Lotus/Language/Bosses/Ordis", + msg: "/Lotus/Language/Inbox/EvolvingSekharaUnlockADesc", + icon: "/Lotus/Interface/Icons/Npcs/Ordis.png", + att: ["/Lotus/Upgrades/Skins/Clan/ZarimanEvolvingSekharaBadgeItemB"] + }, + SentEvoSekharaRankTwo: { + sub: "/Lotus/Language/Inbox/EvolvingSekharaUnlockBName", + sndr: "/Lotus/Language/Bosses/Ordis", + msg: "/Lotus/Language/Inbox/EvolvingSekharaUnlockBDesc", + icon: "/Lotus/Interface/Icons/Npcs/Ordis.png", + att: ["/Lotus/Upgrades/Skins/Clan/ZarimanEvolvingSekharaBadgeItemC"] + } +}; + +export const addChallenges = async ( account: TAccountDocument, inventory: TInventoryDatabaseDocument, ChallengeProgress: IChallengeProgress[], SeasonChallengeCompletions: ISeasonChallenge[] | undefined -): IAffiliationMods[] => { - ChallengeProgress.forEach(({ Name, Progress }) => { - const itemIndex = inventory.ChallengeProgress.findIndex(i => i.Name === Name); - - if (itemIndex !== -1) { - inventory.ChallengeProgress[itemIndex].Progress = Progress; +): Promise => { + for (const { Name, Progress, Completed } of ChallengeProgress) { + let dbChallenge = inventory.ChallengeProgress.find(x => x.Name == Name); + if (dbChallenge) { + dbChallenge.Progress = Progress; } else { - inventory.ChallengeProgress.push({ Name, Progress }); + dbChallenge = { Name, Progress }; + inventory.ChallengeProgress.push(dbChallenge); } if (Name.startsWith("Calendar")) { addString(getCalendarProgress(inventory).SeasonProgress.ActivatedChallenges, Name); } - }); + + if ((Completed?.length ?? 0) > (dbChallenge.Completed?.length ?? 0)) { + dbChallenge.Completed ??= []; + for (const completion of Completed!) { + if (dbChallenge.Completed.indexOf(completion) == -1) { + if (completion == "challengeRewards") { + if (Name in challengeRewardsInboxMessages) { + await createMessage(account._id, [challengeRewardsInboxMessages[Name]]); + dbChallenge.Completed.push(completion); + // Would love to somehow let the client know about inbox or inventory changes, but there doesn't seem to anything for updateChallengeProgress. + continue; + } + } + logger.warn(`ignoring unknown challenge completion`, { challenge: Name, completion }); + } + } + } + } const affiliationMods: IAffiliationMods[] = []; if (SeasonChallengeCompletions) { diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index a7b3d9e4f..4a8da3704 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -292,7 +292,7 @@ export const addMissionInventoryUpdates = async ( addRecipes(inventory, value); break; case "ChallengeProgress": - addChallenges(account, inventory, value, inventoryUpdates.SeasonChallengeCompletions); + await addChallenges(account, inventory, value, inventoryUpdates.SeasonChallengeCompletions); break; case "FusionTreasures": addFusionTreasures(inventory, value);