From b7f381ba1da1e736b8501be69c5c8a0eade25f0e Mon Sep 17 00:00:00 2001 From: Sainan Date: Sun, 6 Oct 2024 17:43:43 +0200 Subject: [PATCH] feat: implement upgrading & downgrading arcanes (#520) --- src/controllers/api/arcaneCommonController.ts | 77 +++++++++++++++++++ src/routes/api.ts | 2 + 2 files changed, 79 insertions(+) create mode 100644 src/controllers/api/arcaneCommonController.ts diff --git a/src/controllers/api/arcaneCommonController.ts b/src/controllers/api/arcaneCommonController.ts new file mode 100644 index 00000000..81069976 --- /dev/null +++ b/src/controllers/api/arcaneCommonController.ts @@ -0,0 +1,77 @@ +import { RequestHandler } from "express"; +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { getInventory, addMods } from "@/src/services/inventoryService"; +import { IOid } from "@/src/types/commonTypes"; + +// eslint-disable-next-line @typescript-eslint/no-misused-promises +export const arcaneCommonController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const json = getJSONfromString(String(req.body)) as IArcaneCommonRequest; + const inventory = await getInventory(accountId); + const upgrade = inventory.Upgrades.find(x => x._id!.toString() == json.arcane.ItemId.$oid); + if (json.newRank == -1) { + // Break down request? + if (!upgrade || !upgrade.UpgradeFingerprint) { + throw new Error(`Failed to find upgrade with OID ${json.arcane.ItemId.$oid}`); + } + + // Remove Upgrade + inventory.Upgrades.pull({ _id: json.arcane.ItemId.$oid }); + + // Add RawUpgrades + const numRawUpgradesToGive = arcaneLevelCounts[JSON.parse(upgrade.UpgradeFingerprint).lvl]; + addMods(inventory, [ + { + ItemType: json.arcane.ItemType, + ItemCount: numRawUpgradesToGive + } + ]); + + res.json({ upgradeId: json.arcane.ItemId.$oid, numConsumed: numRawUpgradesToGive }); + } else { + // Upgrade request? + let numConsumed = arcaneLevelCounts[json.newRank]; + let upgradeId = json.arcane.ItemId.$oid; + if (upgrade) { + // Have an existing Upgrade item? + if (upgrade.UpgradeFingerprint) { + const existingLevel = JSON.parse(upgrade.UpgradeFingerprint).lvl; + numConsumed -= arcaneLevelCounts[existingLevel]; + } + upgrade.UpgradeFingerprint = JSON.stringify({ lvl: json.newRank }); + } else { + const newLength = inventory.Upgrades.push({ + ItemType: json.arcane.ItemType, + UpgradeFingerprint: JSON.stringify({ lvl: json.newRank }) + }); + upgradeId = inventory.Upgrades[newLength - 1]._id!.toString(); + } + + // Remove RawUpgrades + addMods(inventory, [ + { + ItemType: json.arcane.ItemType, + ItemCount: numConsumed * -1 + } + ]); + + res.json({ newLevel: json.newRank, numConsumed, upgradeId }); + } + await inventory.save(); +}; + +const arcaneLevelCounts = [0, 3, 6, 10, 15, 21]; + +interface IArcaneCommonRequest { + arcane: { + ItemType: string; + ItemId: IOid; + FromSKU: boolean; + UpgradeFingerprint: string; + PendingRerollFingerprint: string; + ItemCount: number; + LastAdded: IOid; + }; + newRank: number; +} diff --git a/src/routes/api.ts b/src/routes/api.ts index d4a0ebe0..dc90ca45 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -1,5 +1,6 @@ import express from "express"; import { addFriendImageController } from "@/src/controllers/api/addFriendImageController"; +import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController"; import { artifactsController } from "../controllers/api/artifactsController"; import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController"; import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController"; @@ -101,6 +102,7 @@ apiRouter.get("/updateSession.php", updateSessionGetController); // post apiRouter.post("/addFriendImage.php", addFriendImageController); +apiRouter.post("/arcaneCommon.php", arcaneCommonController); apiRouter.post("/artifacts.php", artifactsController); apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/createGuild.php", createGuildController);