From bfcd928fdecca366cbafdfa5aa870c2280e4d9de Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 25 Mar 2025 06:38:44 -0700 Subject: [PATCH] feat: nightwave rank up rewards (#1320) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1320 --- .../api/clearNewEpisodeRewardController.ts | 6 +++++ .../api/syndicateSacrificeController.ts | 26 ++++++++++++++++--- src/routes/api.ts | 2 ++ src/services/itemDataService.ts | 4 +++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/controllers/api/clearNewEpisodeRewardController.ts diff --git a/src/controllers/api/clearNewEpisodeRewardController.ts b/src/controllers/api/clearNewEpisodeRewardController.ts new file mode 100644 index 00000000..1dd3010a --- /dev/null +++ b/src/controllers/api/clearNewEpisodeRewardController.ts @@ -0,0 +1,6 @@ +import { RequestHandler } from "express"; + +// example req.body: {"NewEpisodeReward":true,"crossPlaySetting":"ENABLED"} +export const clearNewEpisodeRewardController: RequestHandler = (_req, res) => { + res.status(200).end(); +}; diff --git a/src/controllers/api/syndicateSacrificeController.ts b/src/controllers/api/syndicateSacrificeController.ts index 77d2424a..b20df3bf 100644 --- a/src/controllers/api/syndicateSacrificeController.ts +++ b/src/controllers/api/syndicateSacrificeController.ts @@ -1,10 +1,17 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { RequestHandler } from "express"; import { getAccountIdForRequest } from "@/src/services/loginService"; -import { ExportSyndicates, ISyndicateSacrifice } from "warframe-public-export-plus"; +import { ExportNightwave, ExportSyndicates, ISyndicateSacrifice } from "warframe-public-export-plus"; import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; -import { addMiscItems, combineInventoryChanges, getInventory, updateCurrency } from "@/src/services/inventoryService"; +import { + addItem, + addMiscItems, + combineInventoryChanges, + getInventory, + updateCurrency +} from "@/src/services/inventoryService"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; +import { fromStoreItem, isStoreItem } from "@/src/services/itemDataService"; export const syndicateSacrificeController: RequestHandler = async (request, response) => { const accountId = await getAccountIdForRequest(request); @@ -22,7 +29,7 @@ export const syndicateSacrificeController: RequestHandler = async (request, resp InventoryChanges: {}, Level: data.SacrificeLevel, LevelIncrease: level <= 0 ? 1 : level, - NewEpisodeReward: syndicate.Tag == "RadioLegionIntermission9Syndicate" + NewEpisodeReward: false }; const manifest = ExportSyndicates[data.AffiliationTag]; @@ -64,6 +71,19 @@ export const syndicateSacrificeController: RequestHandler = async (request, resp ); } + if (data.AffiliationTag == ExportNightwave.affiliationTag) { + const index = syndicate.Title - 1; + if (index < ExportNightwave.rewards.length) { + res.NewEpisodeReward = true; + const reward = ExportNightwave.rewards[index]; + let rewardType = reward.uniqueName; + if (isStoreItem(rewardType)) { + rewardType = fromStoreItem(rewardType); + } + combineInventoryChanges(res.InventoryChanges, await addItem(inventory, rewardType, reward.itemCount ?? 1)); + } + } + await inventory.save(); response.json(res); diff --git a/src/routes/api.ts b/src/routes/api.ts index b6fd4316..e2f1dbea 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -15,6 +15,7 @@ import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDai import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController"; import { claimLibraryDailyTaskRewardController } from "@/src/controllers/api/claimLibraryDailyTaskRewardController"; import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController"; +import { clearNewEpisodeRewardController } from "@/src/controllers/api/clearNewEpisodeRewardController"; import { completeRandomModChallengeController } from "@/src/controllers/api/completeRandomModChallengeController"; import { confirmGuildInvitationController } from "@/src/controllers/api/confirmGuildInvitationController"; import { contributeGuildClassController } from "@/src/controllers/api/contributeGuildClassController"; @@ -175,6 +176,7 @@ apiRouter.post("/artifactTransmutation.php", artifactTransmutationController); apiRouter.post("/changeDojoRoot.php", changeDojoRootController); apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController); +apiRouter.post("/clearNewEpisodeReward.php", clearNewEpisodeRewardController); apiRouter.post("/completeRandomModChallenge.php", completeRandomModChallengeController); apiRouter.post("/contributeGuildClass.php", contributeGuildClassController); apiRouter.post("/contributeToDojoComponent.php", contributeToDojoComponentController); diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index b1a1a297..9be6c180 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -250,6 +250,10 @@ export const convertInboxMessage = (message: IInboxMessage): IMessage => { } satisfies IMessage; }; +export const isStoreItem = (type: string): boolean => { + return type.startsWith("/Lotus/StoreItems/"); +}; + export const toStoreItem = (type: string): string => { return "/Lotus/StoreItems/" + type.substring("/Lotus/".length); };