返回提交历史
Added
src/controllers/api/infestedFoundryController.ts
+88
-0
Modified
src/models/inventoryModels/inventoryModel.ts
+31
-13
Modified
src/routes/api.ts
+2
-0
Modified
src/types/inventoryTypes/commonInventoryTypes.ts
+6
-1
Modified
src/types/inventoryTypes/inventoryTypes.ts
+9
-9
XFEstudio/XFESpaceNinjaServer
feat: implement helminth naming & archon shard installation (#320)
Co-authored-by: Sainan <Sainan@users.noreply.github.com>
74de4e07
代码差异
5 个文件
+136
-23
@@ -0,0 +1,88 @@
1
import { RequestHandler } from "express";
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
import { getJSONfromString } from "@/src/helpers/stringHelpers";
4
import { getInventory, addMiscItems } from "@/src/services/inventoryService";
5
import { IOid } from "@/src/types/commonTypes";
6
7
export const infestedFoundryController: RequestHandler = async (req, res) => {
8
const accountId = await getAccountIdForRequest(req);
9
const payload = getJSONfromString(req.body.toString());
10
switch (req.query.mode) {
11
case "s": {
12
// shard installation
13
const request = payload as IShardInstallRequest;
14
const inventory = await getInventory(accountId);
15
const suit = inventory.Suits.find(suit => suit._id.toString() == request.SuitId.$oid)!;
16
if (
17
!suit.ArchonCrystalUpgrades ||
18
suit.ArchonCrystalUpgrades.length != 5 // we shouldn't have an array like this, but older inventories may disagree...
19
) {
20
suit.ArchonCrystalUpgrades = [{}, {}, {}, {}, {}];
21
}
22
suit.ArchonCrystalUpgrades[request.Slot] = {
23
UpgradeType: request.UpgradeType,
24
Color: request.Color
25
};
26
const miscItemChanges = [
27
{
28
ItemType: colorToShard[request.Color],
29
ItemCount: -1
30
}
31
];
32
addMiscItems(inventory, miscItemChanges);
33
await inventory.save();
34
res.json({
35
InventoryChanges: {
36
MiscItems: miscItemChanges
37
}
38
});
39
break;
40
}
41
42
case "n": {
43
// name the beast
44
const inventory = await getInventory(accountId);
45
inventory.InfestedFoundry ??= {};
46
inventory.InfestedFoundry.Name = payload.newName as string;
47
await inventory.save();
48
res.json({
49
InventoryChanges: {
50
InfestedFoundry: {
51
Name: inventory.InfestedFoundry.Name
52
}
53
}
54
});
55
break;
56
}
57
58
case "o": // offerings update
59
// {"OfferingsIndex":540,"SuitTypes":["/Lotus/Powersuits/PaxDuviricus/PaxDuviricusBaseSuit","/Lotus/Powersuits/Nezha/NezhaBaseSuit","/Lotus/Powersuits/Devourer/DevourerBaseSuit"],"Extra":false}
60
res.status(404).end();
61
break;
62
63
default:
64
throw new Error(`unhandled infestedFoundry mode: ${req.query.mode}`);
65
}
66
};
67
68
interface IShardInstallRequest {
69
SuitId: IOid;
70
Slot: number;
71
UpgradeType: string;
72
Color: string;
73
}
74
75
const colorToShard: Record<string, string> = {
76
ACC_RED: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar",
77
ACC_RED_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic",
78
ACC_YELLOW: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira",
79
ACC_YELLOW_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic",
80
ACC_BLUE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal",
81
ACC_BLUE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic",
82
ACC_GREEN: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen",
83
ACC_GREEN_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic",
84
ACC_ORANGE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange",
85
ACC_ORANGE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic",
86
ACC_PURPLE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet",
87
ACC_PURPLE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic"
88
};
@@ -45,7 +45,8 @@ import {
45
45
IOperatorConfigDatabase,
46
46
IPolarity,
47
47
IEquipmentDatabase,
48
IOperatorConfigClient
48
IOperatorConfigClient,
49
IArchonCrystalUpgrade
49
50
} from "@/src/types/inventoryTypes/commonInventoryTypes";
50
51
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
51
52
@@ -182,6 +183,20 @@ ItemConfigSchema.set("toJSON", {
182
183
}
183
184
});
184
185
186
const ArchonCrystalUpgradeSchema = new Schema<IArchonCrystalUpgrade>(
187
{
188
UpgradeType: String,
189
Color: String
190
},
191
{ _id: false }
192
);
193
194
ArchonCrystalUpgradeSchema.set("toJSON", {
195
transform(_document, returnedObject) {
196
delete returnedObject.__v;
197
}
198
});
199
185
200
const EquipmentSchema = new Schema<IEquipmentDatabase>({
186
201
ItemType: String,
187
202
Configs: [ItemConfigSchema],
@@ -193,7 +208,7 @@ const EquipmentSchema = new Schema<IEquipmentDatabase>({
193
208
FocusLens: String,
194
209
ModSlotPurchases: Number,
195
210
CustomizationSlotPurchases: Number,
196
UpgradeType: Schema.Types.Mixed, //todo
211
UpgradeType: String,
197
212
UpgradeFingerprint: String,
198
213
ItemName: String,
199
214
InfestationDate: Date,
@@ -203,7 +218,7 @@ const EquipmentSchema = new Schema<IEquipmentDatabase>({
203
218
UnlockLevel: Number,
204
219
Expiry: Date,
205
220
SkillTree: String,
206
ArchonCrystalUpgrades: [Schema.Types.Mixed] //TODO
221
ArchonCrystalUpgrades: { type: [ArchonCrystalUpgradeSchema], default: undefined }
207
222
});
208
223
209
224
EquipmentSchema.virtual("ItemId").get(function () {
@@ -432,16 +447,19 @@ const consumedSchuitsSchema = new Schema<IConsumedSuit>({
432
447
c: colorSchema
433
448
});
434
449
435
const infestedFoundrySchema = new Schema<IInfestedFoundry>({
436
Name: String,
437
Resources: [typeCountSchema],
438
Slots: Number,
439
XP: Number,
440
ConsumedSuits: [consumedSchuitsSchema],
441
InvigorationIndex: Number,
442
InvigorationSuitOfferings: [String],
443
InvigorationsApplied: Number
444
});
450
const infestedFoundrySchema = new Schema<IInfestedFoundry>(
451
{
452
Name: String,
453
Resources: { type: [typeCountSchema], default: undefined },
454
Slots: Number,
455
XP: Number,
456
ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined },
457
InvigorationIndex: Number,
458
InvigorationSuitOfferings: { type: [String], default: undefined },
459
InvigorationsApplied: Number
460
},
461
{ _id: false }
462
);
445
463
446
464
const questProgressSchema = new Schema<IQuestProgress>({
447
465
c: Number,
@@ -25,6 +25,7 @@ import { hostSessionController } from "@/src/controllers/api/hostSessionControll
25
25
import { hubController } from "@/src/controllers/api/hubController";
26
26
import { hubInstancesController } from "@/src/controllers/api/hubInstancesController";
27
27
import { inboxController } from "@/src/controllers/api/inboxController";
28
import { infestedFoundryController } from "@/src/controllers/api/infestedFoundryController";
28
29
import { inventoryController } from "@/src/controllers/api/inventoryController";
29
30
import { inventorySlotsController } from "@/src/controllers/api/inventorySlotsController";
30
31
import { joinSessionController } from "@/src/controllers/api/joinSessionController";
@@ -101,6 +102,7 @@ apiRouter.post("/genericUpdate.php", genericUpdateController);
101
102
apiRouter.post("/getAlliance.php", getAllianceController);
102
103
apiRouter.post("/guildTech.php", guildTechController);
103
104
apiRouter.post("/hostSession.php", hostSessionController);
105
apiRouter.post("/infestedFoundry.php", infestedFoundryController);
104
106
apiRouter.post("/inventorySlots.php", inventorySlotsController);
105
107
apiRouter.post("/joinSession.php", joinSessionController);
106
108
apiRouter.post("/login.php", loginController);
@@ -103,6 +103,11 @@ export interface IEquipmentDatabase {
103
103
UnlockLevel?: number;
104
104
Expiry?: IMongoDate;
105
105
SkillTree?: string;
106
ArchonCrystalUpgrades?: []; //TODO
106
ArchonCrystalUpgrades?: IArchonCrystalUpgrade[];
107
107
_id: Types.ObjectId;
108
108
}
109
110
export interface IArchonCrystalUpgrade {
111
UpgradeType?: string;
112
Color?: string;
113
}
@@ -232,7 +232,7 @@ export interface IInventoryResponse {
232
232
DailyAffiliationEntrati: number;
233
233
DailyAffiliationNecraloid: number;
234
234
MechSuits: IEquipmentDatabase[];
235
InfestedFoundry: IInfestedFoundry;
235
InfestedFoundry?: IInfestedFoundry;
236
236
BlessingCooldown: IMongoDate;
237
237
CrewShipHarnesses: IEquipmentDatabase[];
238
238
CrewShipRawSalvage: IConsumable[];
@@ -482,14 +482,14 @@ export interface IFusionTreasure {
482
482
}
483
483
484
484
export interface IInfestedFoundry {
485
Name: string;
486
Resources: ITypeCount[];
487
Slots: number;
488
XP: number;
489
ConsumedSuits: IConsumedSuit[];
490
InvigorationIndex: number;
491
InvigorationSuitOfferings: string[];
492
InvigorationsApplied: number;
485
Name?: string;
486
Resources?: ITypeCount[];
487
Slots?: number;
488
XP?: number;
489
ConsumedSuits?: IConsumedSuit[];
490
InvigorationIndex?: number;
491
InvigorationSuitOfferings?: string[];
492
InvigorationsApplied?: number;
493
493
}
494
494
495
495
export interface IConsumedSuit {