XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat: getShip for visitors (#3581)

Closes #3580 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3581 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

62b9e85d
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

6 个文件 +63 -22
Modified src/controllers/api/getShipController.ts +10 -18
@@ -1,9 +1,12 @@
1 1 import type { RequestHandler } from "express";
2 2 import { getAccountIdForRequest } from "../../services/loginService.ts";
3 import { createGarden, getPersonalRooms } from "../../services/personalRoomsService.ts";
4 import type { IGetShipResponse, IPersonalRoomsClient } from "../../types/personalRoomsTypes.ts";
5 import { getLoadout } from "../../services/loadoutService.ts";
6 import { toOid } from "../../helpers/inventoryHelpers.ts";
3 import {
4 createGarden,
5 getPersonalRooms,
6 getShip,
7 refreshContentUrlSignature
8 } from "../../services/personalRoomsService.ts";
9 import type { IGetShipResponse } from "../../types/personalRoomsTypes.ts";
7 10
8 11 export const getShipController: RequestHandler = async (req, res) => {
9 12 const accountId = await getAccountIdForRequest(req);
@@ -12,22 +15,11 @@ export const getShipController: RequestHandler = async (req, res) => {
12 15 // Setup gardening if it's missing. Maybe should be done as part of some quest completion in the future.
13 16 if (personalRoomsDb.Apartment.Gardening.Planters.length == 0) {
14 17 personalRoomsDb.Apartment.Gardening = createGarden();
15 await personalRoomsDb.save();
16 18 }
17 19
18 const personalRooms = personalRoomsDb.toJSON<IPersonalRoomsClient>();
19 const loadout = await getLoadout(accountId);
20
21 const getShipResponse: IGetShipResponse = {
22 ShipOwnerId: accountId,
23 LoadOutInventory: { LoadOutPresets: loadout.toJSON() },
24 Ship: {
25 ...personalRooms.Ship,
26 ShipId: toOid(personalRoomsDb.activeShipId)
27 },
28 Apartment: personalRooms.Apartment,
29 TailorShop: personalRooms.TailorShop
30 };
20 refreshContentUrlSignature(personalRoomsDb);
21 await personalRoomsDb.save();
31 22
23 const getShipResponse: IGetShipResponse = await getShip(personalRoomsDb);
32 24 res.json(getShipResponse);
33 25 };
Added src/controllers/dynamic/getShipController.ts +15 -0
@@ -0,0 +1,15 @@
1 import type { RequestHandler } from "express";
2 import { getPersonalRooms, getShip } from "../../services/personalRoomsService.ts";
3 import type { IGetShipResponse } from "../../types/personalRoomsTypes.ts";
4
5 export const getShipController: RequestHandler = async (req, res) => {
6 const personalRoomsDb = await getPersonalRooms(req.query.shipOwnerId as string);
7
8 if (personalRoomsDb.Ship.ContentUrlSignature != (req.query.sig as string)) {
9 res.status(409).send("Paramater error"); // [sic]
10 return;
11 }
12
13 const getShipResponse: IGetShipResponse = await getShip(personalRoomsDb);
14 res.json(getShipResponse);
15 };
Modified src/models/personalRoomsModel.ts +1 -1
@@ -169,7 +169,7 @@ const orbiterSchema = new Schema<IOrbiterDatabase>(
169 169 FavouriteLoadoutId: Schema.Types.ObjectId,
170 170 Wallpaper: String,
171 171 Vignette: String,
172 ContentUrlSignature: { type: String, required: false },
172 ContentUrlSignature: String,
173 173 BootLocation: String
174 174 },
175 175 { _id: false }
Modified src/routes/dynamic.ts +2 -0
@@ -2,6 +2,7 @@ import express from "express";
2 2 import { aggregateSessionsController } from "../controllers/dynamic/aggregateSessionsController.ts";
3 3 import { getGuildAdsController } from "../controllers/dynamic/getGuildAdsController.ts";
4 4 import { getProfileViewingDataGetController } from "../controllers/dynamic/getProfileViewingDataController.ts";
5 import { getShipController } from "../controllers/dynamic/getShipController.ts";
5 6 import { worldStateController } from "../controllers/dynamic/worldStateController.ts";
6 7
7 8 const dynamicRouter = express.Router();
@@ -9,6 +10,7 @@ const dynamicRouter = express.Router();
9 10 dynamicRouter.get("/aggregateSessions.php", aggregateSessionsController);
10 11 dynamicRouter.get("/getGuildAds.php", getGuildAdsController);
11 12 dynamicRouter.get("/getProfileViewingData.php", getProfileViewingDataGetController);
13 dynamicRouter.get("/getShip.php", getShipController);
12 14 dynamicRouter.get("/worldState.php", worldStateController);
13 15 dynamicRouter.post("/worldState.php", worldStateController); // used by companion app
14 16
Modified src/services/loadoutService.ts +3 -2
@@ -1,11 +1,12 @@
1 import type { Types } from "mongoose";
1 2 import type { TLoadoutDatabaseDocument } from "../models/inventoryModels/loadoutModel.ts";
2 3 import { Loadout } from "../models/inventoryModels/loadoutModel.ts";
3 4
4 export const getLoadout = async (accountId: string): Promise<TLoadoutDatabaseDocument> => {
5 export const getLoadout = async (accountId: Types.ObjectId | string): Promise<TLoadoutDatabaseDocument> => {
5 6 const loadout = await Loadout.findOne({ loadoutOwnerId: accountId });
6 7
7 8 if (!loadout) {
8 throw new Error(`loadout not found for account ${accountId}`);
9 throw new Error(`loadout not found for account ${String(accountId)}`);
9 10 }
10 11
11 12 return loadout;
Modified src/services/personalRoomsService.ts +32 -1
@@ -1,10 +1,17 @@
1 1 import { PersonalRooms } from "../models/personalRoomsModel.ts";
2 2 import { addItem } from "./inventoryService.ts";
3 import type { IGardeningDatabase, TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes.ts";
3 import type {
4 IGardeningDatabase,
5 IGetShipResponse,
6 IPersonalRoomsClient,
7 TPersonalRoomsDatabaseDocument
8 } from "../types/personalRoomsTypes.ts";
4 9 import { getRandomElement } from "./rngService.ts";
5 10 import type { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel.ts";
6 11 import { logger } from "../utils/logger.ts";
7 12 import type { Types } from "mongoose";
13 import { getLoadout } from "./loadoutService.ts";
14 import { toOid } from "../helpers/inventoryHelpers.ts";
8 15
9 16 export const getPersonalRooms = async (
10 17 accountId: string | Types.ObjectId,
@@ -91,3 +98,27 @@ export const createGarden = (): IGardeningDatabase => {
91 98 ]
92 99 };
93 100 };
101
102 export const refreshContentUrlSignature = (personalRooms: TPersonalRoomsDatabaseDocument): void => {
103 personalRooms.Ship.ContentUrlSignature = "";
104 for (let i = 0; i != 16; ++i) {
105 personalRooms.Ship.ContentUrlSignature += Math.floor(Math.random() * 256)
106 .toString(16)
107 .padStart(2, "0");
108 }
109 };
110
111 export const getShip = async (personalRoomsDb: TPersonalRoomsDatabaseDocument): Promise<IGetShipResponse> => {
112 const personalRooms = personalRoomsDb.toJSON<IPersonalRoomsClient>();
113 const loadout = await getLoadout(personalRoomsDb.personalRoomsOwnerId);
114 return {
115 ShipOwnerId: personalRoomsDb.personalRoomsOwnerId.toString(),
116 LoadOutInventory: { LoadOutPresets: loadout.toJSON() },
117 Ship: {
118 ...personalRooms.Ship,
119 ShipId: toOid(personalRoomsDb.activeShipId)
120 },
121 Apartment: personalRooms.Apartment,
122 TailorShop: personalRooms.TailorShop
123 };
124 };