From 2ce5cc4562c3ff8f34f56719123bcc1511c3bf32 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 13 May 2025 20:39:03 -0700 Subject: [PATCH] fix: handle converted lich as crew member (#2071) saveLoadout was missing bigint support to properly store NemesisFingerprint, and crewMembers was missing handling for liches being set on-call (the only option available for them) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2071 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/controllers/api/crewMembersController.ts | 46 ++++++++++++++------ src/controllers/api/saveLoadoutController.ts | 3 +- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/controllers/api/crewMembersController.ts b/src/controllers/api/crewMembersController.ts index f19b5ff3..a4f2ea2a 100644 --- a/src/controllers/api/crewMembersController.ts +++ b/src/controllers/api/crewMembersController.ts @@ -1,4 +1,5 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { ICrewMemberClient } from "@/src/types/inventoryTypes/inventoryTypes"; @@ -7,23 +8,23 @@ import { Types } from "mongoose"; export const crewMembersController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); - const inventory = await getInventory(accountId, "CrewMembers"); + const inventory = await getInventory(accountId, "CrewMembers NemesisHistory"); const data = getJSONfromString(String(req.body)); - const dbCrewMember = inventory.CrewMembers.id(data.crewMember.ItemId.$oid)!; - dbCrewMember.AssignedRole = data.crewMember.AssignedRole; - dbCrewMember.SkillEfficiency = data.crewMember.SkillEfficiency; - dbCrewMember.WeaponConfigIdx = data.crewMember.WeaponConfigIdx; - dbCrewMember.WeaponId = new Types.ObjectId(data.crewMember.WeaponId.$oid); - dbCrewMember.Configs = data.crewMember.Configs; if (data.crewMember.SecondInCommand) { - for (const cm of inventory.CrewMembers) { - if (cm.SecondInCommand) { - cm.SecondInCommand = false; - break; - } - } + clearOnCall(inventory); + } + if (data.crewMember.ItemId.$oid == "000000000000000000000000") { + const convertedNemesis = inventory.NemesisHistory!.find(x => x.fp == data.crewMember.NemesisFingerprint)!; + convertedNemesis.SecondInCommand = data.crewMember.SecondInCommand; + } else { + const dbCrewMember = inventory.CrewMembers.id(data.crewMember.ItemId.$oid)!; + dbCrewMember.AssignedRole = data.crewMember.AssignedRole; + dbCrewMember.SkillEfficiency = data.crewMember.SkillEfficiency; + dbCrewMember.WeaponConfigIdx = data.crewMember.WeaponConfigIdx; + dbCrewMember.WeaponId = new Types.ObjectId(data.crewMember.WeaponId.$oid); + dbCrewMember.Configs = data.crewMember.Configs; + dbCrewMember.SecondInCommand = data.crewMember.SecondInCommand; } - dbCrewMember.SecondInCommand = data.crewMember.SecondInCommand; await inventory.save(); res.json({ crewMemberId: data.crewMember.ItemId.$oid, @@ -34,3 +35,20 @@ export const crewMembersController: RequestHandler = async (req, res) => { interface ICrewMembersRequest { crewMember: ICrewMemberClient; } + +const clearOnCall = (inventory: TInventoryDatabaseDocument): void => { + for (const cm of inventory.CrewMembers) { + if (cm.SecondInCommand) { + cm.SecondInCommand = false; + return; + } + } + if (inventory.NemesisHistory) { + for (const cm of inventory.NemesisHistory) { + if (cm.SecondInCommand) { + cm.SecondInCommand = false; + return; + } + } + } +}; diff --git a/src/controllers/api/saveLoadoutController.ts b/src/controllers/api/saveLoadoutController.ts index 6fd3de61..c5383e1c 100644 --- a/src/controllers/api/saveLoadoutController.ts +++ b/src/controllers/api/saveLoadoutController.ts @@ -2,11 +2,12 @@ import { RequestHandler } from "express"; import { ISaveLoadoutRequest } from "@/src/types/saveLoadoutTypes"; import { handleInventoryItemConfigChange } from "@/src/services/saveLoadoutService"; import { getAccountIdForRequest } from "@/src/services/loginService"; +import { getJSONfromString } from "@/src/helpers/stringHelpers"; export const saveLoadoutController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); - const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest; + const body: ISaveLoadoutRequest = getJSONfromString(String(req.body)); // console.log(util.inspect(body, { showHidden: false, depth: null, colors: true })); // eslint-disable-next-line @typescript-eslint/no-unused-vars