forked from OpenWF/SpaceNinjaServer
		
	feat: subsuming warframes (#686)
This commit is contained in:
		
							parent
							
								
									ff4b1e5c29
								
							
						
					
					
						commit
						f1c0c5a429
					
				@ -1,10 +1,17 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import { getInventory, addMiscItems } from "@/src/services/inventoryService";
 | 
					import { getInventory, addMiscItems, updateCurrency, addRecipes } from "@/src/services/inventoryService";
 | 
				
			||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import { IOid } from "@/src/types/commonTypes";
 | 
				
			||||||
import { IInfestedFoundry, IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import {
 | 
				
			||||||
import { ExportMisc } from "warframe-public-export-plus";
 | 
					    IConsumedSuit,
 | 
				
			||||||
 | 
					    IInfestedFoundry,
 | 
				
			||||||
 | 
					    IInventoryDatabaseDocument,
 | 
				
			||||||
 | 
					    IMiscItem,
 | 
				
			||||||
 | 
					    ITypeCount
 | 
				
			||||||
 | 
					} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
 | 
					import { ExportMisc, ExportRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { getRecipe } from "@/src/services/itemDataService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
					export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
@ -110,6 +117,67 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            res.status(404).end();
 | 
					            res.status(404).end();
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case "a": {
 | 
				
			||||||
 | 
					            // subsume warframe
 | 
				
			||||||
 | 
					            const request = getJSONfromString(String(req.body)) as IHelminthSubsumeRequest;
 | 
				
			||||||
 | 
					            const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					            const recipe = getRecipe(request.Recipe)!;
 | 
				
			||||||
 | 
					            for (const ingredient of recipe.secretIngredients!) {
 | 
				
			||||||
 | 
					                const resource = inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType);
 | 
				
			||||||
 | 
					                if (resource) {
 | 
				
			||||||
 | 
					                    resource.Count -= ingredient.ItemCount;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            const suit = inventory.Suits.find(x => x._id.toString() == request.SuitId.$oid)!;
 | 
				
			||||||
 | 
					            inventory.Suits.pull(suit);
 | 
				
			||||||
 | 
					            const consumedSuit: IConsumedSuit = { s: suit.ItemType };
 | 
				
			||||||
 | 
					            if (suit.Configs && suit.Configs[0] && suit.Configs[0].pricol) {
 | 
				
			||||||
 | 
					                consumedSuit.c = suit.Configs[0].pricol;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            inventory.InfestedFoundry!.Slots!--;
 | 
				
			||||||
 | 
					            inventory.InfestedFoundry!.ConsumedSuits ??= [];
 | 
				
			||||||
 | 
					            inventory.InfestedFoundry!.ConsumedSuits?.push(consumedSuit);
 | 
				
			||||||
 | 
					            inventory.InfestedFoundry!.LastConsumedSuit = suit;
 | 
				
			||||||
 | 
					            inventory.InfestedFoundry!.AbilityOverrideUnlockCooldown = new Date(
 | 
				
			||||||
 | 
					                new Date().getTime() + 24 * 60 * 60 * 1000
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            addInfestedFoundryXP(inventory.InfestedFoundry!, 1600_00);
 | 
				
			||||||
 | 
					            await inventory.save();
 | 
				
			||||||
 | 
					            console.log(inventory.toJSON().InfestedFoundry);
 | 
				
			||||||
 | 
					            res.json({
 | 
				
			||||||
 | 
					                InventoryChanges: {
 | 
				
			||||||
 | 
					                    RemovedIdItems: [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            ItemId: request.SuitId
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                    SuitBin: {
 | 
				
			||||||
 | 
					                        count: -1,
 | 
				
			||||||
 | 
					                        platinum: 0,
 | 
				
			||||||
 | 
					                        Slots: 1
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    InfestedFoundry: inventory.toJSON().InfestedFoundry
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case "r": {
 | 
				
			||||||
 | 
					            // rush subsume
 | 
				
			||||||
 | 
					            const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					            const currencyChanges = updateCurrency(inventory, 50, true);
 | 
				
			||||||
 | 
					            const recipeChanges = handleSubsumeCompletion(inventory);
 | 
				
			||||||
 | 
					            await inventory.save();
 | 
				
			||||||
 | 
					            res.json({
 | 
				
			||||||
 | 
					                InventoryChanges: {
 | 
				
			||||||
 | 
					                    ...currencyChanges,
 | 
				
			||||||
 | 
					                    Recipes: recipeChanges,
 | 
				
			||||||
 | 
					                    InfestedFoundry: inventory.toJSON().InfestedFoundry
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            throw new Error(`unhandled infestedFoundry mode: ${String(req.query.mode)}`);
 | 
					            throw new Error(`unhandled infestedFoundry mode: ${String(req.query.mode)}`);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -165,3 +233,26 @@ const addInfestedFoundryXP = (infestedFoundry: IInfestedFoundry, delta: number):
 | 
				
			|||||||
        infestedFoundry.Slots += 20;
 | 
					        infestedFoundry.Slots += 20;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IHelminthSubsumeRequest {
 | 
				
			||||||
 | 
					    SuitId: IOid;
 | 
				
			||||||
 | 
					    Recipe: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const handleSubsumeCompletion = (inventory: IInventoryDatabaseDocument): ITypeCount[] => {
 | 
				
			||||||
 | 
					    const [recipeType] = Object.entries(ExportRecipes).find(
 | 
				
			||||||
 | 
					        ([_recipeType, recipe]) =>
 | 
				
			||||||
 | 
					            recipe.secretIngredientAction == "SIA_WARFRAME_ABILITY" &&
 | 
				
			||||||
 | 
					            recipe.secretIngredients![0].ItemType == inventory.InfestedFoundry!.LastConsumedSuit!.ItemType
 | 
				
			||||||
 | 
					    )!;
 | 
				
			||||||
 | 
					    inventory.InfestedFoundry!.LastConsumedSuit = undefined;
 | 
				
			||||||
 | 
					    inventory.InfestedFoundry!.AbilityOverrideUnlockCooldown = undefined;
 | 
				
			||||||
 | 
					    const recipeChanges: ITypeCount[] = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ItemType: recipeType,
 | 
				
			||||||
 | 
					            ItemCount: 1
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					    addRecipes(inventory, recipeChanges);
 | 
				
			||||||
 | 
					    return recipeChanges;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@ import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
 | 
				
			|||||||
import { config } from "@/src/services/configService";
 | 
					import { config } from "@/src/services/configService";
 | 
				
			||||||
import allDialogue from "@/static/fixed_responses/allDialogue.json";
 | 
					import allDialogue from "@/static/fixed_responses/allDialogue.json";
 | 
				
			||||||
import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
 | 
					import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
 | 
				
			||||||
import { IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import { IInventoryDatabaseDocument, IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { IPolarity, ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
 | 
					import { IPolarity, ArtifactPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    ExportCustoms,
 | 
					    ExportCustoms,
 | 
				
			||||||
@ -15,6 +15,7 @@ import {
 | 
				
			|||||||
    ExportResources,
 | 
					    ExportResources,
 | 
				
			||||||
    ExportVirtuals
 | 
					    ExportVirtuals
 | 
				
			||||||
} from "warframe-public-export-plus";
 | 
					} from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { handleSubsumeCompletion } from "./infestedFoundryController";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const inventoryController: RequestHandler = async (request, response) => {
 | 
					export const inventoryController: RequestHandler = async (request, response) => {
 | 
				
			||||||
    let account;
 | 
					    let account;
 | 
				
			||||||
@ -57,6 +58,15 @@ export const inventoryController: RequestHandler = async (request, response) =>
 | 
				
			|||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (
 | 
				
			||||||
 | 
					        inventory.InfestedFoundry &&
 | 
				
			||||||
 | 
					        inventory.InfestedFoundry.AbilityOverrideUnlockCooldown &&
 | 
				
			||||||
 | 
					        new Date() >= inventory.InfestedFoundry.AbilityOverrideUnlockCooldown
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        handleSubsumeCompletion(inventory as unknown as IInventoryDatabaseDocument);
 | 
				
			||||||
 | 
					        await inventory.save();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //TODO: make a function that converts from database representation to client
 | 
					    //TODO: make a function that converts from database representation to client
 | 
				
			||||||
    const inventoryJSON = inventory.toJSON();
 | 
					    const inventoryJSON = inventory.toJSON();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -459,10 +459,13 @@ const settingsSchema = new Schema<ISettings>({
 | 
				
			|||||||
    TradingRulesConfirmed: Boolean
 | 
					    TradingRulesConfirmed: Boolean
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const consumedSchuitsSchema = new Schema<IConsumedSuit>({
 | 
					const consumedSchuitsSchema = new Schema<IConsumedSuit>(
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        s: String,
 | 
					        s: String,
 | 
				
			||||||
        c: colorSchema
 | 
					        c: colorSchema
 | 
				
			||||||
});
 | 
					    },
 | 
				
			||||||
 | 
					    { _id: false }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const helminthResourceSchema = new Schema<IHelminthResource>({ ItemType: String, Count: Number }, { _id: false });
 | 
					const helminthResourceSchema = new Schema<IHelminthResource>({ ItemType: String, Count: Number }, { _id: false });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -475,11 +478,22 @@ const infestedFoundrySchema = new Schema<IInfestedFoundry>(
 | 
				
			|||||||
        ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined },
 | 
					        ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined },
 | 
				
			||||||
        InvigorationIndex: Number,
 | 
					        InvigorationIndex: Number,
 | 
				
			||||||
        InvigorationSuitOfferings: { type: [String], default: undefined },
 | 
					        InvigorationSuitOfferings: { type: [String], default: undefined },
 | 
				
			||||||
        InvigorationsApplied: Number
 | 
					        InvigorationsApplied: Number,
 | 
				
			||||||
 | 
					        LastConsumedSuit: { type: EquipmentSchema, default: undefined },
 | 
				
			||||||
 | 
					        AbilityOverrideUnlockCooldown: Date
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    { _id: false }
 | 
					    { _id: false }
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					infestedFoundrySchema.set("toJSON", {
 | 
				
			||||||
 | 
					    transform(_doc, ret, _options) {
 | 
				
			||||||
 | 
					        if (ret.AbilityOverrideUnlockCooldown) {
 | 
				
			||||||
 | 
					            // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
 | 
				
			||||||
 | 
					            ret.AbilityOverrideUnlockCooldown = toMongoDate(ret.AbilityOverrideUnlockCooldown);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const questProgressSchema = new Schema<IQuestProgress>({
 | 
					const questProgressSchema = new Schema<IQuestProgress>({
 | 
				
			||||||
    c: Number,
 | 
					    c: Number,
 | 
				
			||||||
    i: Boolean,
 | 
					    i: Boolean,
 | 
				
			||||||
 | 
				
			|||||||
@ -518,10 +518,13 @@ export interface IFusionTreasure {
 | 
				
			|||||||
    Sockets: number;
 | 
					    Sockets: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Like ITypeCount except 'Count' instead of 'ItemCount'
 | 
					 | 
				
			||||||
export interface IHelminthResource {
 | 
					export interface IHelminthResource {
 | 
				
			||||||
    ItemType: string;
 | 
					    ItemType: string;
 | 
				
			||||||
    Count: number;
 | 
					    Count: number;
 | 
				
			||||||
 | 
					    RecentlyConvertedResources?: {
 | 
				
			||||||
 | 
					        ItemType: string;
 | 
				
			||||||
 | 
					        Date: number;
 | 
				
			||||||
 | 
					    }[];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IInfestedFoundry {
 | 
					export interface IInfestedFoundry {
 | 
				
			||||||
@ -533,6 +536,8 @@ export interface IInfestedFoundry {
 | 
				
			|||||||
    InvigorationIndex?: number;
 | 
					    InvigorationIndex?: number;
 | 
				
			||||||
    InvigorationSuitOfferings?: string[];
 | 
					    InvigorationSuitOfferings?: string[];
 | 
				
			||||||
    InvigorationsApplied?: number;
 | 
					    InvigorationsApplied?: number;
 | 
				
			||||||
 | 
					    LastConsumedSuit?: IEquipmentDatabase;
 | 
				
			||||||
 | 
					    AbilityOverrideUnlockCooldown?: Date;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IConsumedSuit {
 | 
					export interface IConsumedSuit {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user