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

chore: make addItem return InventoryChanges directly (#1299)

Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1299

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

代码差异

5 个文件 +76 -134
Modified src/controllers/api/claimCompletedRecipeController.ts +1 -1
@@ -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 });
Modified src/controllers/api/giveStartingGearController.ts +1 -1
@@ -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;
Modified src/controllers/api/guildTechController.ts +1 -1
@@ -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 });
Modified src/services/inventoryService.ts +69 -124
@@ -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;
Modified src/services/purchaseService.ts +4 -7
@@ -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":