From ae7c3728277f2c208c17e806f682bd117ec7384c Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Tue, 7 Oct 2025 08:18:58 +0200 Subject: [PATCH] feat: nemeis mode t / LastNemesisAllySpawnTime --- src/controllers/api/nemesisController.ts | 19 ++++++++++++- src/models/inventoryModels/inventoryModel.ts | 5 +++- src/services/importService.ts | 28 ++++++++++++++++++-- src/types/inventoryTypes/inventoryTypes.ts | 4 ++- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/controllers/api/nemesisController.ts b/src/controllers/api/nemesisController.ts index 2388d0a7..5e058810 100644 --- a/src/controllers/api/nemesisController.ts +++ b/src/controllers/api/nemesisController.ts @@ -1,4 +1,4 @@ -import { fromDbOid, version_compare } from "../../helpers/inventoryHelpers.ts"; +import { fromDbOid, toMongoDate, version_compare } from "../../helpers/inventoryHelpers.ts"; import type { IKnifeResponse } from "../../helpers/nemesisHelpers.ts"; import { antivirusMods, @@ -310,6 +310,15 @@ export const nemesisController: RequestHandler = async (req, res) => { res.json({ target: inventory.toJSON().Nemesis }); + } else if ((req.query.mode as string) == "t") { + const inventory = await getInventory(account._id.toString(), "NemesisHistory"); + //const body = getJSONfromString(String(req.body)); + const now = new Date(Math.trunc(Date.now() / 1000) * 1000); + inventory.LastNemesisAllySpawnTime = now; + await inventory.save(); + res.json({ + NewTime: toMongoDate(now) + } satisfies IUpdateAllySpawnTimeResponse); } else if ((req.query.mode as string) == "d") { const inventory = await getInventory(account._id.toString(), "NemesisHistory"); const body = getJSONfromString(String(req.body)); @@ -462,3 +471,11 @@ const consumeModCharge = ( interface IRelinquishAdversariesRequest { nemesisFingerprints: (bigint | number)[]; } + +// interface IUpdateAllySpawnTimeRequest { +// LastSpawnTime: IMongoDate; +// } + +interface IUpdateAllySpawnTimeResponse { + NewTime: IMongoDate; +} diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 58c57b93..78b0effe 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -1743,7 +1743,7 @@ const inventorySchema = new Schema( NemesisAbandonedRewards: { type: [String], default: [] }, Nemesis: nemesisSchema, NemesisHistory: { type: [nemesisSchema], default: undefined }, - //LastNemesisAllySpawnTime: Schema.Types.Mixed, + LastNemesisAllySpawnTime: { type: Date, default: undefined }, //TradingRulesConfirmed,ShowFriendInvNotifications(Option->Social) Settings: settingsSchema, @@ -1864,6 +1864,9 @@ inventorySchema.set("toJSON", { if (inventoryDatabase.BlessingCooldown) { inventoryResponse.BlessingCooldown = toMongoDate(inventoryDatabase.BlessingCooldown); } + if (inventoryDatabase.LastNemesisAllySpawnTime) { + inventoryResponse.LastNemesisAllySpawnTime = toMongoDate(inventoryDatabase.LastNemesisAllySpawnTime); + } if (inventoryDatabase.NextRefill) { inventoryResponse.NextRefill = toMongoDate(inventoryDatabase.NextRefill); } diff --git a/src/services/importService.ts b/src/services/importService.ts index e137396b..5b57f43a 100644 --- a/src/services/importService.ts +++ b/src/services/importService.ts @@ -73,6 +73,7 @@ import type { ITailorShop, ITailorShopDatabase } from "../types/personalRoomsTypes.ts"; +import { fromMongoDate } from "../helpers/inventoryHelpers.ts"; const convertDate = (value: IMongoDate): Date => { return new Date(parseInt(value.$date.$numberLong)); @@ -326,7 +327,14 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial< "GiftsRemaining", "ChallengesFixVersion", "Founder", - "Guide" + "Guide", + "EntratiVaultCountLastPeriod", + "EntratiLabConquestUnlocked", + "EntratiLabConquestHardModeStatus", + "EntratiLabConquestCacheScoreMission", + "EchoesHexConquestUnlocked", + "EchoesHexConquestHardModeStatus", + "EchoesHexConquestCacheScoreMission" ] as const) { if (client[key] !== undefined) { db[key] = client[key]; @@ -354,12 +362,28 @@ export const importInventory = (db: TInventoryDatabaseDocument, client: Partial< "NodeIntrosCompleted", "DeathMarks", "Wishlist", - "NemesisAbandonedRewards" + "NemesisAbandonedRewards", + "EntratiLabConquestActiveFrameVariants", + "EchoesHexConquestActiveFrameVariants", + "EchoesHexConquestActiveStickers" ] as const) { if (client[key] !== undefined) { db[key] = client[key]; } } + // IMongoDate + for (const key of [ + "Created", + "TrainingDate", + "BlessingCooldown", + "LastNemesisAllySpawnTime", + "NextRefill", + "EntratiVaultCountResetDate" + ] as const) { + if (client[key] !== undefined) { + db[key] = fromMongoDate(client[key]); + } + } // IRewardAtten[] for (const key of ["SortieRewardAttenuation", "SpecialItemRewardAttenuation"] as const) { if (client[key] !== undefined) { diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 83d00c1d..99be7dd2 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -92,6 +92,7 @@ export interface IInventoryDatabase | "NextRefill" | "Nemesis" | "NemesisHistory" + | "LastNemesisAllySpawnTime" | "EntratiVaultCountResetDate" | "BrandedSuits" | "LockedWeaponGroup" @@ -136,6 +137,7 @@ export interface IInventoryDatabase NextRefill?: Date; Nemesis?: INemesisDatabase; NemesisHistory?: INemesisBaseDatabase[]; + LastNemesisAllySpawnTime?: Date; EntratiVaultCountResetDate?: Date; BrandedSuits?: Types.ObjectId[]; LockedWeaponGroup?: ILockedWeaponGroupDatabase; @@ -372,7 +374,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu //InvasionChainProgress: IInvasionChainProgress[]; Nemesis?: INemesisClient; NemesisHistory?: INemesisBaseClient[]; - //LastNemesisAllySpawnTime?: IMongoDate; + LastNemesisAllySpawnTime?: IMongoDate; Settings?: ISettings; PersonalTechProjects: IPersonalTechProjectClient[]; PlayerSkills: IPlayerSkills;