SpaceNinjaServer/src/services/questService.ts
Ordis 1413a6bcc2 feat: move quest cheats to webui (#963)
Co-authored-by: Sainan <sainan@calamity.inc>
Reviewed-on: OpenWF/SpaceNinjaServer#963
Co-authored-by: Ordis <134585663+OrdisPrime@users.noreply.github.com>
Co-committed-by: Ordis <134585663+OrdisPrime@users.noreply.github.com>
2025-02-18 17:14:42 -08:00

73 lines
2.5 KiB
TypeScript

import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
import { IInventoryDatabase, IQuestKeyDatabase, IQuestStage } from "@/src/types/inventoryTypes/inventoryTypes";
import { logger } from "@/src/utils/logger";
import { HydratedDocument } from "mongoose";
export interface IUpdateQuestRequest {
QuestKeys: Omit<IQuestKeyDatabase, "CompletionDate">[];
PS: string;
questCompletion: boolean;
PlayerShipEvents: unknown[];
crossPlaySetting: string;
DoQuestReward: boolean;
}
export const updateQuestKey = (
inventory: HydratedDocument<IInventoryDatabase>,
questKeyUpdate: IUpdateQuestRequest["QuestKeys"]
): void => {
if (questKeyUpdate.length > 1) {
logger.error(`more than 1 quest key not supported`);
throw new Error("more than 1 quest key not supported");
}
const questKeyIndex = inventory.QuestKeys.findIndex(questKey => questKey.ItemType === questKeyUpdate[0].ItemType);
if (questKeyIndex === -1) {
throw new Error(`quest key ${questKeyUpdate[0].ItemType} not found`);
}
inventory.QuestKeys[questKeyIndex] = questKeyUpdate[0];
if (questKeyUpdate[0].Completed) {
inventory.QuestKeys[questKeyIndex].CompletionDate = new Date();
}
};
export const updateQuestStage = (
inventory: TInventoryDatabaseDocument,
{ KeyChain, ChainStage }: IKeyChainRequest,
questStageUpdate: IQuestStage
): void => {
const quest = inventory.QuestKeys.find(quest => quest.ItemType === KeyChain);
if (!quest) {
throw new Error(`Quest ${KeyChain} not found in QuestKeys`);
}
if (!quest.Progress) {
throw new Error(`Progress should always exist when giving keychain triggered items or messages`);
}
const questStage = quest.Progress[ChainStage];
if (!questStage) {
const questStageIndex = quest.Progress.push(questStageUpdate) - 1;
if (questStageIndex !== ChainStage) {
throw new Error(`Quest stage index mismatch: ${questStageIndex} !== ${ChainStage}`);
}
return;
}
Object.assign(questStage, questStageUpdate);
};
export const addQuestKey = (inventory: TInventoryDatabaseDocument, questKey: IQuestKeyDatabase): void => {
if (inventory.QuestKeys.some(q => q.ItemType === questKey.ItemType)) {
logger.error(`quest key ${questKey.ItemType} already exists`);
return;
}
inventory.QuestKeys.push(questKey);
};