diff --git a/src/controllers/api/giveKeyChainTriggeredItemsController.ts b/src/controllers/api/giveKeyChainTriggeredItemsController.ts index 8e391b01..bff70c85 100644 --- a/src/controllers/api/giveKeyChainTriggeredItemsController.ts +++ b/src/controllers/api/giveKeyChainTriggeredItemsController.ts @@ -10,7 +10,7 @@ export const giveKeyChainTriggeredItemsController: RequestHandler = async (req, const keyChainInfo = getJSONfromString((req.body as string).toString()); const inventory = await getInventory(accountId); - const inventoryChanges = giveKeyChainItem(inventory, keyChainInfo); + const inventoryChanges = await giveKeyChainItem(inventory, keyChainInfo); await inventory.save(); res.send(inventoryChanges); diff --git a/src/controllers/custom/manageQuestsController.ts b/src/controllers/custom/manageQuestsController.ts index 49283bf3..edf1feae 100644 --- a/src/controllers/custom/manageQuestsController.ts +++ b/src/controllers/custom/manageQuestsController.ts @@ -13,7 +13,8 @@ export const manageQuestsController: RequestHandler = async (req, res) => { | "completeAll" | "ResetAll" | "completeAllUnlocked" - | "updateKey"; + | "updateKey" + | "giveAll"; const questKeyUpdate = req.body as IUpdateQuestRequest["QuestKeys"]; const allQuestKeys: string[] = []; @@ -71,6 +72,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => { for (const questKey of inventory.QuestKeys) { questKey.Completed = false; questKey.Progress = []; + questKey.CompletionDate = undefined; } inventory.ActiveQuest = ""; break; @@ -78,7 +80,6 @@ export const manageQuestsController: RequestHandler = async (req, res) => { case "completeAllUnlocked": { logger.info("completing all unlocked quests.."); for (const questKey of inventory.QuestKeys) { - console.log("size of questkeys", inventory.QuestKeys.length); try { await completeQuest(inventory, questKey.ItemType); } catch (error) { @@ -105,6 +106,12 @@ export const manageQuestsController: RequestHandler = async (req, res) => { inventory.ActiveQuest = ""; break; } + case "giveAll": { + for (const questKey of allQuestKeys) { + addQuestKey(inventory, { ItemType: questKey }); + } + break; + } } await inventory.save(); diff --git a/src/services/configService.ts b/src/services/configService.ts index d046a1ee..bb4d5c96 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -33,9 +33,9 @@ interface IConfig { httpPort?: number; httpsPort?: number; myIrcAddresses?: string[]; - platformCDNs: string[]; - hubAddress: string; - NRS: string[]; + platformCDNs?: string[]; + hubAddress?: string; + NRS?: string[]; administratorNames?: string[] | string; autoCreateAccount?: boolean; skipTutorial?: boolean; diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index b98f7a4c..766518e2 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -26,6 +26,8 @@ import { getLevelKeyRewards, getNode } from "@/src/services/itemDataService"; import { InventoryDocumentProps, TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { getEntriesUnsafe } from "@/src/utils/ts-utils"; import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import junctionRewards from "@/static/fixed_responses/junctionRewards.json"; +import { IJunctionRewards } from "@/src/types/commonTypes"; const getRotations = (rotationCount: number): number[] => { if (rotationCount === 0) return [0]; @@ -273,6 +275,20 @@ export const addMissionRewards = async ( } } + if (rewardInfo.node in junctionRewards) { + const junctionReward = (junctionRewards as IJunctionRewards)[rewardInfo.node]; + for (const item of junctionReward.items) { + MissionRewards.push({ + StoreItem: item.ItemType, + ItemCount: item.ItemCount + }); + } + if (junctionReward.credits) { + inventory.RegularCredits += junctionReward.credits; + missionCompletionCredits += junctionReward.credits; + } + } + for (const reward of MissionRewards) { //TODO: additem should take in storeItems const inventoryChange = await addItem(inventory, reward.StoreItem.replace("StoreItems/", ""), reward.ItemCount); diff --git a/src/services/questService.ts b/src/services/questService.ts index e51eb70a..0446e273 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -138,6 +138,8 @@ export const giveKeyChainItem = async (inventory: TInventoryDatabaseDocument, ke // items were added: update quest stage's i (item was given) updateQuestStage(inventory, keyChainInfo, { i: true }); + return inventoryChanges; + //TODO: Check whether Wishlist is used to track items which should exist uniquely in the inventory /* some items are added or removed (not sure) to the wishlist, in that case a diff --git a/src/types/commonTypes.ts b/src/types/commonTypes.ts index eebd9410..5ac1cac3 100644 --- a/src/types/commonTypes.ts +++ b/src/types/commonTypes.ts @@ -1,3 +1,5 @@ +import { ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes"; + export interface IOid { $oid: string; } @@ -7,3 +9,10 @@ export interface IMongoDate { $numberLong: string; }; } + +export interface IReward { + items: ITypeCount[]; + credits: number; +} + +export type IJunctionRewards = Record; diff --git a/src/types/loginTypes.ts b/src/types/loginTypes.ts index 728fde52..687d611e 100644 --- a/src/types/loginTypes.ts +++ b/src/types/loginTypes.ts @@ -39,11 +39,11 @@ export interface ILoginResponse extends IAccountAndLoginResponseCommons { Groups: IGroup[]; BuildLabel: string; MatchmakingBuildId: string; - platformCDNs: string[]; - NRS: string[]; + platformCDNs?: string[]; + NRS?: string[]; DTLS: number; IRC: string[]; - HUB: string; + HUB?: string; } export interface IGroup { diff --git a/static/fixed_responses/junctionRewards.json b/static/fixed_responses/junctionRewards.json new file mode 100644 index 00000000..e09c56a6 --- /dev/null +++ b/static/fixed_responses/junctionRewards.json @@ -0,0 +1,120 @@ +{ + "VenusToMercuryJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/InfestedIntroQuest/InfestedIntroQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Keys/KubrowQuest/KubrowQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Rifle/BoltoRifle", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarShieldRechargeRateMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityEfficiencyMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Game/KubrowPet/EggHatcher", "ItemCount": 1 } + ], + "credits": 10000 + }, + "EarthToVenusJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/FurisBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponFreezeDamageMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponElectricityDamageMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/SentinelRecipes/TnSentinelCrossBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/MeleeTrees/StaffCmbOneMeleeTree", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerEnergyHealthRegenAuraMod", "ItemCount": 1 } + ], + "credits": 5000 + }, + "EarthToMarsJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/ArchwingQuest/ArchwingQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Game/KubrowPet/EggHatcher", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/VoidProjectionFeatureItem", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Game/Projections/T1VoidProjectionRevenantPrimeABronze", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/HammerWeapon", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/MeleeTrees/IronPhoenixMeleeTree", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Keys/InfestedMicroplanetQuest/InfestedMicroplanetQuestKeyChain", "ItemCount": 1 } + ], + "credits": 15000 + }, + "MarsToCeresJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/GrnSniperRifleBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponToxinDamageMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Weapons/Tenno/Melee/MeleeTrees/DualSwordCmbOneMeleeTree", "ItemCount": 1 } + ], + "credits": 20000 + }, + "MarsToPhobosJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/SpyQuestKeyChain/SpyQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/GrnHeavyPistolBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/StoreItems/Consumables/CipherBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponReloadSpeedMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarLootRadarMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", "ItemCount": 1 } + ], + "credits": 20000 + }, + "JupiterToEuropaJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/LimboQuest/LimboQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Keys/DragonQuest/DragonQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/CorpusMinigunBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerHealthAuraMod", "ItemCount": 1 } + ], + "credits": 40000 + }, + "JupiterToSaturnJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/GrenadeLauncherBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Keys/ProteaQuest/ProteaQuestKeyChain", "ItemCount": 1 } + ], + "credits": 40000 + }, + "SaturnToUranusJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/CorpusWhipBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaHelmetBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Keys/DuviriQuest/DuviriQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit", "ItemCount": 1 } + ], + "credits": 60000 + }, + "UranusToNeptuneJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/OrokinMoonQuest/OrokinMoonQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/ReconnasorBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaChassisBlueprint", "ItemCount": 1 } + ], + "credits": 80000 + }, + "NeptuneToPlutoJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/GrineerFlakCannonBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaSystemsBlueprint", "ItemCount": 1 } + ], + "credits": 80000 + }, + "PlutoToSednaJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/WarWithinQuest/WarWithinQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Keys/MirageQuest/MirageQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/DualDaggerBlueprint", "ItemCount": 1 } + ], + "credits": 100000 + }, + "PlutoToErisJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Keys/InfestedAladVQuest/InfestedAladVQuestKeyChain", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/MireSwordBlueprint", "ItemCount": 1 } + ], + "credits": 100000 + }, + "CeresToJupiterJunction": { + "items": [ + { "ItemType": "/Lotus/StoreItems/Types/Recipes/Weapons/GrnStaffBlueprint", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Suit/ArchwingSuitHealthMaxMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Rifle/ArchwingRifleDamageAmountMod", "ItemCount": 1 }, + { "ItemType": "/Lotus/StoreItems/Upgrades/Mods/Archwing/Melee/ArchwingMeleeDamageMod", "ItemCount": 1 } + ], + "credits": 30000 + } +} diff --git a/static/webui/index.html b/static/webui/index.html index 6af03e3c..081ca3d2 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -539,10 +539,12 @@
- - - - + + + + + +
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 70203a0f..77cadccc 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -118,10 +118,11 @@ dict = { cheats_changeButton: `Change`, cheats_none: `None`, cheats_quests: `Quests`, - cheats_quests_UnlockAll: `Unlock All Quests`, - cheats_quests_CompleteAll: `Complete All Quests`, - cheats_quests_CompleteAllUnlocked: `Complete All Unlocked Quests`, - cheats_quests_ResetAll: `Reset All Quests`, + cheats_quests_unlockAll: `Unlock All Quests`, + cheats_quests_completeAll: `Complete All Quests`, + cheats_quests_completeAllUnlocked: `Complete All Unlocked Quests`, + cheats_quests_resetAll: `Reset All Quests`, + cheats_quests_giveAll: `Give All Quests`, import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.`, import_submit: `Submit` };