feat: focus 2.0 #2898
@ -1,23 +1,79 @@
 | 
				
			|||||||
import type { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
import { getInventory, addMiscItems, addEquipment, occupySlot } from "../../services/inventoryService.ts";
 | 
					import { getInventory, addMiscItems, addEquipment, occupySlot } from "../../services/inventoryService.ts";
 | 
				
			||||||
import type { IMiscItem, TFocusPolarity, TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
					import type { IMiscItem, TFocusPolarity, TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
					import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
 | 
				
			||||||
import { logger } from "../../utils/logger.ts";
 | 
					import { logger } from "../../utils/logger.ts";
 | 
				
			||||||
import { ExportFocusUpgrades } from "warframe-public-export-plus";
 | 
					import { ExportFocusUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
 | 
					import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
 | 
				
			||||||
 | 
					import { version_compare } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const focusController: RequestHandler = async (req, res) => {
 | 
					export const focusController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const account = await getAccountForRequest(req);
 | 
				
			||||||
    switch (req.query.op) {
 | 
					
 | 
				
			||||||
 | 
					    let op: string | undefined;
 | 
				
			||||||
 | 
					    const focus2 = account.BuildLabel && version_compare(account.BuildLabel, "2022.04.29.12.53") < 0;
 | 
				
			||||||
 | 
					    if (focus2) {
 | 
				
			||||||
 | 
					        // Focus 2.0
 | 
				
			||||||
 | 
					        switch (req.query.op) {
 | 
				
			||||||
 | 
					            case Focus2Operation.UnlockWay:
 | 
				
			||||||
 | 
					                op = "UnlockWay";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus2Operation.IncreasePool:
 | 
				
			||||||
 | 
					                op = "IncreasePool";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus2Operation.UnlockUpgrade:
 | 
				
			||||||
 | 
					                op = "UnlockUpgrade";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus2Operation.ActivateWay:
 | 
				
			||||||
 | 
					                op = "ActivateWay";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus2Operation.LevelUpUpgrade:
 | 
				
			||||||
 | 
					                op = "LevelUpUpgrade";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus2Operation.ConvertShard:
 | 
				
			||||||
 | 
					                op = "ConvertShard";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        // Focus 3.0
 | 
				
			||||||
 | 
					        switch (req.query.op) {
 | 
				
			||||||
 | 
					            case Focus3Operation.InstallLens:
 | 
				
			||||||
 | 
					                op = "InstallLens";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.UnlockWay:
 | 
				
			||||||
 | 
					                op = "UnlockWay";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.UnlockUpgrade:
 | 
				
			||||||
 | 
					                op = "UnlockUpgrade";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.LevelUpUpgrade:
 | 
				
			||||||
 | 
					                op = "LevelUpUpgrade";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.ActivateWay:
 | 
				
			||||||
 | 
					                op = "ActivateWay";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.SentTrainingAmplifier:
 | 
				
			||||||
 | 
					                op = "SentTrainingAmplifier";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.UnbindUpgrade:
 | 
				
			||||||
 | 
					                op = "UnbindUpgrade";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case Focus3Operation.ConvertShard:
 | 
				
			||||||
 | 
					                op = "ConvertShard";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (op) {
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            logger.error("Unhandled focus op type: " + String(req.query.op));
 | 
					            logger.error("Unhandled focus op type: " + String(req.query.op));
 | 
				
			||||||
            logger.debug(String(req.body));
 | 
					            logger.debug(String(req.body));
 | 
				
			||||||
            res.end();
 | 
					            res.end();
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case FocusOperation.InstallLens: {
 | 
					        case "InstallLens": {
 | 
				
			||||||
            const request = JSON.parse(String(req.body)) as ILensInstallRequest;
 | 
					            const request = JSON.parse(String(req.body)) as ILensInstallRequest;
 | 
				
			||||||
            const inventory = await getInventory(accountId);
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            const item = inventory[request.Category].id(request.WeaponId);
 | 
					            const item = inventory[request.Category].id(request.WeaponId);
 | 
				
			||||||
            if (item) {
 | 
					            if (item) {
 | 
				
			||||||
                item.FocusLens = request.LensType;
 | 
					                item.FocusLens = request.LensType;
 | 
				
			||||||
@ -35,10 +91,10 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.UnlockWay: {
 | 
					        case "UnlockWay": {
 | 
				
			||||||
            const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
 | 
					            const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
 | 
				
			||||||
            const focusPolarity = focusTypeToPolarity(focusType);
 | 
					            const focusPolarity = focusTypeToPolarity(focusType);
 | 
				
			||||||
            const inventory = await getInventory(accountId, "FocusAbility FocusUpgrades FocusXP");
 | 
					            const inventory = await getInventory(account._id.toString(), "FocusAbility FocusUpgrades FocusXP");
 | 
				
			||||||
            const cost = inventory.FocusAbility ? 50_000 : 0;
 | 
					            const cost = inventory.FocusAbility ? 50_000 : 0;
 | 
				
			||||||
            inventory.FocusAbility ??= focusType;
 | 
					            inventory.FocusAbility ??= focusType;
 | 
				
			||||||
            inventory.FocusUpgrades.push({ ItemType: focusType });
 | 
					            inventory.FocusUpgrades.push({ ItemType: focusType });
 | 
				
			||||||
@ -52,12 +108,12 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.ActivateWay: {
 | 
					        case "ActivateWay": {
 | 
				
			||||||
            const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
 | 
					            const focusType = (JSON.parse(String(req.body)) as IWayRequest).FocusType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            await Inventory.updateOne(
 | 
					            await Inventory.updateOne(
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    accountOwnerId: accountId
 | 
					                    accountOwnerId: account._id.toString()
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    FocusAbility: focusType
 | 
					                    FocusAbility: focusType
 | 
				
			||||||
@ -69,10 +125,10 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.UnlockUpgrade: {
 | 
					        case "UnlockUpgrade": {
 | 
				
			||||||
            const request = JSON.parse(String(req.body)) as IUnlockUpgradeRequest;
 | 
					            const request = JSON.parse(String(req.body)) as IUnlockUpgradeRequest;
 | 
				
			||||||
            const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
 | 
					            const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
 | 
				
			||||||
            const inventory = await getInventory(accountId);
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            let cost = 0;
 | 
					            let cost = 0;
 | 
				
			||||||
            for (const focusType of request.FocusTypes) {
 | 
					            for (const focusType of request.FocusTypes) {
 | 
				
			||||||
                cost += ExportFocusUpgrades[focusType].baseFocusPointCost;
 | 
					                cost += ExportFocusUpgrades[focusType].baseFocusPointCost;
 | 
				
			||||||
@ -86,15 +142,18 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.LevelUpUpgrade: {
 | 
					        case "LevelUpUpgrade": {
 | 
				
			||||||
            const request = JSON.parse(String(req.body)) as ILevelUpUpgradeRequest;
 | 
					            const request = JSON.parse(String(req.body)) as ILevelUpUpgradeRequest;
 | 
				
			||||||
            const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
 | 
					            const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
 | 
				
			||||||
            const inventory = await getInventory(accountId);
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            let cost = 0;
 | 
					            let cost = 0;
 | 
				
			||||||
            for (const focusUpgrade of request.FocusInfos) {
 | 
					            for (const focusUpgrade of request.FocusInfos) {
 | 
				
			||||||
                cost += focusUpgrade.FocusXpCost;
 | 
					                cost += focusUpgrade.FocusXpCost;
 | 
				
			||||||
                const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!;
 | 
					                const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!;
 | 
				
			||||||
                focusUpgradeDb.Level = focusUpgrade.Level;
 | 
					                focusUpgradeDb.Level = focusUpgrade.Level;
 | 
				
			||||||
 | 
					                if (focus2) {
 | 
				
			||||||
 | 
					                    focusUpgradeDb.IsActive = focusUpgrade.IsActive;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            inventory.FocusXP![focusPolarity]! -= cost;
 | 
					            inventory.FocusXP![focusPolarity]! -= cost;
 | 
				
			||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
@ -104,9 +163,9 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.SentTrainingAmplifier: {
 | 
					        case "SentTrainingAmplifier": {
 | 
				
			||||||
            const request = JSON.parse(String(req.body)) as ISentTrainingAmplifierRequest;
 | 
					            const request = JSON.parse(String(req.body)) as ISentTrainingAmplifierRequest;
 | 
				
			||||||
            const inventory = await getInventory(accountId);
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            const inventoryChanges = addEquipment(inventory, "OperatorAmps", request.StartingWeaponType, {
 | 
					            const inventoryChanges = addEquipment(inventory, "OperatorAmps", request.StartingWeaponType, {
 | 
				
			||||||
                ModularParts: [
 | 
					                ModularParts: [
 | 
				
			||||||
                    "/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/SentAmpTrainingGrip",
 | 
					                    "/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/SentAmpTrainingGrip",
 | 
				
			||||||
@ -119,10 +178,10 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            res.json(inventoryChanges.OperatorAmps![0]);
 | 
					            res.json(inventoryChanges.OperatorAmps![0]);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.UnbindUpgrade: {
 | 
					        case "UnbindUpgrade": {
 | 
				
			||||||
            const request = JSON.parse(String(req.body)) as IUnbindUpgradeRequest;
 | 
					            const request = JSON.parse(String(req.body)) as IUnbindUpgradeRequest;
 | 
				
			||||||
            const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
 | 
					            const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
 | 
				
			||||||
            const inventory = await getInventory(accountId);
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            inventory.FocusXP![focusPolarity]! -= 750_000 * request.FocusTypes.length;
 | 
					            inventory.FocusXP![focusPolarity]! -= 750_000 * request.FocusTypes.length;
 | 
				
			||||||
            addMiscItems(inventory, [
 | 
					            addMiscItems(inventory, [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -149,7 +208,7 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        case FocusOperation.ConvertShard: {
 | 
					        case "ConvertShard": {
 | 
				
			||||||
            const request = JSON.parse(String(req.body)) as IConvertShardRequest;
 | 
					            const request = JSON.parse(String(req.body)) as IConvertShardRequest;
 | 
				
			||||||
            // Tally XP
 | 
					            // Tally XP
 | 
				
			||||||
            let xp = 0;
 | 
					            let xp = 0;
 | 
				
			||||||
@ -167,7 +226,7 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            for (const shard of request.Shards) {
 | 
					            for (const shard of request.Shards) {
 | 
				
			||||||
                shard.ItemCount *= -1;
 | 
					                shard.ItemCount *= -1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            const inventory = await getInventory(accountId);
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            const polarity = request.Polarity;
 | 
					            const polarity = request.Polarity;
 | 
				
			||||||
            inventory.FocusXP ??= {};
 | 
					            inventory.FocusXP ??= {};
 | 
				
			||||||
            inventory.FocusXP[polarity] ??= 0;
 | 
					            inventory.FocusXP[polarity] ??= 0;
 | 
				
			||||||
@ -179,7 +238,8 @@ export const focusController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum FocusOperation {
 | 
					// Focus 3.0
 | 
				
			||||||
 | 
					enum Focus3Operation {
 | 
				
			||||||
    InstallLens = "1",
 | 
					    InstallLens = "1",
 | 
				
			||||||
    UnlockWay = "2",
 | 
					    UnlockWay = "2",
 | 
				
			||||||
    UnlockUpgrade = "3",
 | 
					    UnlockUpgrade = "3",
 | 
				
			||||||
@ -190,6 +250,17 @@ enum FocusOperation {
 | 
				
			|||||||
    ConvertShard = "9"
 | 
					    ConvertShard = "9"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Focus 2.0
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-unused-vars
 | 
				
			||||||
 | 
					enum Focus2Operation {
 | 
				
			||||||
 | 
					    UnlockWay = "2",
 | 
				
			||||||
 | 
					    IncreasePool = "4", // {"FocusType":"/Lotus/Upgrades/Focus/Defense/DefenseFocusAbility","CurrentTotalCapacity":5,"NewTotalCapacity":7}
 | 
				
			||||||
 | 
					    UnlockUpgrade = "5",
 | 
				
			||||||
 | 
					    ActivateWay = "6",
 | 
				
			||||||
 | 
					    LevelUpUpgrade = "7", // used to level up & activate ability
 | 
				
			||||||
 | 
					    ConvertShard = "11"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// For UnlockWay & ActivateWay
 | 
					// For UnlockWay & ActivateWay
 | 
				
			||||||
interface IWayRequest {
 | 
					interface IWayRequest {
 | 
				
			||||||
    FocusType: string;
 | 
					    FocusType: string;
 | 
				
			||||||
@ -206,6 +277,7 @@ interface ILevelUpUpgradeRequest {
 | 
				
			|||||||
        IsUniversal: boolean;
 | 
					        IsUniversal: boolean;
 | 
				
			||||||
        Level: number;
 | 
					        Level: number;
 | 
				
			||||||
        IsActiveAbility: boolean;
 | 
					        IsActiveAbility: boolean;
 | 
				
			||||||
 | 
					        IsActive?: number; // Focus 2.0
 | 
				
			||||||
    }[];
 | 
					    }[];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -146,7 +146,8 @@ const focusUpgradeSchema = new Schema<IFocusUpgrade>(
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        ItemType: String,
 | 
					        ItemType: String,
 | 
				
			||||||
        Level: Number,
 | 
					        Level: Number,
 | 
				
			||||||
        IsUniversal: Boolean
 | 
					        IsUniversal: Boolean,
 | 
				
			||||||
 | 
					        IsActive: Number
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    { _id: false }
 | 
					    { _id: false }
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
				
			|||||||
@ -638,6 +638,7 @@ export interface IFocusUpgrade {
 | 
				
			|||||||
    ItemType: string;
 | 
					    ItemType: string;
 | 
				
			||||||
    Level?: number;
 | 
					    Level?: number;
 | 
				
			||||||
    IsUniversal?: boolean;
 | 
					    IsUniversal?: boolean;
 | 
				
			||||||
 | 
					    IsActive?: number; // Focus 2.0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IFocusXP {
 | 
					export interface IFocusXP {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user