返回提交历史
Modified
src/controllers/api/claimCompletedRecipeController.ts
+1
-1
Modified
src/controllers/api/giveStartingGearController.ts
+1
-1
Modified
src/controllers/api/guildTechController.ts
+1
-1
Modified
src/services/inventoryService.ts
+69
-124
Modified
src/services/purchaseService.ts
+4
-7
XFEstudio/SpaceNinjaServer
chore: make addItem return InventoryChanges directly (#1299)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1299
aa127087
代码差异
5 个文件
+76
-134
@@ -118,7 +118,7 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
118
118
}
119
119
InventoryChanges = {
120
120
...InventoryChanges,
121
...(await addItem(inventory, recipe.resultType, recipe.num, false)).InventoryChanges
121
...(await addItem(inventory, recipe.resultType, recipe.num, false))
122
122
};
123
123
await inventory.save();
124
124
res.json({ InventoryChanges });
@@ -87,7 +87,7 @@ export const addStartingGear = async (
87
87
88
88
for (const item of awakeningRewards) {
89
89
const inventoryDelta = await addItem(inventory, item);
90
combineInventoryChanges(inventoryChanges, inventoryDelta.InventoryChanges);
90
combineInventoryChanges(inventoryChanges, inventoryDelta);
91
91
}
92
92
93
93
inventory.PlayedParkourTutorial = true;
@@ -194,7 +194,7 @@ export const guildTechController: RequestHandler = async (req, res) => {
194
194
ItemCount: x.ItemCount * -1
195
195
}));
196
196
addMiscItems(inventory, inventoryChanges.MiscItems);
197
combineInventoryChanges(inventoryChanges, (await addItem(inventory, recipe.resultType)).InventoryChanges);
197
combineInventoryChanges(inventoryChanges, await addItem(inventory, recipe.resultType));
198
198
await inventory.save();
199
199
// Not a mistake: This response uses `inventoryChanges` instead of `InventoryChanges`.
200
200
res.json({ inventoryChanges: inventoryChanges });
@@ -234,10 +234,10 @@ export const addItem = async (
234
234
typeName: string,
235
235
quantity: number = 1,
236
236
premiumPurchase: boolean = false
237
): Promise<{ InventoryChanges: IInventoryChanges }> => {
237
): Promise<IInventoryChanges> => {
238
238
// Bundles are technically StoreItems but a) they don't have a normal counterpart, and b) they are used in non-StoreItem contexts, e.g. email attachments.
239
239
if (typeName in ExportBundles) {
240
return { InventoryChanges: await handleBundleAcqusition(typeName, inventory, quantity) };
240
return await handleBundleAcqusition(typeName, inventory, quantity);
241
241
}
242
242
243
243
// Strict typing
@@ -250,9 +250,7 @@ export const addItem = async (
250
250
];
251
251
addRecipes(inventory, recipeChanges);
252
252
return {
253
InventoryChanges: {
254
Recipes: recipeChanges
255
}
253
Recipes: recipeChanges
256
254
};
257
255
}
258
256
if (typeName in ExportResources) {
@@ -265,9 +263,7 @@ export const addItem = async (
265
263
];
266
264
addMiscItems(inventory, miscItemChanges);
267
265
return {
268
InventoryChanges: {
269
MiscItems: miscItemChanges
270
}
266
MiscItems: miscItemChanges
271
267
};
272
268
} else if (ExportResources[typeName].productCategory == "FusionTreasures") {
273
269
const fusionTreasureChanges = [
@@ -279,25 +275,21 @@ export const addItem = async (
279
275
];
280
276
addFusionTreasures(inventory, fusionTreasureChanges);
281
277
return {
282
InventoryChanges: {
283
FusionTreasures: fusionTreasureChanges
284
}
278
FusionTreasures: fusionTreasureChanges
285
279
};
286
280
} else if (ExportResources[typeName].productCategory == "Ships") {
287
281
const oid = await createShip(inventory.accountOwnerId, typeName);
288
282
inventory.Ships.push(oid);
289
283
return {
290
InventoryChanges: {
291
Ships: [
292
{
293
ItemId: { $oid: oid.toString() },
294
ItemType: typeName
295
}
296
]
297
}
284
Ships: [
285
{
286
ItemId: { $oid: oid.toString() },
287
ItemType: typeName
288
}
289
]
298
290
};
299
291
} else if (ExportResources[typeName].productCategory == "CrewShips") {
300
const inventoryChanges = {
292
return {
301
293
...addCrewShip(inventory, typeName),
302
294
// fix to unlock railjack modding, item bellow supposed to be obtained from archwing quest
303
295
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -305,8 +297,6 @@ export const addItem = async (
305
297
? addCrewShipHarness(inventory, "/Lotus/Types/Game/CrewShip/RailJack/DefaultHarness")
306
298
: {})
307
299
};
308
309
return { InventoryChanges: inventoryChanges };
310
300
} else if (ExportResources[typeName].productCategory == "ShipDecorations") {
311
301
const changes = [
312
302
{
@@ -316,9 +306,7 @@ export const addItem = async (
316
306
];
317
307
addShipDecorations(inventory, changes);
318
308
return {
319
InventoryChanges: {
320
ShipDecorations: changes
321
}
309
ShipDecorations: changes
322
310
};
323
311
} else if (ExportResources[typeName].productCategory == "KubrowPetEggs") {
324
312
const changes: IKubrowPetEggClient[] = [];
@@ -339,9 +327,7 @@ export const addItem = async (
339
327
});
340
328
}
341
329
return {
342
InventoryChanges: {
343
KubrowPetEggs: changes
344
}
330
KubrowPetEggs: changes
345
331
};
346
332
} else {
347
333
throw new Error(`unknown product category: ${ExportResources[typeName].productCategory}`);
@@ -349,14 +335,13 @@ export const addItem = async (
349
335
}
350
336
if (typeName in ExportCustoms) {
351
337
if (ExportCustoms[typeName].productCategory == "CrewShipWeaponSkins") {
352
return { InventoryChanges: addCrewShipWeaponSkin(inventory, typeName) };
338
return addCrewShipWeaponSkin(inventory, typeName);
353
339
} else {
354
return { InventoryChanges: addSkin(inventory, typeName) };
340
return addSkin(inventory, typeName);
355
341
}
356
342
}
357
343
if (typeName in ExportFlavour) {
358
const inventoryChanges = addCustomization(inventory, typeName);
359
return { InventoryChanges: inventoryChanges };
344
return addCustomization(inventory, typeName);
360
345
}
361
346
if (typeName in ExportUpgrades || typeName in ExportArcanes) {
362
347
const changes = [
@@ -367,9 +352,7 @@ export const addItem = async (
367
352
];
368
353
addMods(inventory, changes);
369
354
return {
370
InventoryChanges: {
371
RawUpgrades: changes
372
}
355
RawUpgrades: changes
373
356
};
374
357
}
375
358
if (typeName in ExportGear) {
@@ -381,9 +364,7 @@ export const addItem = async (
381
364
];
382
365
addConsumables(inventory, consumablesChanges);
383
366
return {
384
InventoryChanges: {
385
Consumables: consumablesChanges
386
}
367
Consumables: consumablesChanges
387
368
};
388
369
}
389
370
if (typeName in ExportWeapons) {
@@ -426,14 +407,12 @@ export const addItem = async (
426
407
);
427
408
if (weapon.additionalItems) {
428
409
for (const item of weapon.additionalItems) {
429
combineInventoryChanges(inventoryChanges, (await addItem(inventory, item, 1)).InventoryChanges);
410
combineInventoryChanges(inventoryChanges, await addItem(inventory, item, 1));
430
411
}
431
412
}
432
413
return {
433
InventoryChanges: {
434
...inventoryChanges,
435
...occupySlot(inventory, InventorySlot.WEAPONS, premiumPurchase)
436
}
414
...inventoryChanges,
415
...occupySlot(inventory, InventorySlot.WEAPONS, premiumPurchase)
437
416
};
438
417
} else {
439
418
// Modular weapon parts
@@ -445,36 +424,28 @@ export const addItem = async (
445
424
];
446
425
addMiscItems(inventory, miscItemChanges);
447
426
return {
448
InventoryChanges: {
449
MiscItems: miscItemChanges
450
}
427
MiscItems: miscItemChanges
451
428
};
452
429
}
453
430
}
454
431
if (typeName in ExportRailjackWeapons) {
455
432
return {
456
InventoryChanges: {
457
...addCrewShipWeapon(inventory, typeName),
458
...occupySlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS, premiumPurchase)
459
}
433
...addCrewShipWeapon(inventory, typeName),
434
...occupySlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS, premiumPurchase)
460
435
};
461
436
}
462
437
if (typeName in ExportMisc.creditBundles) {
463
438
const creditsTotal = ExportMisc.creditBundles[typeName] * quantity;
464
439
inventory.RegularCredits += creditsTotal;
465
440
return {
466
InventoryChanges: {
467
RegularCredits: creditsTotal
468
}
441
RegularCredits: creditsTotal
469
442
};
470
443
}
471
444
if (typeName in ExportFusionBundles) {
472
445
const fusionPointsTotal = ExportFusionBundles[typeName].fusionPoints * quantity;
473
446
inventory.FusionPoints += fusionPointsTotal;
474
447
return {
475
InventoryChanges: {
476
FusionPoints: fusionPointsTotal
477
}
448
FusionPoints: fusionPointsTotal
478
449
};
479
450
}
480
451
if (typeName in ExportKeys) {
@@ -483,8 +454,8 @@ export const addItem = async (
483
454
484
455
if (key.chainStages) {
485
456
const key = addQuestKey(inventory, { ItemType: typeName });
486
if (!key) return { InventoryChanges: {} };
487
return { InventoryChanges: { QuestKeys: [key] } };
457
if (!key) return {};
458
return { QuestKeys: [key] };
488
459
} else {
489
460
const key = { ItemType: typeName, ItemCount: quantity };
490
461
@@ -494,19 +465,14 @@ export const addItem = async (
494
465
} else {
495
466
inventory.LevelKeys.push(key);
496
467
}
497
return { InventoryChanges: { LevelKeys: [key] } };
468
return { LevelKeys: [key] };
498
469
}
499
470
}
500
471
if (typeName in ExportDrones) {
501
const inventoryChanges = addDrone(inventory, typeName);
502
return {
503
InventoryChanges: inventoryChanges
504
};
472
return addDrone(inventory, typeName);
505
473
}
506
474
if (typeName in ExportEmailItems) {
507
return {
508
InventoryChanges: await addEmailItem(inventory, typeName)
509
};
475
return await addEmailItem(inventory, typeName);
510
476
}
511
477
512
478
// Path-based duck typing
@@ -515,42 +481,36 @@ export const addItem = async (
515
481
switch (typeName.substr(1).split("/")[2]) {
516
482
default: {
517
483
return {
518
InventoryChanges: {
519
...addPowerSuit(
520
inventory,
521
typeName,
522
{},
523
premiumPurchase ? EquipmentFeatures.DOUBLE_CAPACITY : undefined
524
),
525
...occupySlot(inventory, InventorySlot.SUITS, premiumPurchase)
526
}
484
...addPowerSuit(
485
inventory,
486
typeName,
487
{},
488
premiumPurchase ? EquipmentFeatures.DOUBLE_CAPACITY : undefined
489
),
490
...occupySlot(inventory, InventorySlot.SUITS, premiumPurchase)
527
491
};
528
492
}
529
493
case "Archwing": {
530
494
inventory.ArchwingEnabled = true;
531
495
return {
532
InventoryChanges: {
533
...addSpaceSuit(
534
inventory,
535
typeName,
536
{},
537
premiumPurchase ? EquipmentFeatures.DOUBLE_CAPACITY : undefined
538
),
539
...occupySlot(inventory, InventorySlot.SPACESUITS, premiumPurchase)
540
}
496
...addSpaceSuit(
497
inventory,
498
typeName,
499
{},
500
premiumPurchase ? EquipmentFeatures.DOUBLE_CAPACITY : undefined
501
),
502
...occupySlot(inventory, InventorySlot.SPACESUITS, premiumPurchase)
541
503
};
542
504
}
543
505
case "EntratiMech": {
544
506
return {
545
InventoryChanges: {
546
...addMechSuit(
547
inventory,
548
typeName,
549
{},
550
premiumPurchase ? EquipmentFeatures.DOUBLE_CAPACITY : undefined
551
),
552
...occupySlot(inventory, InventorySlot.MECHSUITS, premiumPurchase)
553
}
507
...addMechSuit(
508
inventory,
509
typeName,
510
{},
511
premiumPurchase ? EquipmentFeatures.DOUBLE_CAPACITY : undefined
512
),
513
...occupySlot(inventory, InventorySlot.MECHSUITS, premiumPurchase)
554
514
};
555
515
}
556
516
}
@@ -568,9 +528,7 @@ export const addItem = async (
568
528
];
569
529
addMods(inventory, changes);
570
530
return {
571
InventoryChanges: {
572
RawUpgrades: changes
573
}
531
RawUpgrades: changes
574
532
};
575
533
}
576
534
break;
@@ -587,9 +545,7 @@ export const addItem = async (
587
545
];
588
546
addMiscItems(inventory, miscItemChanges);
589
547
return {
590
InventoryChanges: {
591
MiscItems: miscItemChanges
592
}
548
MiscItems: miscItemChanges
593
549
};
594
550
} else {
595
551
const changes = [
@@ -600,9 +556,7 @@ export const addItem = async (
600
556
];
601
557
addMods(inventory, changes);
602
558
return {
603
InventoryChanges: {
604
RawUpgrades: changes
605
}
559
RawUpgrades: changes
606
560
};
607
561
}
608
562
}
@@ -613,9 +567,7 @@ export const addItem = async (
613
567
case "Types":
614
568
switch (typeName.substr(1).split("/")[2]) {
615
569
case "Sentinels": {
616
return {
617
InventoryChanges: addSentinel(inventory, typeName, premiumPurchase)
618
};
570
return addSentinel(inventory, typeName, premiumPurchase);
619
571
}
620
572
case "Game": {
621
573
if (typeName.substr(1).split("/")[3] == "Projections") {
@@ -629,9 +581,7 @@ export const addItem = async (
629
581
addMiscItems(inventory, miscItemChanges);
630
582
inventory.HasOwnedVoidProjectionsPreviously = true;
631
583
return {
632
InventoryChanges: {
633
MiscItems: miscItemChanges
634
}
584
MiscItems: miscItemChanges
635
585
};
636
586
}
637
587
break;
@@ -639,27 +589,23 @@ export const addItem = async (
639
589
case "NeutralCreatures": {
640
590
const horseIndex = inventory.Horses.push({ ItemType: typeName });
641
591
return {
642
InventoryChanges: {
643
Horses: [inventory.Horses[horseIndex - 1].toJSON<IEquipmentClient>()]
644
}
592
Horses: [inventory.Horses[horseIndex - 1].toJSON<IEquipmentClient>()]
645
593
};
646
594
}
647
595
case "Recipes": {
648
596
inventory.MiscItems.push({ ItemType: typeName, ItemCount: quantity });
649
597
return {
650
InventoryChanges: {
651
MiscItems: [
652
{
653
ItemType: typeName,
654
ItemCount: quantity
655
}
656
]
657
}
598
MiscItems: [
599
{
600
ItemType: typeName,
601
ItemCount: quantity
602
}
603
]
658
604
};
659
605
}
660
606
case "Vehicles":
661
607
if (typeName == "/Lotus/Types/Vehicles/Motorcycle/MotorcyclePowerSuit") {
662
return { InventoryChanges: addMotorcycle(inventory, typeName) };
608
return addMotorcycle(inventory, typeName);
663
609
}
664
610
break;
665
611
}
@@ -680,7 +626,7 @@ export const addItems = async (
680
626
} else {
681
627
inventoryDelta = await addItem(inventory, item.ItemType, item.ItemCount, true);
682
628
}
683
combineInventoryChanges(inventoryChanges, inventoryDelta.InventoryChanges);
629
combineInventoryChanges(inventoryChanges, inventoryDelta);
684
630
}
685
631
return inventoryChanges;
686
632
};
@@ -1388,12 +1334,11 @@ export const addKeyChainItems = async (
1388
1334
1389
1335
const nonStoreItems = keyChainItems.map(item => fromStoreItem(item));
1390
1336
1391
//TODO: inventoryChanges is not typed correctly
1392
const inventoryChanges = {};
1337
const inventoryChanges: IInventoryChanges = {};
1393
1338
1394
1339
for (const item of nonStoreItems) {
1395
1340
const inventoryChangesDelta = await addItem(inventory, item);
1396
combineInventoryChanges(inventoryChanges, inventoryChangesDelta.InventoryChanges);
1341
combineInventoryChanges(inventoryChanges, inventoryChangesDelta);
1397
1342
}
1398
1343
1399
1344
return inventoryChanges;
@@ -333,7 +333,7 @@ export const handleStoreItemAcquisition = async (
333
333
}
334
334
switch (storeCategory) {
335
335
default: {
336
purchaseResponse = await addItem(inventory, internalName, quantity, true);
336
purchaseResponse = { InventoryChanges: await addItem(inventory, internalName, quantity, true) };
337
337
break;
338
338
}
339
339
case "Types":
@@ -418,10 +418,7 @@ const handleBoosterPackPurchase = async (
418
418
if (typeName == "/Lotus/Types/BoosterPacks/1999StickersPackEchoesArchimedeaFixed") {
419
419
for (const result of pack.components) {
420
420
purchaseResponse.BoosterPackItems += toStoreItem(result.Item) + ',{"lvl":0};';
421
combineInventoryChanges(
422
purchaseResponse.InventoryChanges,
423
(await addItem(inventory, result.Item, 1)).InventoryChanges
424
);
421
combineInventoryChanges(purchaseResponse.InventoryChanges, await addItem(inventory, result.Item, 1));
425
422
}
426
423
} else {
427
424
for (let i = 0; i != quantity; ++i) {
@@ -432,7 +429,7 @@ const handleBoosterPackPurchase = async (
432
429
purchaseResponse.BoosterPackItems += toStoreItem(result.Item) + ',{"lvl":0};';
433
430
combineInventoryChanges(
434
431
purchaseResponse.InventoryChanges,
435
(await addItem(inventory, result.Item, 1)).InventoryChanges
432
await addItem(inventory, result.Item, 1)
436
433
);
437
434
}
438
435
}
@@ -468,7 +465,7 @@ const handleTypesPurchase = async (
468
465
logger.debug(`type category ${typeCategory}`);
469
466
switch (typeCategory) {
470
467
default:
471
return await addItem(inventory, typesName, quantity);
468
return { InventoryChanges: await addItem(inventory, typesName, quantity) };
472
469
case "BoosterPacks":
473
470
return handleBoosterPackPurchase(typesName, inventory, quantity);
474
471
case "SlotItems":