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

SpaceNinjaServer

A simple server for a small space ninja game

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

XFEstudio/SpaceNinjaServer

feat: setDojoComponentMessage (#948)

Closes #946 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/948

cf50738d
Sainan <sainan@calamity.inc>
提交于

代码差异

8 个文件 +82 -42
Modified src/controllers/api/getGuildDojoController.ts +2 -32
@@ -1,8 +1,7 @@
1 1 import { RequestHandler } from "express";
2 2 import { Types } from "mongoose";
3 3 import { Guild } from "@/src/models/guildModel";
4 import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes";
5 import { toOid, toMongoDate } from "@/src/helpers/inventoryHelpers";
4 import { getDojoClient } from "@/src/services/guildService";
6 5
7 6 export const getGuildDojoController: RequestHandler = async (req, res) => {
8 7 const guildId = req.query.guildId as string;
@@ -26,34 +25,5 @@ export const getGuildDojoController: RequestHandler = async (req, res) => {
26 25 await guild.save();
27 26 }
28 27
29 const dojo: IDojoClient = {
30 _id: { $oid: guildId },
31 Name: guild.Name,
32 Tier: 1,
33 FixedContributions: true,
34 DojoRevision: 1,
35 RevisionTime: Math.round(Date.now() / 1000),
36 Energy: guild.DojoEnergy,
37 Capacity: guild.DojoCapacity,
38 DojoRequestStatus: 0,
39 DojoComponents: []
40 };
41 guild.DojoComponents.forEach(dojoComponent => {
42 const clientComponent: IDojoComponentClient = {
43 id: toOid(dojoComponent._id),
44 pf: dojoComponent.pf,
45 ppf: dojoComponent.ppf,
46 DecoCapacity: 600
47 };
48 if (dojoComponent.pi) {
49 clientComponent.pi = toOid(dojoComponent.pi);
50 clientComponent.op = dojoComponent.op!;
51 clientComponent.pp = dojoComponent.pp!;
52 }
53 if (dojoComponent.CompletionTime) {
54 clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime);
55 }
56 dojo.DojoComponents.push(clientComponent);
57 });
58 res.json(dojo);
28 res.json(getDojoClient(guild, 0));
59 29 };
Modified src/controllers/api/queueDojoComponentDestructionController.ts +2 -4
@@ -1,4 +1,4 @@
1 import { getGuildForRequest } from "@/src/services/guildService";
1 import { getDojoClient, getGuildForRequest } from "@/src/services/guildService";
2 2 import { RequestHandler } from "express";
3 3 import { ExportDojoRecipes } from "warframe-public-export-plus";
4 4
@@ -15,7 +15,5 @@ export const queueDojoComponentDestructionController: RequestHandler = async (re
15 15 guild.DojoEnergy -= room.energy;
16 16 }
17 17 await guild.save();
18 res.json({
19 DojoRequestStatus: 1
20 });
18 res.json(getDojoClient(guild, 1));
21 19 };
Added src/controllers/api/setDojoComponentMessageController.ts +18 -0
@@ -0,0 +1,18 @@
1 import { RequestHandler } from "express";
2 import { getDojoClient, getGuildForRequest } from "@/src/services/guildService";
3
4 export const setDojoComponentMessageController: RequestHandler = async (req, res) => {
5 const guild = await getGuildForRequest(req);
6 // At this point, we know that a member of the guild is making this request. Assuming they are allowed to change the message.
7 const component = guild.DojoComponents!.find(x => x._id.equals(req.query.componentId as string))!;
8 const payload = JSON.parse(String(req.body)) as SetDojoComponentMessageRequest;
9 if ("Name" in payload) {
10 component.Name = payload.Name;
11 } else {
12 component.Message = payload.Message;
13 }
14 await guild.save();
15 res.json(getDojoClient(guild, 1));
16 };
17
18 type SetDojoComponentMessageRequest = { Name: string } | { Message: string };
Modified src/controllers/api/startDojoRecipeController.ts +2 -4
@@ -1,6 +1,6 @@
1 1 import { RequestHandler } from "express";
2 2 import { IDojoComponentClient } from "@/src/types/guildTypes";
3 import { getGuildForRequest } from "@/src/services/guildService";
3 import { getDojoClient, getGuildForRequest } from "@/src/services/guildService";
4 4 import { Types } from "mongoose";
5 5 import { ExportDojoRecipes } from "warframe-public-export-plus";
6 6
@@ -30,7 +30,5 @@ export const startDojoRecipeController: RequestHandler = async (req, res) => {
30 30 CompletionTime: new Date(Date.now()) // TOOD: Omit this field & handle the "Collecting Materials" state.
31 31 });
32 32 await guild.save();
33 res.json({
34 DojoRequestStatus: 0
35 });
33 res.json(getDojoClient(guild, 0));
36 34 };
Modified src/models/guildModel.ts +2 -0
@@ -14,6 +14,8 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
14 14 pi: Schema.Types.ObjectId,
15 15 op: String,
16 16 pp: String,
17 Name: String,
18 Message: String,
17 19 CompletionTime: Date
18 20 });
19 21
Modified src/routes/api.ts +2 -0
@@ -62,6 +62,7 @@ import { sellController } from "@/src/controllers/api/sellController";
62 62 import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestController";
63 63 import { setActiveShipController } from "@/src/controllers/api/setActiveShipController";
64 64 import { setBootLocationController } from "@/src/controllers/api/setBootLocationController";
65 import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController";
65 66 import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController";
66 67 import { setPlacedDecoInfoController } from "@/src/controllers/api/setPlacedDecoInfoController";
67 68 import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController";
@@ -158,6 +159,7 @@ apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
158 159 apiRouter.post("/saveDialogue.php", saveDialogueController);
159 160 apiRouter.post("/saveLoadout.php", saveLoadoutController);
160 161 apiRouter.post("/sell.php", sellController);
162 apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController);
161 163 apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController);
162 164 apiRouter.post("/setPlacedDecoInfo.php", setPlacedDecoInfoController);
163 165 apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController);
Modified src/services/guildService.ts +52 -2
@@ -3,14 +3,20 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
3 3 import { getInventory } from "@/src/services/inventoryService";
4 4 import { Guild } from "@/src/models/guildModel";
5 5 import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
6 import { IDojoClient, IDojoComponentClient, IGuildDatabase } from "@/src/types/guildTypes";
7 import { Document, Types } from "mongoose";
8 import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
6 9
7 export const getGuildForRequest = async (req: Request) => {
10 export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
8 11 const accountId = await getAccountIdForRequest(req);
9 12 const inventory = await getInventory(accountId);
10 13 return await getGuildForRequestEx(req, inventory);
11 14 };
12 15
13 export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDatabaseDocument) => {
16 export const getGuildForRequestEx = async (
17 req: Request,
18 inventory: TInventoryDatabaseDocument
19 ): Promise<TGuildDatabaseDocument> => {
14 20 const guildId = req.query.guildId as string;
15 21 if (!inventory.GuildId || inventory.GuildId.toString() != guildId) {
16 22 throw new Error("Account is not in the guild that it has sent a request for");
@@ -21,3 +27,47 @@ export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDa
21 27 }
22 28 return guild;
23 29 };
30
31 export const getDojoClient = (guild: TGuildDatabaseDocument, status: number): IDojoClient => {
32 const dojo: IDojoClient = {
33 _id: { $oid: guild._id.toString() },
34 Name: guild.Name,
35 Tier: 1,
36 FixedContributions: true,
37 DojoRevision: 1,
38 RevisionTime: Math.round(Date.now() / 1000),
39 Energy: guild.DojoEnergy,
40 Capacity: guild.DojoCapacity,
41 DojoRequestStatus: status,
42 DojoComponents: []
43 };
44 guild.DojoComponents!.forEach(dojoComponent => {
45 const clientComponent: IDojoComponentClient = {
46 id: toOid(dojoComponent._id),
47 pf: dojoComponent.pf,
48 ppf: dojoComponent.ppf,
49 Name: dojoComponent.Name,
50 Message: dojoComponent.Message,
51 DecoCapacity: 600
52 };
53 if (dojoComponent.pi) {
54 clientComponent.pi = toOid(dojoComponent.pi);
55 clientComponent.op = dojoComponent.op!;
56 clientComponent.pp = dojoComponent.pp!;
57 }
58 if (dojoComponent.CompletionTime) {
59 clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime);
60 }
61 dojo.DojoComponents.push(clientComponent);
62 });
63 return dojo;
64 };
65
66 // eslint-disable-next-line @typescript-eslint/ban-types
67 export type TGuildDatabaseDocument = Document<unknown, {}, IGuildDatabase> &
68 IGuildDatabase &
69 Required<{
70 _id: Types.ObjectId;
71 }> & {
72 __v: number;
73 };
Modified src/types/guildTypes.ts +2 -0
@@ -34,6 +34,8 @@ export interface IDojoComponentClient {
34 34 pi?: IOid; // Parent ID. N/A to root.
35 35 op?: string; // "Open Portal"? N/A to root.
36 36 pp?: string; // "Parent Portal"? N/A to root.
37 Name?: string;
38 Message?: string;
37 39 RegularCredits?: number; // "Collecting Materials" state: Number of credits that were donated.
38 40 MiscItems?: IMiscItem[]; // "Collecting Materials" state: Resources that were donated.
39 41 CompletionTime?: IMongoDate;