diff --git a/config.json b/config.json index 7ce17384..7f78869d 100644 --- a/config.json +++ b/config.json @@ -7,5 +7,6 @@ "skipStoryModeChoice": true, "skipTutorial": true, "testMission": true, - "testQuestKey": true + "testQuestKey": true, + "testShipFeature": true } diff --git a/package-lock.json b/package-lock.json index 44a892f2..5b96b4e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "dependencies": { "dotenv": "^16.1.3", "express": "^5.0.0-beta.1", - "mongoose": "^7.1.1" + "mongoose": "^7.1.1", + "warframe-items": "^1.1260.50" }, "devDependencies": { "@tsconfig/node20": "^1.0.0", @@ -3140,6 +3141,11 @@ "node": ">= 0.8" } }, + "node_modules/warframe-items": { + "version": "1.1260.50", + "resolved": "https://registry.npmjs.org/warframe-items/-/warframe-items-1.1260.50.tgz", + "integrity": "sha512-03oNB6Yg61yUd7glewUUg0avnaGaAqc9oVPJk+1THFB0o/d4ppQSgL38yTUxMwmw0avCrqd+8z5TMrfXtvPDXQ==" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index 8f7a8281..ed3c35ba 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "dependencies": { "dotenv": "^16.1.3", "express": "^5.0.0-beta.1", - "mongoose": "^7.1.1" + "mongoose": "^7.1.1", + "warframe-items": "^1.1260.50" }, "devDependencies": { "@tsconfig/node20": "^1.0.0", diff --git a/src/controllers/api/getShipController.ts b/src/controllers/api/getShipController.ts index 2da6f8b2..89dd9557 100644 --- a/src/controllers/api/getShipController.ts +++ b/src/controllers/api/getShipController.ts @@ -1,7 +1,12 @@ +import { RequestHandler } from "express"; + import { Account } from "@/src/models/loginModel"; import { Ship } from "@/src/models/shipModel"; + import { createShip } from "@/src/services/shipService"; -import { RequestHandler } from "express"; + +import config from "@/config.json"; +import testShipFeature from "@/static/fixed_responses/testShipFeature.json"; // eslint-disable-next-line @typescript-eslint/no-misused-promises const getShipController: RequestHandler = async (_req, res) => { @@ -16,6 +21,13 @@ const getShipController: RequestHandler = async (_req, res) => { return; } } + + if (ship) { + const new_ship = ship; + if (config.testMission) new_ship.Ship.Features = testShipFeature; + res.json(new_ship); + return; + } res.json(ship); }; diff --git a/src/controllers/api/purchaseController.ts b/src/controllers/api/purchaseController.ts index 7f0902e2..3602e201 100644 --- a/src/controllers/api/purchaseController.ts +++ b/src/controllers/api/purchaseController.ts @@ -1,8 +1,17 @@ -import purchase from "@/static/fixed_responses/purchase.json"; +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +import { PurchaseItem } from "@/src/services/tradeService"; import { Request, Response } from "express"; const purchaseController = (_req: Request, res: Response): void => { - res.json(purchase); + const body = JSON.parse(_req.body); + const response = PurchaseItem( + body.PurchaseParams.StoreItem, + body.PurchaseParams.Quantity, + body.PurchaseParams.UsePremium, + body.PurchaseParams.ExpectedPrice + ); + res.json({ InventoryChanges: response }); }; export { purchaseController }; diff --git a/src/helpers/general.ts b/src/helpers/general.ts index 8aa19a1a..46fabbd2 100644 --- a/src/helpers/general.ts +++ b/src/helpers/general.ts @@ -1,3 +1,6 @@ +import mongoose from "mongoose"; +import { Oid } from "../types/commonTypes"; + const isString = (text: unknown): text is string => { return typeof text === "string" || text instanceof String; }; @@ -55,4 +58,15 @@ const parseBoolean = (booleanCandidate: unknown): boolean => { return booleanCandidate; }; -export { isString, isNumber, parseString, parseNumber, parseDateNumber, parseBoolean, parseEmail }; +const generateOid = (str?: string): Oid => { + const objectId: Oid = { + $oid: new mongoose.Types.ObjectId().toString() + }; + if (str) { + objectId.$oid = str; + } + //console.log(objectId); + return objectId; +}; + +export { isString, isNumber, parseString, parseNumber, parseDateNumber, parseBoolean, parseEmail, generateOid }; diff --git a/src/services/tradeService.ts b/src/services/tradeService.ts new file mode 100644 index 00000000..1b0ff555 --- /dev/null +++ b/src/services/tradeService.ts @@ -0,0 +1,77 @@ +import { Item, Misc, Skin, Warframe, Weapon } from "warframe-items"; +import { InventoryChanges, StoreItem } from "../types/commonTypes"; +import { generateOid, parseString } from "../helpers/general"; + +const PurchaseItem = (item: Item, quantity: number, usePremium: boolean, price: number): InventoryChanges => { + // {"InventoryChanges":{"WishlistChanges":["/Lotus/Types/StoreItems/SuitCustomizations/ColourPickerItem"],"FlavourItems":[{"ItemType":"/Lotus/Types/StoreItems/SuitCustomizations/ColourPickerItem"}],"PremiumCredits":-75}} + + const newInventoryChanges: InventoryChanges = {}; + if ((item as Warframe).productCategory == "Suits") { + const newSuits: StoreItem[] = [ + { + ItemType: item.uniqueName, + Cofigs: [], + ItemId: generateOid() + } + ]; + newInventoryChanges.Suits = newSuits; + } + if ((item as Weapon).productCategory == "LongGuns") { + const newLongGuns: StoreItem[] = [ + { + ItemType: item.uniqueName, + Cofigs: [], + ItemId: generateOid() + } + ]; + newInventoryChanges.LongGuns = newLongGuns; + } + if ((item as Weapon).productCategory == "Pistols") { + const newPistols: StoreItem[] = [ + { + ItemType: item.uniqueName, + Cofigs: [], + ItemId: generateOid() + } + ]; + newInventoryChanges.Pistols = newPistols; + } + if ((item as Weapon).productCategory == "Melee") { + const newMelee: StoreItem[] = [ + { + ItemType: item.uniqueName, + Cofigs: [], + ItemId: generateOid() + } + ]; + newInventoryChanges.Melee = newMelee; + } + if (item as Misc) { + const newMisc: StoreItem[] = [ + { + ItemType: item.uniqueName, + ItemCount: quantity + } + ]; + newInventoryChanges.MiscItems = newMisc; + } + if (item as Skin) { + newInventoryChanges.WishlistChanges = []; + newInventoryChanges.WishlistChanges.push(parseString(item.uniqueName)); + const newFlavourItem: StoreItem[] = [ + { + ItemType: item.uniqueName + } + ]; + newInventoryChanges.FlavourItems = newFlavourItem; + } + if (usePremium) { + newInventoryChanges.PremiumCredits = -price; + } + if (!usePremium) { + newInventoryChanges.RegularCredits = -price; + } + return newInventoryChanges; +}; + +export { PurchaseItem }; diff --git a/src/types/commonTypes.ts b/src/types/commonTypes.ts index 4c1a7bf7..a8eed210 100644 --- a/src/types/commonTypes.ts +++ b/src/types/commonTypes.ts @@ -1,3 +1,25 @@ +import { CrewShipSalvageBinClass, SuitConfig } from "./inventoryTypes"; + export interface Oid { $oid: string; } + +export interface StoreItem { + ItemType?: string; + ItemId?: Oid; + ItemCount?: number; + Cofigs?: SuitConfig[]; +} + +export interface InventoryChanges { + WeaponBin?: CrewShipSalvageBinClass; + WishlistChanges?: string[]; + FlavourItems?: StoreItem[]; + Suits?: StoreItem[]; + LongGuns?: StoreItem[]; + Pistols?: StoreItem[]; + Melee?: StoreItem[]; + MiscItems?: StoreItem[]; + PremiumCredits?: number; + RegularCredits?: number; +} diff --git a/static/fixed_responses/testShipFeature.json b/static/fixed_responses/testShipFeature.json new file mode 100644 index 00000000..cb26da71 --- /dev/null +++ b/static/fixed_responses/testShipFeature.json @@ -0,0 +1,58 @@ +[ + "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AdvancedOrdisFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AlchemyRoomFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/AlertsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/CeresNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ClanFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ErisNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/EuropaNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryConcurrentBuildFormaFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryItem", + "/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/JupiterNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarketTierOneFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarketTierTwoFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MarsNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsFusionFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ModsTransmuteFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/NeptuneNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PhobosNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/PlutoNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodBraceFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHullFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleLeftFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleRightFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackTailFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/RailjackCephalonShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SaturnNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SednaNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/ShipFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/SolarChartFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/UranusNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/VenusNavigationFeatureItem", + "/Lotus/Types/Items/ShipFeatureItems/VoidProjectionFeatureItem" +] \ No newline at end of file