forked from OpenWF/SpaceNinjaServer
Reviewed-on: OpenWF/SpaceNinjaServer#2694 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
77 lines
2.8 KiB
TypeScript
77 lines
2.8 KiB
TypeScript
import type { RequestHandler } from "express";
|
|
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
|
|
import { getAccountIdForRequest } from "../../services/loginService.ts";
|
|
import { getInventory, addMods } from "../../services/inventoryService.ts";
|
|
import type { IOid } from "../../types/commonTypes.ts";
|
|
|
|
export const arcaneCommonController: RequestHandler = async (req, res) => {
|
|
const accountId = await getAccountIdForRequest(req);
|
|
const json = getJSONfromString<IArcaneCommonRequest>(String(req.body));
|
|
const inventory = await getInventory(accountId);
|
|
const upgrade = inventory.Upgrades.id(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) as { lvl: number }).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) as { lvl: number }).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;
|
|
}
|