From f49fb0e4dab8c967656f0e9e1fa9e55ce515aaf1 Mon Sep 17 00:00:00 2001 From: wancat Date: Sat, 11 Nov 2023 16:04:04 +0800 Subject: [PATCH] feat: finishSession and allow user command after finished --- .../src/api/controllers/commandController.js | 10 ++++++++++ server/src/game/sessionHandler.js | 5 ----- server/src/game/sessionManager.js | 20 +++++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/server/src/api/controllers/commandController.js b/server/src/api/controllers/commandController.js index 2435176..6e7aa4d 100644 --- a/server/src/api/controllers/commandController.js +++ b/server/src/api/controllers/commandController.js @@ -1,6 +1,7 @@ import { Command, Session } from '@linux-odyssey/models' import CommandHandler from '../../game/commandHandler.js' import { pushToSession } from '../socket.js' +import { finishSession } from '../../game/sessionManager.js' const commandCompleteCallbacks = new Map() @@ -21,6 +22,11 @@ export async function newCommand(req, res) { return } + if (session.status === 'finished') { + // Allow commands to be sent to finished sessions + res.status(200).end() + return + } if (session.status !== 'active') { res.status(400).json({ message: 'session is not active' }) return @@ -45,6 +51,10 @@ export async function newCommand(req, res) { if (response) { c.stage = response.stage await c.save() + + if (response.stage === 'END') { + await finishSession(session) + } commandCompleteCallbacks.set(session.id, response.callback) pushToSession(session.id, 'status', 'pending') } diff --git a/server/src/game/sessionHandler.js b/server/src/game/sessionHandler.js index 7b11e1e..053126c 100644 --- a/server/src/game/sessionHandler.js +++ b/server/src/game/sessionHandler.js @@ -49,11 +49,6 @@ export default class SessionHandler { this.session.hints.push(...stage.hints) - if (stage.id === 'END') { - this.session.status = 'finished' - this.session.finishedAt = new Date() - } - this.addNewTasks() return { diff --git a/server/src/game/sessionManager.js b/server/src/game/sessionManager.js index 6ab8c7c..6fe800e 100644 --- a/server/src/game/sessionManager.js +++ b/server/src/game/sessionManager.js @@ -79,3 +79,23 @@ export async function getOrCreateActiveSession(user, questId) { } return createNewSession(user, questId) } + +export async function finishSession(session) { + session.status = 'finished' + await session.save() + + const userProfile = await UserProfile.findOne({ user: session.user }) + if (!userProfile) { + throw new Error(`UserProfile ${session.user} not found`) + } + + const progress = userProfile.progress.get(session.quest) + if (!progress) { + throw new Error(`Progress ${session.quest} not found`) + } + if (!progress.completed) { + progress.finishedAt = new Date() + progress.completed = true + } + await userProfile.save() +}