chore: initial support for focus 2.0
All checks were successful
Build / build (pull_request) Successful in 3m14s

handling some common operations but not implementing pools yet
This commit is contained in:
Sainan 2025-10-14 19:04:40 +02:00
parent fd7ddd9696
commit bfce46cf83
3 changed files with 95 additions and 21 deletions

View File

@ -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
}[]; }[];
} }

View File

@ -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 }
); );

View File

@ -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 {