fix: handle bundles being given to addItems (#1005)

This is needed for the Hex noggles email attachment

Reviewed-on: OpenWF/SpaceNinjaServer#1005
Co-authored-by: Sainan <sainan@calamity.inc>
Co-committed-by: Sainan <sainan@calamity.inc>
This commit is contained in:
Sainan 2025-02-25 04:38:17 -08:00 committed by OrdisPrime
parent 4d9e6a35ab
commit f672f05db9
2 changed files with 33 additions and 16 deletions

View File

@ -38,6 +38,7 @@ import { getExalted, getKeyChainItems } from "@/src/services/itemDataService";
import { IEquipmentClient, IEquipmentDatabase, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes"; import { IEquipmentClient, IEquipmentDatabase, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes";
import { import {
ExportArcanes, ExportArcanes,
ExportBundles,
ExportCustoms, ExportCustoms,
ExportDrones, ExportDrones,
ExportFlavour, ExportFlavour,
@ -59,6 +60,7 @@ import { toOid } from "../helpers/inventoryHelpers";
import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedController"; import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedController";
import { addStartingGear } from "@/src/controllers/api/giveStartingGearController"; import { addStartingGear } from "@/src/controllers/api/giveStartingGearController";
import { addQuestKey, completeQuest } from "@/src/services/questService"; import { addQuestKey, completeQuest } from "@/src/services/questService";
import { handleBundleAcqusition } from "./purchaseService";
export const createInventory = async ( export const createInventory = async (
accountOwnerId: Types.ObjectId, accountOwnerId: Types.ObjectId,
@ -157,6 +159,11 @@ export const addItem = async (
typeName: string, typeName: string,
quantity: number = 1 quantity: number = 1
): Promise<{ InventoryChanges: IInventoryChanges }> => { ): Promise<{ InventoryChanges: IInventoryChanges }> => {
// Bundles are technically StoreItems but a) they don't have a normal counterpart, and b) they are used in non-StoreItem contexts, e.g. email attachments.
if (typeName in ExportBundles) {
return { InventoryChanges: await handleBundleAcqusition(typeName, inventory, quantity) };
}
// Strict typing // Strict typing
if (typeName in ExportRecipes) { if (typeName in ExportRecipes) {
const recipeChanges = [ const recipeChanges = [

View File

@ -200,6 +200,31 @@ const handleItemPrices = (
} }
}; };
export const handleBundleAcqusition = async (
storeItemName: string,
inventory: TInventoryDatabaseDocument,
quantity: number = 1,
inventoryChanges: IInventoryChanges = {}
): Promise<IInventoryChanges> => {
const bundle = ExportBundles[storeItemName];
logger.debug("acquiring bundle", bundle);
for (const component of bundle.components) {
combineInventoryChanges(
inventoryChanges,
(
await handleStoreItemAcquisition(
component.typeName,
inventory,
component.purchaseQuantity * quantity,
component.durability,
true
)
).InventoryChanges
);
}
return inventoryChanges;
};
export const handleStoreItemAcquisition = async ( export const handleStoreItemAcquisition = async (
storeItemName: string, storeItemName: string,
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
@ -212,22 +237,7 @@ export const handleStoreItemAcquisition = async (
}; };
logger.debug(`handling acquision of ${storeItemName}`); logger.debug(`handling acquision of ${storeItemName}`);
if (storeItemName in ExportBundles) { if (storeItemName in ExportBundles) {
const bundle = ExportBundles[storeItemName]; await handleBundleAcqusition(storeItemName, inventory, quantity, purchaseResponse.InventoryChanges);
logger.debug("acquiring bundle", bundle);
for (const component of bundle.components) {
combineInventoryChanges(
purchaseResponse.InventoryChanges,
(
await handleStoreItemAcquisition(
component.typeName,
inventory,
component.purchaseQuantity * quantity,
component.durability,
true
)
).InventoryChanges
);
}
} else { } else {
const storeCategory = getStoreItemCategory(storeItemName); const storeCategory = getStoreItemCategory(storeItemName);
const internalName = storeItemName.replace("/StoreItems", ""); const internalName = storeItemName.replace("/StoreItems", "");