From fe6a88ef3fa221d1d623a11012efdde2a2a3e5d6 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Mon, 14 Apr 2025 04:42:13 +0200 Subject: [PATCH] feat: liset stencil, vignette, & fish --- .../api/setShipVignetteController.ts | 48 +++++++++++++++++++ src/models/personalRoomsModel.ts | 1 + src/routes/api.ts | 2 + src/types/personalRoomsTypes.ts | 1 + src/types/shipTypes.ts | 1 + 5 files changed, 53 insertions(+) create mode 100644 src/controllers/api/setShipVignetteController.ts diff --git a/src/controllers/api/setShipVignetteController.ts b/src/controllers/api/setShipVignetteController.ts new file mode 100644 index 00000000..a1d991da --- /dev/null +++ b/src/controllers/api/setShipVignetteController.ts @@ -0,0 +1,48 @@ +import { addMiscItems, combineInventoryChanges, getInventory } from "@/src/services/inventoryService"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { getPersonalRooms } from "@/src/services/personalRoomsService"; +import { IInventoryChanges } from "@/src/types/purchaseTypes"; +import { logger } from "@/src/utils/logger"; +import { RequestHandler } from "express"; + +export const setShipVignetteController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const inventory = await getInventory(accountId, "MiscItems"); + const personalRooms = await getPersonalRooms(accountId); + const body = JSON.parse(String(req.body)) as ISetShipVignetteRequest; + personalRooms.Ship.Wallpaper = body.Wallpaper; + personalRooms.Ship.Vignette = body.Vignette; + personalRooms.Ship.VignetteFish ??= []; + const inventoryChanges: IInventoryChanges = {}; + for (let i = 0; i != body.Fish.length; ++i) { + if (body.Fish[i] && !personalRooms.Ship.VignetteFish[i]) { + logger.debug(`moving ${body.Fish[i]} from inventory to vignette slot ${i}`); + const miscItemsDelta = [{ ItemType: body.Fish[i], ItemCount: -1 }]; + addMiscItems(inventory, miscItemsDelta); + combineInventoryChanges(inventoryChanges, { MiscItems: miscItemsDelta }); + } else if (personalRooms.Ship.VignetteFish[i] && !body.Fish[i]) { + logger.debug(`moving ${personalRooms.Ship.VignetteFish[i]} from vignette slot ${i} to inventory`); + const miscItemsDelta = [{ ItemType: personalRooms.Ship.VignetteFish[i], ItemCount: +1 }]; + addMiscItems(inventory, miscItemsDelta); + combineInventoryChanges(inventoryChanges, { MiscItems: miscItemsDelta }); + } + } + personalRooms.Ship.VignetteFish = body.Fish; + if (body.VignetteDecos.length) { + logger.error(`setShipVignette request not fully handled:`, body); + } + await Promise.all([inventory.save(), personalRooms.save()]); + res.json({ + Wallpaper: body.Wallpaper, + Vignette: body.Vignette, + VignetteFish: body.Fish, + InventoryChanges: inventoryChanges + }); +}; + +interface ISetShipVignetteRequest { + Wallpaper: string; + Vignette: string; + Fish: string[]; + VignetteDecos: unknown[]; +} diff --git a/src/models/personalRoomsModel.ts b/src/models/personalRoomsModel.ts index 390fcc63..073b32bc 100644 --- a/src/models/personalRoomsModel.ts +++ b/src/models/personalRoomsModel.ts @@ -92,6 +92,7 @@ const orbiterSchema = new Schema( Rooms: [roomSchema], VignetteFish: { type: [String], default: undefined }, FavouriteLoadoutId: Schema.Types.ObjectId, + Wallpaper: String, Vignette: String, ContentUrlSignature: { type: String, required: false }, BootLocation: String diff --git a/src/routes/api.ts b/src/routes/api.ts index 41a6cf0b..bd3ffd4b 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -115,6 +115,7 @@ import { setGuildMotdController } from "@/src/controllers/api/setGuildMotdContro import { setPlacedDecoInfoController } from "@/src/controllers/api/setPlacedDecoInfoController"; import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController"; import { setShipFavouriteLoadoutController } from "@/src/controllers/api/setShipFavouriteLoadoutController"; +import { setShipVignetteController } from "@/src/controllers/api/setShipVignetteController"; import { setSupportedSyndicateController } from "@/src/controllers/api/setSupportedSyndicateController"; import { setWeaponSkillTreeController } from "@/src/controllers/api/setWeaponSkillTreeController"; import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController"; @@ -277,6 +278,7 @@ apiRouter.post("/setGuildMotd.php", setGuildMotdController); apiRouter.post("/setPlacedDecoInfo.php", setPlacedDecoInfoController); apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController); apiRouter.post("/setShipFavouriteLoadout.php", setShipFavouriteLoadoutController); +apiRouter.post("/setShipVignette.php", setShipVignetteController); apiRouter.post("/setWeaponSkillTree.php", setWeaponSkillTreeController); apiRouter.post("/shipDecorations.php", shipDecorationsController); apiRouter.post("/startCollectibleEntry.php", startCollectibleEntryController); diff --git a/src/types/personalRoomsTypes.ts b/src/types/personalRoomsTypes.ts index c32c0498..64225862 100644 --- a/src/types/personalRoomsTypes.ts +++ b/src/types/personalRoomsTypes.ts @@ -14,6 +14,7 @@ export interface IOrbiter { Rooms: IRoom[]; VignetteFish?: string[]; FavouriteLoadoutId?: Types.ObjectId; + Wallpaper?: string; Vignette?: string; ContentUrlSignature?: string; BootLocation?: TBootLocation; diff --git a/src/types/shipTypes.ts b/src/types/shipTypes.ts index 5f8626d1..7cc07259 100644 --- a/src/types/shipTypes.ts +++ b/src/types/shipTypes.ts @@ -30,6 +30,7 @@ export interface IShip { Rooms: IRoom[]; VignetteFish?: string[]; FavouriteLoadoutId?: IOid; + Wallpaper?: string; Vignette?: string; BootLocation?: TBootLocation; ContentUrlSignature?: string;