2025-02-18 17:14:42 -08:00
import { addString } from "@/src/controllers/api/inventoryController" ;
import { getInventory } from "@/src/services/inventoryService" ;
import { getAccountIdForRequest } from "@/src/services/loginService" ;
2025-02-19 14:09:47 -08:00
import { addQuestKey , completeQuest , IUpdateQuestRequest , updateQuestKey } from "@/src/services/questService" ;
2025-02-18 17:14:42 -08:00
import { logger } from "@/src/utils/logger" ;
import { RequestHandler } from "express" ;
import { ExportKeys } from "warframe-public-export-plus" ;
export const manageQuestsController : RequestHandler = async ( req , res ) = > {
const accountId = await getAccountIdForRequest ( req ) ;
const operation = req . query . operation as
| "unlockAll"
| "completeAll"
| "ResetAll"
| "completeAllUnlocked"
2025-02-21 05:30:13 -08:00
| "updateKey"
| "giveAll" ;
2025-02-18 17:14:42 -08:00
const questKeyUpdate = req . body as IUpdateQuestRequest [ "QuestKeys" ] ;
const allQuestKeys : string [ ] = [ ] ;
for ( const [ k , v ] of Object . entries ( ExportKeys ) ) {
if ( "chainStages" in v ) {
allQuestKeys . push ( k ) ;
}
}
2025-02-19 14:09:47 -08:00
const inventory = await getInventory ( accountId ) ;
2025-02-18 17:14:42 -08:00
switch ( operation ) {
case "updateKey" : {
//TODO: if this is intended to be used, one needs to add a updateQuestKeyMultiple, the game does never intend to do it, so it errors for multiple keys.
updateQuestKey ( inventory , questKeyUpdate ) ;
break ;
}
case "unlockAll" : {
for ( const questKey of allQuestKeys ) {
addQuestKey ( inventory , { ItemType : questKey , Completed : false , unlock : true , Progress : [ ] } ) ;
}
break ;
}
case "completeAll" : {
logger . info ( "completing all quests.." ) ;
for ( const questKey of allQuestKeys ) {
2025-02-19 14:09:47 -08:00
try {
await completeQuest ( inventory , questKey ) ;
} catch ( error ) {
if ( error instanceof Error ) {
logger . error (
` Something went wrong completing quest ${ questKey } , probably could not add some item `
) ;
logger . error ( error . message ) ;
}
}
//Skip "Watch The Maker"
if ( questKey === "/Lotus/Types/Keys/NewWarIntroQuest/NewWarIntroKeyChain" ) {
addString (
inventory . NodeIntrosCompleted ,
"/Lotus/Levels/Cinematics/NewWarIntro/NewWarStageTwo.level"
) ;
}
if ( questKey === "/Lotus/Types/Keys/ArchwingQuest/ArchwingQuestKeyChain" ) {
inventory . ArchwingEnabled = true ;
2025-02-18 17:14:42 -08:00
}
}
break ;
}
case "ResetAll" : {
logger . info ( "resetting all quests.." ) ;
for ( const questKey of inventory . QuestKeys ) {
questKey . Completed = false ;
questKey . Progress = [ ] ;
2025-02-21 05:30:13 -08:00
questKey . CompletionDate = undefined ;
2025-02-18 17:14:42 -08:00
}
2025-02-19 14:09:47 -08:00
inventory . ActiveQuest = "" ;
2025-02-18 17:14:42 -08:00
break ;
}
case "completeAllUnlocked" : {
logger . info ( "completing all unlocked quests.." ) ;
for ( const questKey of inventory . QuestKeys ) {
2025-02-19 14:09:47 -08:00
try {
await completeQuest ( inventory , questKey . ItemType ) ;
} catch ( error ) {
if ( error instanceof Error ) {
logger . error (
` Something went wrong completing quest ${ questKey . ItemType } , probably could not add some item `
) ;
logger . error ( error . message ) ;
}
}
//Skip "Watch The Maker"
if ( questKey . ItemType === "/Lotus/Types/Keys/NewWarIntroQuest/NewWarIntroKeyChain" ) {
addString (
inventory . NodeIntrosCompleted ,
"/Lotus/Levels/Cinematics/NewWarIntro/NewWarStageTwo.level"
) ;
}
if ( questKey . ItemType === "/Lotus/Types/Keys/ArchwingQuest/ArchwingQuestKeyChain" ) {
inventory . ArchwingEnabled = true ;
}
2025-02-18 17:14:42 -08:00
}
break ;
}
2025-02-21 05:30:13 -08:00
case "giveAll" : {
for ( const questKey of allQuestKeys ) {
addQuestKey ( inventory , { ItemType : questKey } ) ;
}
break ;
}
2025-02-18 17:14:42 -08:00
}
await inventory . save ( ) ;
res . status ( 200 ) . end ( ) ;
} ;