From 418ccbac19032f121eba8f4c6069ee5e80ddeef6 Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 18 Jun 2024 03:16:25 +0200 Subject: [PATCH 1/2] feat: implement helminth naming & archon shard installation --- .../api/infestedFoundryController.ts | 85 +++++++++++++++++++ src/models/inventoryModels/inventoryModel.ts | 26 ++++-- src/routes/api.ts | 2 + .../inventoryTypes/commonInventoryTypes.ts | 7 +- src/types/inventoryTypes/inventoryTypes.ts | 18 ++-- 5 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 src/controllers/api/infestedFoundryController.ts diff --git a/src/controllers/api/infestedFoundryController.ts b/src/controllers/api/infestedFoundryController.ts new file mode 100644 index 00000000..0126f9a0 --- /dev/null +++ b/src/controllers/api/infestedFoundryController.ts @@ -0,0 +1,85 @@ +import { RequestHandler } from "express"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { getInventory, addMiscItems } from "@/src/services/inventoryService"; +import { IOid } from "@/src/types/commonTypes"; + +export const infestedFoundryController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const payload = getJSONfromString(req.body.toString()); + switch (req.query.mode) { + case "s": { // shard installation + const request = payload as IShardInstallRequest; + const inventory = await getInventory(accountId); + const suit = inventory.Suits.find(suit => suit._id.toString() == request.SuitId.$oid)!; + if (!suit.ArchonCrystalUpgrades + || suit.ArchonCrystalUpgrades.length != 5 // we shouldn't have an array like this, but older inventories may disagree... + ) { + suit.ArchonCrystalUpgrades = [ {}, {}, {}, {}, {} ]; + } + suit.ArchonCrystalUpgrades[request.Slot] = { + UpgradeType: request.UpgradeType, + Color: request.Color + }; + const miscItemChanges = [ + { + ItemType: colorToShard[request.Color], + ItemCount: -1 + } + ]; + addMiscItems(inventory, miscItemChanges); + await inventory.save(); + res.json({ + InventoryChanges: { + MiscItems: miscItemChanges + } + }); + break; + } + + case "n": { // name the beast + const inventory = await getInventory(accountId); + inventory.InfestedFoundry ??= {}; + inventory.InfestedFoundry.Name = payload.newName as string; + await inventory.save(); + res.json({ + InventoryChanges: { + InfestedFoundry: { + Name: inventory.InfestedFoundry.Name + } + } + }); + break; + } + + case "o": // offerings update + // {"OfferingsIndex":540,"SuitTypes":["/Lotus/Powersuits/PaxDuviricus/PaxDuviricusBaseSuit","/Lotus/Powersuits/Nezha/NezhaBaseSuit","/Lotus/Powersuits/Devourer/DevourerBaseSuit"],"Extra":false} + res.status(404).end(); + break; + + default: + throw new Error(`unhandled infestedFoundry mode: ${req.query.mode}`); + } +}; + +interface IShardInstallRequest { + SuitId: IOid; + Slot: number; + UpgradeType: string; + Color: string; +} + +const colorToShard: Record = { + "ACC_RED": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar", + "ACC_RED_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic", + "ACC_YELLOW": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira", + "ACC_YELLOW_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic", + "ACC_BLUE": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal", + "ACC_BLUE_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic", + "ACC_GREEN": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen", + "ACC_GREEN_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic", + "ACC_ORANGE": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange", + "ACC_ORANGE_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic", + "ACC_PURPLE": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet", + "ACC_PURPLE_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic", +}; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 8a79f758..96c5f972 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -45,7 +45,8 @@ import { IOperatorConfigDatabase, IPolarity, IEquipmentDatabase, - IOperatorConfigClient + IOperatorConfigClient, + IArchonCrystalUpgrade } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; @@ -182,6 +183,17 @@ ItemConfigSchema.set("toJSON", { } }); +const ArchonCrystalUpgradeSchema = new Schema({ + UpgradeType: String, + Color: String +}, { _id: false }); + +ArchonCrystalUpgradeSchema.set("toJSON", { + transform(_document, returnedObject) { + delete returnedObject.__v; + } +}); + const EquipmentSchema = new Schema({ ItemType: String, Configs: [ItemConfigSchema], @@ -193,7 +205,7 @@ const EquipmentSchema = new Schema({ FocusLens: String, ModSlotPurchases: Number, CustomizationSlotPurchases: Number, - UpgradeType: Schema.Types.Mixed, //todo + UpgradeType: String, UpgradeFingerprint: String, ItemName: String, InfestationDate: Date, @@ -203,7 +215,7 @@ const EquipmentSchema = new Schema({ UnlockLevel: Number, Expiry: Date, SkillTree: String, - ArchonCrystalUpgrades: [Schema.Types.Mixed] //TODO + ArchonCrystalUpgrades: { type: [ArchonCrystalUpgradeSchema], default: undefined } }); EquipmentSchema.virtual("ItemId").get(function () { @@ -434,14 +446,14 @@ const consumedSchuitsSchema = new Schema({ const infestedFoundrySchema = new Schema({ Name: String, - Resources: [typeCountSchema], + Resources: { type: [typeCountSchema], default: undefined }, Slots: Number, XP: Number, - ConsumedSuits: [consumedSchuitsSchema], + ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined }, InvigorationIndex: Number, - InvigorationSuitOfferings: [String], + InvigorationSuitOfferings: { type: [String], default: undefined }, InvigorationsApplied: Number -}); +}, { _id: false }); const questProgressSchema = new Schema({ c: Number, diff --git a/src/routes/api.ts b/src/routes/api.ts index 2850b2dc..35eaaa43 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -25,6 +25,7 @@ import { hostSessionController } from "@/src/controllers/api/hostSessionControll import { hubController } from "@/src/controllers/api/hubController"; import { hubInstancesController } from "@/src/controllers/api/hubInstancesController"; import { inboxController } from "@/src/controllers/api/inboxController"; +import { infestedFoundryController } from "@/src/controllers/api/infestedFoundryController"; import { inventoryController } from "@/src/controllers/api/inventoryController"; import { inventorySlotsController } from "@/src/controllers/api/inventorySlotsController"; import { joinSessionController } from "@/src/controllers/api/joinSessionController"; @@ -101,6 +102,7 @@ apiRouter.post("/genericUpdate.php", genericUpdateController); apiRouter.post("/getAlliance.php", getAllianceController); apiRouter.post("/guildTech.php", guildTechController); apiRouter.post("/hostSession.php", hostSessionController); +apiRouter.post("/infestedFoundry.php", infestedFoundryController); apiRouter.post("/inventorySlots.php", inventorySlotsController); apiRouter.post("/joinSession.php", joinSessionController); apiRouter.post("/login.php", loginController); diff --git a/src/types/inventoryTypes/commonInventoryTypes.ts b/src/types/inventoryTypes/commonInventoryTypes.ts index 8596c6e4..aadc1b62 100644 --- a/src/types/inventoryTypes/commonInventoryTypes.ts +++ b/src/types/inventoryTypes/commonInventoryTypes.ts @@ -103,6 +103,11 @@ export interface IEquipmentDatabase { UnlockLevel?: number; Expiry?: IMongoDate; SkillTree?: string; - ArchonCrystalUpgrades?: []; //TODO + ArchonCrystalUpgrades?: IArchonCrystalUpgrade[]; _id: Types.ObjectId; } + +export interface IArchonCrystalUpgrade { + UpgradeType?: string; + Color?: string; +} diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index ec492353..1abd4cd8 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -232,7 +232,7 @@ export interface IInventoryResponse { DailyAffiliationEntrati: number; DailyAffiliationNecraloid: number; MechSuits: IEquipmentDatabase[]; - InfestedFoundry: IInfestedFoundry; + InfestedFoundry?: IInfestedFoundry; BlessingCooldown: IMongoDate; CrewShipHarnesses: IEquipmentDatabase[]; CrewShipRawSalvage: IConsumable[]; @@ -482,14 +482,14 @@ export interface IFusionTreasure { } export interface IInfestedFoundry { - Name: string; - Resources: ITypeCount[]; - Slots: number; - XP: number; - ConsumedSuits: IConsumedSuit[]; - InvigorationIndex: number; - InvigorationSuitOfferings: string[]; - InvigorationsApplied: number; + Name?: string; + Resources?: ITypeCount[]; + Slots?: number; + XP?: number; + ConsumedSuits?: IConsumedSuit[]; + InvigorationIndex?: number; + InvigorationSuitOfferings?: string[]; + InvigorationsApplied?: number; } export interface IConsumedSuit { -- 2.47.2 From dd0c221c514e1f6b8ffc9ebc5d1d8125086a0ebc Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 18 Jun 2024 01:19:35 +0000 Subject: [PATCH 2/2] Apply prettier changes --- .../api/infestedFoundryController.ts | 37 ++++++++++--------- src/models/inventoryModels/inventoryModel.ts | 34 ++++++++++------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/controllers/api/infestedFoundryController.ts b/src/controllers/api/infestedFoundryController.ts index 0126f9a0..26b98803 100644 --- a/src/controllers/api/infestedFoundryController.ts +++ b/src/controllers/api/infestedFoundryController.ts @@ -8,14 +8,16 @@ export const infestedFoundryController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const payload = getJSONfromString(req.body.toString()); switch (req.query.mode) { - case "s": { // shard installation + case "s": { + // shard installation const request = payload as IShardInstallRequest; const inventory = await getInventory(accountId); const suit = inventory.Suits.find(suit => suit._id.toString() == request.SuitId.$oid)!; - if (!suit.ArchonCrystalUpgrades - || suit.ArchonCrystalUpgrades.length != 5 // we shouldn't have an array like this, but older inventories may disagree... + if ( + !suit.ArchonCrystalUpgrades || + suit.ArchonCrystalUpgrades.length != 5 // we shouldn't have an array like this, but older inventories may disagree... ) { - suit.ArchonCrystalUpgrades = [ {}, {}, {}, {}, {} ]; + suit.ArchonCrystalUpgrades = [{}, {}, {}, {}, {}]; } suit.ArchonCrystalUpgrades[request.Slot] = { UpgradeType: request.UpgradeType, @@ -37,7 +39,8 @@ export const infestedFoundryController: RequestHandler = async (req, res) => { break; } - case "n": { // name the beast + case "n": { + // name the beast const inventory = await getInventory(accountId); inventory.InfestedFoundry ??= {}; inventory.InfestedFoundry.Name = payload.newName as string; @@ -70,16 +73,16 @@ interface IShardInstallRequest { } const colorToShard: Record = { - "ACC_RED": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar", - "ACC_RED_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic", - "ACC_YELLOW": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira", - "ACC_YELLOW_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic", - "ACC_BLUE": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal", - "ACC_BLUE_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic", - "ACC_GREEN": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen", - "ACC_GREEN_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic", - "ACC_ORANGE": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange", - "ACC_ORANGE_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic", - "ACC_PURPLE": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet", - "ACC_PURPLE_MYTHIC": "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic", + ACC_RED: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar", + ACC_RED_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic", + ACC_YELLOW: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira", + ACC_YELLOW_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic", + ACC_BLUE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal", + ACC_BLUE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic", + ACC_GREEN: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen", + ACC_GREEN_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic", + ACC_ORANGE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange", + ACC_ORANGE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic", + ACC_PURPLE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet", + ACC_PURPLE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic" }; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 96c5f972..90c4c844 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -183,10 +183,13 @@ ItemConfigSchema.set("toJSON", { } }); -const ArchonCrystalUpgradeSchema = new Schema({ - UpgradeType: String, - Color: String -}, { _id: false }); +const ArchonCrystalUpgradeSchema = new Schema( + { + UpgradeType: String, + Color: String + }, + { _id: false } +); ArchonCrystalUpgradeSchema.set("toJSON", { transform(_document, returnedObject) { @@ -444,16 +447,19 @@ const consumedSchuitsSchema = new Schema({ c: colorSchema }); -const infestedFoundrySchema = new Schema({ - Name: String, - Resources: { type: [typeCountSchema], default: undefined }, - Slots: Number, - XP: Number, - ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined }, - InvigorationIndex: Number, - InvigorationSuitOfferings: { type: [String], default: undefined }, - InvigorationsApplied: Number -}, { _id: false }); +const infestedFoundrySchema = new Schema( + { + Name: String, + Resources: { type: [typeCountSchema], default: undefined }, + Slots: Number, + XP: Number, + ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined }, + InvigorationIndex: Number, + InvigorationSuitOfferings: { type: [String], default: undefined }, + InvigorationsApplied: Number + }, + { _id: false } +); const questProgressSchema = new Schema({ c: Number, -- 2.47.2