From 7458acb80ec64ff2b62ddbe5c3a0aaab11b87ba3 Mon Sep 17 00:00:00 2001 From: Sainan Date: Sun, 22 Dec 2024 04:10:23 +0100 Subject: [PATCH] feat: basic implementation of endlessXp.php we can play The Circuit --- src/controllers/api/endlessXpController.ts | 60 ++++++++++++++++++++ src/models/inventoryModels/inventoryModel.ts | 15 ++++- src/routes/api.ts | 2 + src/types/inventoryTypes/inventoryTypes.ts | 8 +++ 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/controllers/api/endlessXpController.ts diff --git a/src/controllers/api/endlessXpController.ts b/src/controllers/api/endlessXpController.ts new file mode 100644 index 00000000..855c5f22 --- /dev/null +++ b/src/controllers/api/endlessXpController.ts @@ -0,0 +1,60 @@ +import { RequestHandler } from "express"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { getInventory } from "@/src/services/inventoryService"; +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { TEndlessXpCategory } from "@/src/types/inventoryTypes/inventoryTypes"; + +export const endlessXpController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId); + const payload = getJSONfromString(String(req.body)) as IEndlessXpRequest; + + inventory.EndlessXP ??= []; + const entry = inventory.EndlessXP.find(x => x.Category == payload.Category); + if (entry) { + entry.Choices = payload.Choices; + } else { + inventory.EndlessXP.push({ + Category: payload.Category, + Choices: payload.Choices + }); + } + await inventory.save(); + + res.json({ + NewProgress: { + Category: payload.Category, + Earn: 0, + Claim: 0, + BonusAvailable: { + $date: { + $numberLong: "9999999999999" + } + }, + Expiry: { + $date: { + $numberLong: "9999999999999" + } + }, + Choices: payload.Choices, + PendingRewards: [ + { + RequiredTotalXp: 190, + Rewards: [ + { + StoreItem: "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerHealthAuraMod", + ItemCount: 1 + } + ] + } + // ... + ] + } + }); +}; + +interface IEndlessXpRequest { + Mode: string; // "r" + Category: TEndlessXpCategory; + Choices: string[]; +} diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 6094e0ea..28292ba4 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -37,7 +37,8 @@ import { IPeriodicMissionCompletionDatabase, IPeriodicMissionCompletionResponse, ILoreFragmentScan, - IEvolutionProgress + IEvolutionProgress, + IEndlessXpProgress } from "../../types/inventoryTypes/inventoryTypes"; import { IOid } from "../../types/commonTypes"; import { @@ -581,6 +582,14 @@ const evolutionProgressSchema = new Schema( { _id: false } ); +const endlessXpProgressSchema = new Schema( + { + Category: String, + Choices: [String] + }, + { _id: false } +); + const inventorySchema = new Schema( { accountOwnerId: Schema.Types.ObjectId, @@ -938,7 +947,9 @@ const inventorySchema = new Schema( //Zanuka Harvestable: Boolean, //Grustag three - DeathSquadable: Boolean + DeathSquadable: Boolean, + + EndlessXP: { type: [endlessXpProgressSchema], default: undefined } }, { timestamps: { createdAt: "Created" } } ); diff --git a/src/routes/api.ts b/src/routes/api.ts index 8f8687b0..400dbc46 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -8,6 +8,7 @@ import { createGuildController } from "@/src/controllers/api/createGuildControll import { deleteSessionController } from "@/src/controllers/api/deleteSessionController"; import { dojoController } from "@/src/controllers/api/dojoController"; import { dronesController } from "@/src/controllers/api/dronesController"; +import { endlessXpController } from "@/src/controllers/api/endlessXpController"; import { evolveWeaponController } from "@/src/controllers/api/evolveWeaponController"; import { findSessionsController } from "@/src/controllers/api/findSessionsController"; import { focusController } from "@/src/controllers/api/focusController"; @@ -108,6 +109,7 @@ apiRouter.post("/arcaneCommon.php", arcaneCommonController); apiRouter.post("/artifacts.php", artifactsController); apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/createGuild.php", createGuildController); +apiRouter.post("/endlessXp.php", endlessXpController); apiRouter.post("/evolveWeapon.php", evolveWeaponController); apiRouter.post("/findSessions.php", findSessionsController); apiRouter.post("/focus.php", focusController); diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index bf76b33c..fd207bc9 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -301,6 +301,7 @@ export interface IInventoryResponse { PendingCoupon: IPendingCoupon; Harvestable: boolean; DeathSquadable: boolean; + EndlessXP?: IEndlessXpProgress[]; } export interface IAffiliation { @@ -932,3 +933,10 @@ export interface IEvolutionProgress { Rank: number; ItemType: string; } + +export type TEndlessXpCategory = "EXC_NORMAL" | "EXC_HARD"; + +export interface IEndlessXpProgress { + Category: TEndlessXpCategory; + Choices: string[]; +}