From d930c3d957fdd10bf5043ea1e950159e804faa8d Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 30 Dec 2024 19:48:20 +0100 Subject: [PATCH 1/3] feat: fish dissection (#663) --- src/controllers/api/fishmongerController.ts | 38 +++++++++++++++++++++ src/routes/api.ts | 2 ++ 2 files changed, 40 insertions(+) create mode 100644 src/controllers/api/fishmongerController.ts diff --git a/src/controllers/api/fishmongerController.ts b/src/controllers/api/fishmongerController.ts new file mode 100644 index 00000000..3d572948 --- /dev/null +++ b/src/controllers/api/fishmongerController.ts @@ -0,0 +1,38 @@ +import { getJSONfromString } from "@/src/helpers/stringHelpers"; +import { addMiscItems, getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; +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[] = []; + 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); + } + } + miscItemChanges.push({ ItemType: fish.ItemType, ItemCount: fish.ItemCount * -1 }); + } + addMiscItems(inventory, miscItemChanges); + await inventory.save(); + res.json({ + InventoryChanges: { + MiscItems: miscItemChanges + } + }); +}; + +interface IFishmongerRequest { + Fish: IMiscItem[]; +} diff --git a/src/routes/api.ts b/src/routes/api.ts index d30bd9b5..885aa84b 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -11,6 +11,7 @@ import { dronesController } from "@/src/controllers/api/dronesController"; import { endlessXpController } from "@/src/controllers/api/endlessXpController"; import { evolveWeaponController } from "@/src/controllers/api/evolveWeaponController"; import { findSessionsController } from "@/src/controllers/api/findSessionsController"; +import { fishmongerController } from "@/src/controllers/api/fishmongerController"; import { focusController } from "@/src/controllers/api/focusController"; import { fusionTreasuresController } from "@/src/controllers/api/fusionTreasuresController"; import { genericUpdateController } from "@/src/controllers/api/genericUpdateController"; @@ -113,6 +114,7 @@ apiRouter.post("/createGuild.php", createGuildController); apiRouter.post("/endlessXp.php", endlessXpController); apiRouter.post("/evolveWeapon.php", evolveWeaponController); apiRouter.post("/findSessions.php", findSessionsController); +apiRouter.post("/fishmonger.php", fishmongerController); apiRouter.post("/focus.php", focusController); apiRouter.post("/fusionTreasures.php", fusionTreasuresController); apiRouter.post("/genericUpdate.php", genericUpdateController); -- 2.47.2 From b8ef39badad6309e5dd48ad798d212a5ab3cf80e Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 30 Dec 2024 19:48:43 +0100 Subject: [PATCH 2/3] feat: implement setShipFavouriteLoadout.php (#662) --- .../api/setShipFavouriteLoadoutController.ts | 31 +++++++++++++++++++ src/routes/api.ts | 2 ++ 2 files changed, 33 insertions(+) create mode 100644 src/controllers/api/setShipFavouriteLoadoutController.ts diff --git a/src/controllers/api/setShipFavouriteLoadoutController.ts b/src/controllers/api/setShipFavouriteLoadoutController.ts new file mode 100644 index 00000000..d798e0ed --- /dev/null +++ b/src/controllers/api/setShipFavouriteLoadoutController.ts @@ -0,0 +1,31 @@ +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { RequestHandler } from "express"; +import { getPersonalRooms } from "@/src/services/personalRoomsService"; +import { IOid } from "@/src/types/commonTypes"; +import { Types } from "mongoose"; + +export const setShipFavouriteLoadoutController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const personalRooms = await getPersonalRooms(accountId); + const body = JSON.parse(String(req.body)) as ISetShipFavouriteLoadoutRequest; + if (body.BootLocation != "SHOP") { + throw new Error(`unexpected BootLocation: ${body.BootLocation}`); + } + const display = personalRooms.TailorShop.FavouriteLoadouts.find(x => x.Tag == body.TagName); + if (display) { + display.LoadoutId = new Types.ObjectId(body.FavouriteLoadoutId.$oid); + } else { + personalRooms.TailorShop.FavouriteLoadouts.push({ + Tag: body.TagName, + LoadoutId: new Types.ObjectId(body.FavouriteLoadoutId.$oid) + }); + } + await personalRooms.save(); + res.json({}); +}; + +interface ISetShipFavouriteLoadoutRequest { + BootLocation: string; + FavouriteLoadoutId: IOid; + TagName: string; +} diff --git a/src/routes/api.ts b/src/routes/api.ts index 885aa84b..0a94e506 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -55,6 +55,7 @@ import { setActiveShipController } from "@/src/controllers/api/setActiveShipCont import { setBootLocationController } from "@/src/controllers/api/setBootLocationController"; import { setPlacedDecoInfoController } from "@/src/controllers/api/setPlacedDecoInfoController"; import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController"; +import { setShipFavouriteLoadoutController } from "@/src/controllers/api/setShipFavouriteLoadoutController"; import { setSupportedSyndicateController } from "@/src/controllers/api/setSupportedSyndicateController"; import { setWeaponSkillTreeController } from "../controllers/api/setWeaponSkillTreeController"; import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController"; @@ -136,6 +137,7 @@ apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/sell.php", sellController); apiRouter.post("/setPlacedDecoInfo.php", setPlacedDecoInfoController); apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController); +apiRouter.post("/setShipFavouriteLoadout.php", setShipFavouriteLoadoutController); apiRouter.post("/setWeaponSkillTree.php", setWeaponSkillTreeController); apiRouter.post("/shipDecorations.php", shipDecorationsController); apiRouter.post("/startDojoRecipe.php", startDojoRecipeController); -- 2.47.2 From e8c397eee3502aad086f0dc72752e6411a6df963 Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 30 Dec 2024 23:30:25 +0100 Subject: [PATCH 3/3] fix: purchase of multiple booster packs --- src/services/purchaseService.ts | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/services/purchaseService.ts b/src/services/purchaseService.ts index cc09d0f7..c3a16cf0 100644 --- a/src/services/purchaseService.ts +++ b/src/services/purchaseService.ts @@ -264,7 +264,11 @@ const handleSlotPurchase = async ( }; }; -const handleBoosterPackPurchase = async (typeName: string, accountId: string): Promise => { +const handleBoosterPackPurchase = async ( + typeName: string, + accountId: string, + quantity: number +): Promise => { const pack = ExportBoosterPacks[typeName]; if (!pack) { throw new Error(`unknown booster pack: ${typeName}`); @@ -273,16 +277,18 @@ const handleBoosterPackPurchase = async (typeName: string, accountId: string): P BoosterPackItems: "", InventoryChanges: {} }; - for (const weights of pack.rarityWeightsPerRoll) { - const result = getRandomWeightedReward(pack.components, weights); - if (result) { - logger.debug(`booster pack rolled`, result); - purchaseResponse.BoosterPackItems += - result.type.split("/Lotus/").join("/Lotus/StoreItems/") + ',{"lvl":0};'; - combineInventoryChanges( - purchaseResponse.InventoryChanges, - (await addItem(accountId, result.type, result.itemCount)).InventoryChanges - ); + for (let i = 0; i != quantity; ++i) { + for (const weights of pack.rarityWeightsPerRoll) { + const result = getRandomWeightedReward(pack.components, weights); + if (result) { + logger.debug(`booster pack rolled`, result); + purchaseResponse.BoosterPackItems += + result.type.split("/Lotus/").join("/Lotus/StoreItems/") + ',{"lvl":0};'; + combineInventoryChanges( + purchaseResponse.InventoryChanges, + (await addItem(accountId, result.type, result.itemCount)).InventoryChanges + ); + } } } return purchaseResponse; @@ -300,7 +306,7 @@ const handleTypesPurchase = async ( default: return await addItem(accountId, typesName, quantity); case "BoosterPacks": - return await handleBoosterPackPurchase(typesName, accountId); + return await handleBoosterPackPurchase(typesName, accountId, quantity); case "SlotItems": return await handleSlotPurchase(typesName, accountId); } -- 2.47.2