From d1d221bb58af90b1f213d5431ae5c85dff713507 Mon Sep 17 00:00:00 2001 From: Sainan Date: Sun, 22 Dec 2024 23:28:44 +0100 Subject: [PATCH] feat: apply QuantityMultiplier for server-side vendor offers (#605) --- .../api/getVendorInfoController.ts | 140 +----------------- src/services/purchaseService.ts | 20 ++- src/services/serversideVendorsService.ts | 87 +++++++++++ 3 files changed, 110 insertions(+), 137 deletions(-) create mode 100644 src/services/serversideVendorsService.ts diff --git a/src/controllers/api/getVendorInfoController.ts b/src/controllers/api/getVendorInfoController.ts index e7d80ba5..b161176e 100644 --- a/src/controllers/api/getVendorInfoController.ts +++ b/src/controllers/api/getVendorInfoController.ts @@ -1,138 +1,14 @@ import { RequestHandler } from "express"; -import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json"; -import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json"; -import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json"; -import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json"; -import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json"; -import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json"; -import DeimosHivemindCommisionsManifestTokenVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestTokenVendor.json"; -import DeimosHivemindCommisionsManifestWeaponsmith from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestWeaponsmith.json"; -import DeimosHivemindTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosHivemindTokenVendorManifest.json"; -import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosPetVendorManifest.json"; -import DeimosProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosProspectorVendorManifest.json"; -import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json"; -import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json"; -import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json"; -import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsIronwakeDondaVendorManifest.json"; -import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json"; -import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json"; -import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json"; -import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json"; -import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json"; -import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json"; -import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json"; -import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json"; -import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json"; -import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json"; -import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVendorInfo/ZarimanCommisionsManifestArchimedean.json"; +import { getVendorManifestByTypeName } from "@/src/services/serversideVendorsService"; export const getVendorInfoController: RequestHandler = (req, res) => { - switch (req.query.vendor as string) { - case "/Lotus/Types/Game/VendorManifests/Ostron/FishmongerVendorManifest": - res.json(OstronFishmongerVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Ostron/ProspectorVendorManifest": - res.json(OstronProspectorVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Ostron/PetVendorManifest": - res.json(OstronPetVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Ostron/MaskSalesmanManifest": - res.json(MaskSalesmanManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Solaris/FishmongerVendorManifest": - res.json(SolarisFishmongerVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Solaris/ProspectorVendorManifest": - res.json(SolarisProspectorVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorManifest": - res.json(SolarisDebtTokenVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorRepossessionsManifest": - res.json(SolarisDebtTokenVendorRepossessionsManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest": - res.json(HubsPerrinSequenceWeaponVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest": - res.json(HubsRailjackCrewMemberVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestWeaponsmith": - res.json(DeimosHivemindCommisionsManifestWeaponsmith); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestFishmonger": - res.json(DeimosHivemindCommisionsManifestFishmonger); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/FishmongerVendorManifest": - res.json(DeimosFishmongerVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestProspector": - res.json(DeimosHivemindCommisionsManifestProspector); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/ProspectorVendorManifest": - res.json(DeimosProspectorVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestPetVendor": - res.json(DeimosHivemindCommisionsManifestPetVendor); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/PetVendorManifest": - res.json(DeimosPetVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindCommisionsManifestTokenVendor": - res.json(DeimosHivemindCommisionsManifestTokenVendor); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/EntratiFragmentVendorProductsManifest": - res.json(DeimosEntratiFragmentVendorProductsManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Deimos/HivemindTokenVendorManifest": - res.json(DeimosHivemindTokenVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest": - res.json(HubsIronwakeDondaVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Zariman/ArchimedeanVendorManifest": - res.json(ArchimedeanVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Duviri/AcrithisVendorManifest": - res.json(DuviriAcrithisVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/Zariman/ZarimanCommisionsManifestArchimedean": - res.json(ZarimanCommisionsManifestArchimedean); - break; - - case "/Lotus/Types/Game/VendorManifests/EntratiLabs/EntratiLabVendorManifest": - res.json(EntratiLabsEntratiLabVendorManifest); - break; - - case "/Lotus/Types/Game/VendorManifests/EntratiLabs/EntratiLabsCommisionsManifest": - res.json(EntratiLabsEntratiLabsCommisionsManifest); - break; - - default: + if (typeof req.query.vendor == "string") { + const manifest = getVendorManifestByTypeName(req.query.vendor); + if (!manifest) { throw new Error(`Unknown vendor: ${req.query.vendor}`); + } + res.json(manifest); + } else { + res.status(400).end(); } }; diff --git a/src/services/purchaseService.ts b/src/services/purchaseService.ts index 19d6b5b8..fb05d9c2 100644 --- a/src/services/purchaseService.ts +++ b/src/services/purchaseService.ts @@ -9,6 +9,7 @@ import { updateCurrency, updateSlots } from "@/src/services/inventoryService"; +import { getVendorManifestByOid } from "@/src/services/serversideVendorsService"; import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import { IPurchaseRequest, SlotPurchase, IInventoryChanges } from "@/src/types/purchaseTypes"; import { logger } from "@/src/utils/logger"; @@ -32,6 +33,18 @@ export const getStoreItemTypesCategory = (typesItem: string) => { export const handlePurchase = async (purchaseRequest: IPurchaseRequest, accountId: string) => { logger.debug("purchase request", purchaseRequest); + if (purchaseRequest.PurchaseParams.Source == 7) { + const manifest = getVendorManifestByOid(purchaseRequest.PurchaseParams.SourceId!); + if (manifest) { + const offer = manifest.VendorInfo.ItemManifest.find( + x => x.StoreItem == purchaseRequest.PurchaseParams.StoreItem + ); + if (offer) { + purchaseRequest.PurchaseParams.Quantity *= offer.QuantityMultiplier; + } + } + } + const purchaseResponse = await handleStoreItemAcquisition( purchaseRequest.PurchaseParams.StoreItem, accountId, @@ -53,11 +66,8 @@ export const handlePurchase = async (purchaseRequest: IPurchaseRequest, accountI switch (purchaseRequest.PurchaseParams.Source) { case 7: - if (!purchaseRequest.PurchaseParams.SourceId) { - throw new Error("invalid request source"); - } - if (ExportVendors[purchaseRequest.PurchaseParams.SourceId]) { - const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId]; + if (purchaseRequest.PurchaseParams.SourceId! in ExportVendors) { + const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId!]; const offer = vendor.items.find(x => x.storeItem == purchaseRequest.PurchaseParams.StoreItem); if (offer) { const inventory = await getInventory(accountId); diff --git a/src/services/serversideVendorsService.ts b/src/services/serversideVendorsService.ts new file mode 100644 index 00000000..0b61caa4 --- /dev/null +++ b/src/services/serversideVendorsService.ts @@ -0,0 +1,87 @@ +import { IOid } from "@/src/types/commonTypes"; + +import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json"; +import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json"; +import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json"; +import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json"; +import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json"; +import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json"; +import DeimosHivemindCommisionsManifestTokenVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestTokenVendor.json"; +import DeimosHivemindCommisionsManifestWeaponsmith from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestWeaponsmith.json"; +import DeimosHivemindTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosHivemindTokenVendorManifest.json"; +import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosPetVendorManifest.json"; +import DeimosProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosProspectorVendorManifest.json"; +import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json"; +import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json"; +import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json"; +import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsIronwakeDondaVendorManifest.json"; +import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json"; +import HubsPerrinSequenceWeaponVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsPerrinSequenceWeaponVendorManifest.json"; +import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json"; +import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json"; +import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json"; +import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json"; +import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json"; +import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json"; +import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json"; +import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json"; +import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVendorInfo/ZarimanCommisionsManifestArchimedean.json"; + +interface IVendorManifest { + VendorInfo: { + _id: IOid; + TypeName: string; + ItemManifest: { + StoreItem: string; + QuantityMultiplier: number; + // has a few more fields but we don't care about those right now + }[]; + }; +} + +const vendorManifests: IVendorManifest[] = [ + ArchimedeanVendorManifest, + DeimosEntratiFragmentVendorProductsManifest, + DeimosFishmongerVendorManifest, + DeimosHivemindCommisionsManifestFishmonger, + DeimosHivemindCommisionsManifestPetVendor, + DeimosHivemindCommisionsManifestProspector, + DeimosHivemindCommisionsManifestTokenVendor, + DeimosHivemindCommisionsManifestWeaponsmith, + DeimosHivemindTokenVendorManifest, + DeimosPetVendorManifest, + DeimosProspectorVendorManifest, + DuviriAcrithisVendorManifest, + EntratiLabsEntratiLabsCommisionsManifest, + EntratiLabsEntratiLabVendorManifest, + HubsIronwakeDondaVendorManifest, + HubsRailjackCrewMemberVendorManifest, + HubsPerrinSequenceWeaponVendorManifest, + MaskSalesmanManifest, + OstronFishmongerVendorManifest, + OstronProspectorVendorManifest, + OstronPetVendorManifest, + SolarisFishmongerVendorManifest, + SolarisProspectorVendorManifest, + SolarisDebtTokenVendorManifest, + SolarisDebtTokenVendorRepossessionsManifest, + ZarimanCommisionsManifestArchimedean +]; + +export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => { + for (const vendorManifest of vendorManifests) { + if (vendorManifest.VendorInfo.TypeName == typeName) { + return vendorManifest; + } + } + return undefined; +}; + +export const getVendorManifestByOid = (oid: string): IVendorManifest | undefined => { + for (const vendorManifest of vendorManifests) { + if (vendorManifest.VendorInfo._id.$oid == oid) { + return vendorManifest; + } + } + return undefined; +};