forked from OpenWF/SpaceNinjaServer
		
	feat: more comprehensive handling of railjack items in sellController (#1687)
Closes #1675 Reviewed-on: OpenWF/SpaceNinjaServer#1687 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									66e34b7be9
								
							
						
					
					
						commit
						8a1603a661
					
				@ -7,16 +7,18 @@ import {
 | 
				
			|||||||
    addMiscItems,
 | 
					    addMiscItems,
 | 
				
			||||||
    addConsumables,
 | 
					    addConsumables,
 | 
				
			||||||
    freeUpSlot,
 | 
					    freeUpSlot,
 | 
				
			||||||
    combineInventoryChanges
 | 
					    combineInventoryChanges,
 | 
				
			||||||
 | 
					    addCrewShipRawSalvage
 | 
				
			||||||
} from "@/src/services/inventoryService";
 | 
					} from "@/src/services/inventoryService";
 | 
				
			||||||
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { ExportDojoRecipes } from "warframe-public-export-plus";
 | 
					import { ExportDojoRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
				
			||||||
 | 
					import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const sellController: RequestHandler = async (req, res) => {
 | 
					export const sellController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const payload = JSON.parse(String(req.body)) as ISellRequest;
 | 
					    const payload = JSON.parse(String(req.body)) as ISellRequest;
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
    const requiredFields = new Set();
 | 
					    const requiredFields = new Set<keyof TInventoryDatabaseDocument>();
 | 
				
			||||||
    if (payload.SellCurrency == "SC_RegularCredits") {
 | 
					    if (payload.SellCurrency == "SC_RegularCredits") {
 | 
				
			||||||
        requiredFields.add("RegularCredits");
 | 
					        requiredFields.add("RegularCredits");
 | 
				
			||||||
    } else if (payload.SellCurrency == "SC_FusionPoints") {
 | 
					    } else if (payload.SellCurrency == "SC_FusionPoints") {
 | 
				
			||||||
@ -25,7 +27,7 @@ export const sellController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        requiredFields.add("MiscItems");
 | 
					        requiredFields.add("MiscItems");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    for (const key of Object.keys(payload.Items)) {
 | 
					    for (const key of Object.keys(payload.Items)) {
 | 
				
			||||||
        requiredFields.add(key);
 | 
					        requiredFields.add(key as keyof TInventoryDatabaseDocument);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (requiredFields.has("Upgrades")) {
 | 
					    if (requiredFields.has("Upgrades")) {
 | 
				
			||||||
        requiredFields.add("RawUpgrades");
 | 
					        requiredFields.add("RawUpgrades");
 | 
				
			||||||
@ -51,8 +53,15 @@ export const sellController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    if (payload.Items.Hoverboards) {
 | 
					    if (payload.Items.Hoverboards) {
 | 
				
			||||||
        requiredFields.add(InventorySlot.SPACESUITS);
 | 
					        requiredFields.add(InventorySlot.SPACESUITS);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.CrewShipWeapons) {
 | 
					    if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
 | 
				
			||||||
        requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
 | 
					        requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
 | 
				
			||||||
 | 
					        requiredFields.add("CrewShipRawSalvage");
 | 
				
			||||||
 | 
					        if (payload.Items.CrewShipWeapons) {
 | 
				
			||||||
 | 
					            requiredFields.add("CrewShipSalvagedWeapons");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (payload.Items.CrewShipWeaponSkins) {
 | 
				
			||||||
 | 
					            requiredFields.add("CrewShipSalvagedWeaponSkins");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
 | 
					    const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -76,7 +85,7 @@ export const sellController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
    } else if (payload.SellCurrency == "SC_Resources") {
 | 
					    } else if (payload.SellCurrency == "SC_Resources") {
 | 
				
			||||||
        // Will add appropriate MiscItems from CrewShipWeapons
 | 
					        // Will add appropriate MiscItems from CrewShipWeapons or CrewShipWeaponSkins
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        throw new Error("Unknown SellCurrency: " + payload.SellCurrency);
 | 
					        throw new Error("Unknown SellCurrency: " + payload.SellCurrency);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -157,19 +166,51 @@ export const sellController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.CrewShipWeapons) {
 | 
					    if (payload.Items.CrewShipWeapons) {
 | 
				
			||||||
        payload.Items.CrewShipWeapons.forEach(sellItem => {
 | 
					        payload.Items.CrewShipWeapons.forEach(sellItem => {
 | 
				
			||||||
            const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
 | 
					            if (sellItem.String[0] == "/") {
 | 
				
			||||||
            if (index != -1) {
 | 
					                addCrewShipRawSalvage(inventory, [
 | 
				
			||||||
                const itemType = inventory.CrewShipWeapons[index].ItemType;
 | 
					                    {
 | 
				
			||||||
                const recipe = Object.values(ExportDojoRecipes.fabrications).find(x => x.resultType == itemType)!;
 | 
					                        ItemType: sellItem.String,
 | 
				
			||||||
                const miscItemChanges = recipe.ingredients.map(x => ({
 | 
					                        ItemCount: sellItem.Count * -1
 | 
				
			||||||
                    ItemType: x.ItemType,
 | 
					                    }
 | 
				
			||||||
                    ItemCount: Math.trunc(x.ItemCount * 0.8)
 | 
					                ]);
 | 
				
			||||||
                }));
 | 
					            } else {
 | 
				
			||||||
                addMiscItems(inventory, miscItemChanges);
 | 
					                const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
 | 
				
			||||||
                combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
 | 
					                if (index != -1) {
 | 
				
			||||||
 | 
					                    if (payload.SellCurrency == "SC_Resources") {
 | 
				
			||||||
                inventory.CrewShipWeapons.splice(index, 1);
 | 
					                        refundPartialBuildCosts(inventory, inventory.CrewShipWeapons[index].ItemType, inventoryChanges);
 | 
				
			||||||
                freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
 | 
					                    }
 | 
				
			||||||
 | 
					                    inventory.CrewShipWeapons.splice(index, 1);
 | 
				
			||||||
 | 
					                    freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (payload.Items.CrewShipWeaponSkins) {
 | 
				
			||||||
 | 
					        payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
 | 
				
			||||||
 | 
					            if (sellItem.String[0] == "/") {
 | 
				
			||||||
 | 
					                addCrewShipRawSalvage(inventory, [
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        ItemType: sellItem.String,
 | 
				
			||||||
 | 
					                        ItemCount: sellItem.Count * -1
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                ]);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
 | 
				
			||||||
 | 
					                if (index != -1) {
 | 
				
			||||||
 | 
					                    if (payload.SellCurrency == "SC_Resources") {
 | 
				
			||||||
 | 
					                        refundPartialBuildCosts(
 | 
				
			||||||
 | 
					                            inventory,
 | 
				
			||||||
 | 
					                            inventory.CrewShipWeaponSkins[index].ItemType,
 | 
				
			||||||
 | 
					                            inventoryChanges
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    inventory.CrewShipWeaponSkins.splice(index, 1);
 | 
				
			||||||
 | 
					                    freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -243,6 +284,7 @@ interface ISellRequest {
 | 
				
			|||||||
        Hoverboards?: ISellItem[];
 | 
					        Hoverboards?: ISellItem[];
 | 
				
			||||||
        Drones?: ISellItem[];
 | 
					        Drones?: ISellItem[];
 | 
				
			||||||
        CrewShipWeapons?: ISellItem[];
 | 
					        CrewShipWeapons?: ISellItem[];
 | 
				
			||||||
 | 
					        CrewShipWeaponSkins?: ISellItem[];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    SellPrice: number;
 | 
					    SellPrice: number;
 | 
				
			||||||
    SellCurrency:
 | 
					    SellCurrency:
 | 
				
			||||||
@ -259,3 +301,33 @@ interface ISellItem {
 | 
				
			|||||||
    String: string; // oid or uniqueName
 | 
					    String: string; // oid or uniqueName
 | 
				
			||||||
    Count: number;
 | 
					    Count: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const refundPartialBuildCosts = (
 | 
				
			||||||
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
 | 
					    itemType: string,
 | 
				
			||||||
 | 
					    inventoryChanges: IInventoryChanges
 | 
				
			||||||
 | 
					): void => {
 | 
				
			||||||
 | 
					    // House versions
 | 
				
			||||||
 | 
					    const research = Object.values(ExportDojoRecipes.research).find(x => x.resultType == itemType);
 | 
				
			||||||
 | 
					    if (research) {
 | 
				
			||||||
 | 
					        const miscItemChanges = research.ingredients.map(x => ({
 | 
				
			||||||
 | 
					            ItemType: x.ItemType,
 | 
				
			||||||
 | 
					            ItemCount: Math.trunc(x.ItemCount * 0.8)
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
 | 
					        addMiscItems(inventory, miscItemChanges);
 | 
				
			||||||
 | 
					        combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Sigma versions
 | 
				
			||||||
 | 
					    const recipe = Object.values(ExportDojoRecipes.fabrications).find(x => x.resultType == itemType);
 | 
				
			||||||
 | 
					    if (recipe) {
 | 
				
			||||||
 | 
					        const miscItemChanges = recipe.ingredients.map(x => ({
 | 
				
			||||||
 | 
					            ItemType: x.ItemType,
 | 
				
			||||||
 | 
					            ItemCount: Math.trunc(x.ItemCount * 0.8)
 | 
				
			||||||
 | 
					        }));
 | 
				
			||||||
 | 
					        addMiscItems(inventory, miscItemChanges);
 | 
				
			||||||
 | 
					        combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user