Closes #1534 Reviewed-on: #2593 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
63 lines
2.9 KiB
TypeScript
63 lines
2.9 KiB
TypeScript
import { RequestHandler } from "express";
|
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
|
import { getInventory } from "@/src/services/inventoryService";
|
|
import { EPOCH, getSeasonChallengePools, getWorldState, pushWeeklyActs } from "@/src/services/worldStateService";
|
|
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
|
import { ISeasonChallenge } from "@/src/types/worldStateTypes";
|
|
import { ExportChallenges } from "warframe-public-export-plus";
|
|
|
|
export const getPastWeeklyChallengesController: RequestHandler = async (req, res) => {
|
|
const accountId = await getAccountIdForRequest(req);
|
|
const inventory = await getInventory(accountId, "SeasonChallengeHistory ChallengeProgress");
|
|
const worldState = getWorldState(undefined);
|
|
|
|
if (worldState.SeasonInfo) {
|
|
const pools = getSeasonChallengePools(worldState.SeasonInfo.AffiliationTag);
|
|
const nightwaveStartTimestamp = Number(worldState.SeasonInfo.Activation.$date.$numberLong);
|
|
const nightwaveSeason = worldState.SeasonInfo.Season;
|
|
const timeMs = worldState.Time * 1000;
|
|
const completedChallengesIds = new Set<string>();
|
|
|
|
inventory.SeasonChallengeHistory.forEach(challengeHistory => {
|
|
const entryNightwaveSeason = parseInt(challengeHistory.id.slice(0, 4), 10) - 1;
|
|
if (nightwaveSeason == entryNightwaveSeason) {
|
|
const meta = Object.entries(ExportChallenges).find(
|
|
([key]) => key.split("/").pop() === challengeHistory.challenge
|
|
);
|
|
if (meta) {
|
|
const [, challengeMeta] = meta;
|
|
const challengeProgress = inventory.ChallengeProgress.find(
|
|
c => c.Name === challengeHistory.challenge
|
|
);
|
|
|
|
if (challengeProgress && challengeProgress.Progress >= (challengeMeta.requiredCount ?? 1)) {
|
|
completedChallengesIds.add(challengeHistory.id);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
const PastWeeklyChallenges: ISeasonChallenge[] = [];
|
|
|
|
let week = Math.trunc((timeMs - EPOCH) / unixTimesInMs.week) - 1;
|
|
|
|
while (EPOCH + week * unixTimesInMs.week >= nightwaveStartTimestamp && PastWeeklyChallenges.length < 3) {
|
|
const tempActs: ISeasonChallenge[] = [];
|
|
pushWeeklyActs(tempActs, pools, week, nightwaveStartTimestamp, nightwaveSeason);
|
|
|
|
for (const act of tempActs) {
|
|
if (!completedChallengesIds.has(act._id.$oid) && PastWeeklyChallenges.length < 3) {
|
|
if (act.Challenge.startsWith("/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyPermanent")) {
|
|
act.Permanent = true;
|
|
}
|
|
PastWeeklyChallenges.push(act);
|
|
}
|
|
}
|
|
|
|
week--;
|
|
}
|
|
|
|
res.json({ PastWeeklyChallenges: PastWeeklyChallenges });
|
|
}
|
|
};
|