From e7a9f2e2b8f1908ebe32f856082a4b7c3288c997 Mon Sep 17 00:00:00 2001 From: Sainan Date: Fri, 3 Jan 2025 00:05:34 +0100 Subject: [PATCH 1/2] chore: move syndicate sacrifice stuff into syndicateSacrificeController (#682) --- .../api/syndicateSacrificeController.ts | 63 ++++++++++++++----- src/services/inventoryService.ts | 42 ------------- src/types/syndicateTypes.ts | 15 ----- 3 files changed, 49 insertions(+), 71 deletions(-) delete mode 100644 src/types/syndicateTypes.ts diff --git a/src/controllers/api/syndicateSacrificeController.ts b/src/controllers/api/syndicateSacrificeController.ts index cf7cbfd0..e31f807b 100644 --- a/src/controllers/api/syndicateSacrificeController.ts +++ b/src/controllers/api/syndicateSacrificeController.ts @@ -1,24 +1,59 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers"; -import { syndicateSacrifice } from "@/src/services/inventoryService"; -import { ISyndicateSacrifice } from "@/src/types/syndicateTypes"; import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; +import { ExportSyndicates } from "warframe-public-export-plus"; +import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; +import { getInventory } from "@/src/services/inventoryService"; +import { IInventoryChanges } from "@/src/types/purchaseTypes"; -const syndicateSacrificeController: RequestHandler = async (request, response) => { +export const syndicateSacrificeController: RequestHandler = async (request, response) => { const accountId = await getAccountIdForRequest(request); - const update = getJSONfromString(String(request.body)) as ISyndicateSacrifice; - let reply = {}; - try { - if (typeof update !== "object") { - throw new Error("Invalid data format"); - } + const inventory = await getInventory(accountId); + const data = getJSONfromString(String(request.body)) as ISyndicateSacrifice; - reply = await syndicateSacrifice(update, accountId); - } catch (err) { - console.error("Error parsing JSON data:", err); + let syndicate = inventory.Affiliations.find(x => x.Tag == data.AffiliationTag); + if (!syndicate) { + syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: data.AffiliationTag, Standing: 0 }) - 1]; } - response.json(reply); + let reward: string | undefined; + + const manifest = ExportSyndicates[data.AffiliationTag]; + if (manifest?.initiationReward && data.SacrificeLevel == 0) { + reward = manifest.initiationReward; + syndicate.Initiated = true; + } + + const level = data.SacrificeLevel - (syndicate.Title ?? 0); + const res: ISyndicateSacrificeResponse = { + AffiliationTag: data.AffiliationTag, + InventoryChanges: {}, + Level: data.SacrificeLevel, + LevelIncrease: level <= 0 ? 1 : level, + NewEpisodeReward: syndicate?.Tag == "RadioLegionIntermission9Syndicate" + }; + + if (syndicate?.Title !== undefined) syndicate.Title += 1; + + await inventory.save(); + + if (reward) { + res.InventoryChanges = (await handleStoreItemAcquisition(reward, accountId)).InventoryChanges; + } + + response.json(res); }; -export { syndicateSacrificeController }; +interface ISyndicateSacrifice { + AffiliationTag: string; + SacrificeLevel: number; + AllowMultiple: boolean; +} + +interface ISyndicateSacrificeResponse { + AffiliationTag: string; + Level: number; + LevelIncrease: number; + InventoryChanges: IInventoryChanges; + NewEpisodeReward: boolean; +} diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 5b0ce1cc..1265e802 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -28,7 +28,6 @@ import { } from "../types/requestTypes"; import { logger } from "@/src/utils/logger"; import { getWeaponType, getExalted } from "@/src/services/itemDataService"; -import { ISyndicateSacrifice, ISyndicateSacrificeResponse } from "../types/syndicateTypes"; import { IEquipmentClient, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes"; import { ExportArcanes, @@ -38,11 +37,9 @@ import { ExportRecipes, ExportResources, ExportSentinels, - ExportSyndicates, ExportUpgrades } from "warframe-public-export-plus"; import { createShip } from "./shipService"; -import { handleStoreItemAcquisition } from "./purchaseService"; export const createInventory = async ( accountOwnerId: Types.ObjectId, @@ -552,45 +549,6 @@ export const updateTheme = async (data: IThemeUpdateRequest, accountId: string): await inventory.save(); }; -export const syndicateSacrifice = async ( - data: ISyndicateSacrifice, - accountId: string -): Promise => { - const inventory = await getInventory(accountId); - - let syndicate = inventory.Affiliations.find(x => x.Tag == data.AffiliationTag); - if (!syndicate) { - syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: data.AffiliationTag, Standing: 0 }) - 1]; - } - - let reward: string | undefined; - - const manifest = ExportSyndicates[data.AffiliationTag]; - if (manifest?.initiationReward && data.SacrificeLevel == 0) { - reward = manifest.initiationReward; - syndicate.Initiated = true; - } - - const level = data.SacrificeLevel - (syndicate.Title ?? 0); - const res: ISyndicateSacrificeResponse = { - AffiliationTag: data.AffiliationTag, - InventoryChanges: {}, - Level: data.SacrificeLevel, - LevelIncrease: level <= 0 ? 1 : level, - NewEpisodeReward: syndicate?.Tag == "RadioLegionIntermission9Syndicate" - }; - - if (syndicate?.Title !== undefined) syndicate.Title += 1; - - await inventory.save(); - - if (reward) { - res.InventoryChanges = (await handleStoreItemAcquisition(reward, accountId)).InventoryChanges; - } - - return res; -}; - export const addEquipment = async ( category: TEquipmentKey, type: string, diff --git a/src/types/syndicateTypes.ts b/src/types/syndicateTypes.ts deleted file mode 100644 index 741f3760..00000000 --- a/src/types/syndicateTypes.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IInventoryChanges } from "./purchaseTypes"; - -export interface ISyndicateSacrifice { - AffiliationTag: string; - SacrificeLevel: number; - AllowMultiple: boolean; -} - -export interface ISyndicateSacrificeResponse { - AffiliationTag: string; - Level: number; - LevelIncrease: number; - InventoryChanges: IInventoryChanges; - NewEpisodeReward: boolean; -} From b8ceb78c98c310f83f5225f1489eb78505997c5d Mon Sep 17 00:00:00 2001 From: Sainan Date: Fri, 3 Jan 2025 00:10:18 +0100 Subject: [PATCH 2/2] feat: trade fish for standing (#681) --- package-lock.json | 8 ++--- package.json | 2 +- src/controllers/api/fishmongerController.ts | 38 +++++++++++++++------ 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index cdd0ef07..ae4317a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.2", - "warframe-public-export-plus": "^0.5.17", + "warframe-public-export-plus": "^0.5.18", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" @@ -3778,9 +3778,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.17.tgz", - "integrity": "sha512-AWOfUxDHz+UmpbA9ZUGLIrP+3eQOiVq9tw1FXgx7ySkJLEnZUsoi3wn0IFiavSy2iE6JQIyCiSIZCJQTaCV6kA==" + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.18.tgz", + "integrity": "sha512-wUaW5Ua5tXHOYkKJxbealdCcTnRLUN7UCkvYOJEwlB/H14EBzDaqxg4engGqzbq4H8fmttyp3EUo4vazSaxZWg==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index a04dfe24..ed389137 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.2", - "warframe-public-export-plus": "^0.5.17", + "warframe-public-export-plus": "^0.5.18", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" diff --git a/src/controllers/api/fishmongerController.ts b/src/controllers/api/fishmongerController.ts index 3d572948..789d158d 100644 --- a/src/controllers/api/fishmongerController.ts +++ b/src/controllers/api/fishmongerController.ts @@ -6,30 +6,48 @@ import { RequestHandler } from "express"; import { ExportResources } from "warframe-public-export-plus"; export const fishmongerController: RequestHandler = async (req, res) => { - if (!req.query.dissect) { - throw new Error("expected fishmonger request to be for dissection"); - } const accountId = await getAccountIdForRequest(req); const inventory = await getInventory(accountId); const body = getJSONfromString(String(req.body)) as IFishmongerRequest; const miscItemChanges: IMiscItem[] = []; + let syndicateTag: string | undefined; + let standingChange = 0; for (const fish of body.Fish) { - for (const part of ExportResources[fish.ItemType].dissectionParts!) { - const partItem = miscItemChanges.find(x => x.ItemType == part.ItemType); - if (partItem) { - partItem.ItemCount += part.ItemCount; - } else { - miscItemChanges.push(part); + const fishData = ExportResources[fish.ItemType]; + if (req.query.dissect == "1") { + for (const part of fishData.dissectionParts!) { + const partItem = miscItemChanges.find(x => x.ItemType == part.ItemType); + if (partItem) { + partItem.ItemCount += part.ItemCount * fish.ItemCount; + } else { + miscItemChanges.push({ ItemType: part.ItemType, ItemCount: part.ItemCount * fish.ItemCount }); + } } + } else { + syndicateTag = fishData.syndicateTag!; + standingChange += fishData.standingBonus! * fish.ItemCount; } miscItemChanges.push({ ItemType: fish.ItemType, ItemCount: fish.ItemCount * -1 }); } addMiscItems(inventory, miscItemChanges); + if (standingChange && syndicateTag) { + const syndicate = inventory.Affiliations.find(x => x.Tag == syndicateTag); + if (syndicate !== undefined) { + syndicate.Standing += standingChange; + } else { + inventory.Affiliations.push({ + Tag: syndicateTag, + Standing: standingChange + }); + } + } await inventory.save(); res.json({ InventoryChanges: { MiscItems: miscItemChanges - } + }, + SyndicateTag: syndicateTag, + StandingChange: standingChange }); };