From a5115d464f14ca1adb2852cbcd61d133fb466978 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Fri, 9 May 2025 16:15:27 +0200 Subject: [PATCH] feat: claim circuit rewards --- src/controllers/api/endlessXpController.ts | 43 +++++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/controllers/api/endlessXpController.ts b/src/controllers/api/endlessXpController.ts index 76a4fa79..1be4bd2b 100644 --- a/src/controllers/api/endlessXpController.ts +++ b/src/controllers/api/endlessXpController.ts @@ -1,11 +1,13 @@ import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; -import { getInventory } from "@/src/services/inventoryService"; +import { combineInventoryChanges, getInventory } from "@/src/services/inventoryService"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { IEndlessXpReward, IInventoryClient, TEndlessXpCategory } from "@/src/types/inventoryTypes/inventoryTypes"; import { logger } from "@/src/utils/logger"; import { ExportRewards, ICountedStoreItem } from "warframe-public-export-plus"; import { getRandomElement } from "@/src/services/rngService"; +import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; +import { IInventoryChanges } from "@/src/types/purchaseTypes"; export const endlessXpController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -42,17 +44,46 @@ export const endlessXpController: RequestHandler = async (req, res) => { res.json({ NewProgress: inventory.toJSON().EndlessXP!.find(x => x.Category == payload.Category)! }); + } else if (payload.Mode == "c") { + const inventory = await getInventory(accountId); + const entry = inventory.EndlessXP!.find(x => x.Category == payload.Category)!; + const inventoryChanges: IInventoryChanges = {}; + for (const reward of entry.PendingRewards) { + if (entry.Claim < reward.RequiredTotalXp && reward.RequiredTotalXp <= entry.Earn) { + combineInventoryChanges( + inventoryChanges, + ( + await handleStoreItemAcquisition( + reward.Rewards[0].StoreItem, + inventory, + reward.Rewards[0].ItemCount + ) + ).InventoryChanges + ); + } + } + entry.Claim = entry.Earn; + await inventory.save(); + res.json({ + InventoryChanges: inventoryChanges, + ClaimedXp: entry.Claim + }); } else { logger.debug(`data provided to ${req.path}: ${String(req.body)}`); throw new Error(`unexpected endlessXp mode: ${payload.Mode}`); } }; -interface IEndlessXpRequest { - Mode: string; // "r" - Category: TEndlessXpCategory; - Choices: string[]; -} +type IEndlessXpRequest = + | { + Mode: "r"; + Category: TEndlessXpCategory; + Choices: string[]; + } + | { + Mode: "c" | "something else"; + Category: TEndlessXpCategory; + }; const generateRandomRewards = (deckName: string): ICountedStoreItem[] => { const reward = getRandomElement(ExportRewards[deckName][0])!;