From 28814466702e628ba45e701176861a5802fe6ac0 Mon Sep 17 00:00:00 2001 From: AKCore Date: Sat, 3 Jun 2023 17:50:58 -0700 Subject: [PATCH] basic session management completed multiplayer joining fine --- .../api/deleteSessionController.ts | 6 +- src/controllers/api/findSessionsController.ts | 35 +++- .../api/getNewRewardSeedController.ts | 8 +- src/controllers/api/hostSessionController.ts | 5 +- src/controllers/api/joinSessionController.ts | 12 ++ src/controllers/api/logoutController.ts | 5 +- .../api/updateSessionController.ts | 6 +- src/managers/sessionManager.ts | 157 ++++++++++++++++++ src/routes/api.ts | 3 + 9 files changed, 228 insertions(+), 9 deletions(-) create mode 100644 src/controllers/api/joinSessionController.ts create mode 100644 src/managers/sessionManager.ts diff --git a/src/controllers/api/deleteSessionController.ts b/src/controllers/api/deleteSessionController.ts index ba062e88..6f5a8bc4 100644 --- a/src/controllers/api/deleteSessionController.ts +++ b/src/controllers/api/deleteSessionController.ts @@ -1,7 +1,11 @@ import { RequestHandler } from "express"; +import { deleteSession } from '@/src/managers/sessionManager'; const deleteSessionController: RequestHandler = (_req, res) => { - res.json({ sessionId: { $oid: "64768f104722f795300c9fc0" }, rewardSeed: 5867309943877621023 }); + + //res.json({ sessionId: { $oid: "64768f104722f795300c9fc0" }, rewardSeed: 5867309943877621023 }); + deleteSession(_req.query.sessionId as string); + res.sendStatus(200); }; export { deleteSessionController }; diff --git a/src/controllers/api/findSessionsController.ts b/src/controllers/api/findSessionsController.ts index 32b1cf33..1ddd36e7 100644 --- a/src/controllers/api/findSessionsController.ts +++ b/src/controllers/api/findSessionsController.ts @@ -1,9 +1,42 @@ import { RequestHandler } from "express"; +import { getSession } from '@/src/managers/sessionManager'; const findSessionsController: RequestHandler = (_req, res) => { + console.log("FindSession Request:", JSON.parse(_req.body)); + let r = JSON.parse(_req.body); + if(r != undefined) + { + console.log("Found ID"); + let s = getSession(r.id); + + if(s) + res.json({"queryId":r.queryId,"Sessions":s}); + else + res.json({}); + } + else if(r != undefined) + { + console.log("Found OriginalSessionID"); + + let s = getSession(r.originalSessionId); + if(s) + res.json({"queryId":r.queryId,"Sessions":[s]}); + else + res.json({}); + + } + else + { + console.log("Found SessionRequest"); + + let s = getSession(_req.body); + if(s) + res.json({"queryId":r.queryId,"Sessions":[s]}); + else + res.json({}); + } - res.json({ sessionId: { $oid: "64768f104722f795300c9fc0" }, rewardSeed: 5867309943877621023 }); }; export { findSessionsController }; diff --git a/src/controllers/api/getNewRewardSeedController.ts b/src/controllers/api/getNewRewardSeedController.ts index d700ac5d..716bc54b 100644 --- a/src/controllers/api/getNewRewardSeedController.ts +++ b/src/controllers/api/getNewRewardSeedController.ts @@ -1,7 +1,13 @@ import { RequestHandler } from "express"; const getNewRewardSeedController: RequestHandler = (_req, res) => { - res.json({ rewardSeed: 5867309943877621023 }); + res.json({ rewardSeed: 1111111111 }); }; +function generateRewardSeed(): number { + const min = -Number.MAX_SAFE_INTEGER; + const max = Number.MAX_SAFE_INTEGER; + return Math.floor(Math.random() * (max - min + 1)) + min; + } + export { getNewRewardSeedController }; diff --git a/src/controllers/api/hostSessionController.ts b/src/controllers/api/hostSessionController.ts index bbeb8eb7..797ea433 100644 --- a/src/controllers/api/hostSessionController.ts +++ b/src/controllers/api/hostSessionController.ts @@ -1,9 +1,12 @@ import { RequestHandler } from "express"; +import { createNewSession } from '@/src/managers/sessionManager'; const hostSessionController: RequestHandler = (_req, res) => { console.log("HostSession Request:", JSON.parse(_req.body)); + let session = createNewSession(JSON.parse(_req.body), _req.query.accountId as string); + console.log("New Session Created: ", session); - res.json({ sessionId: { $oid: "64768f104722f795300c9fc0" }, rewardSeed: 5867309943877621023 }); + res.json({ sessionId: { $oid: session.sessionId }, rewardSeed:99999999 }); }; export { hostSessionController }; diff --git a/src/controllers/api/joinSessionController.ts b/src/controllers/api/joinSessionController.ts new file mode 100644 index 00000000..726622f8 --- /dev/null +++ b/src/controllers/api/joinSessionController.ts @@ -0,0 +1,12 @@ +import { RequestHandler } from "express"; +import { getSessionByID } from '@/src/managers/sessionManager'; + +const joinSessionController: RequestHandler = (_req, res) => { + + console.log("JoinSession Request:", JSON.parse(_req.body)); + let r = JSON.parse(_req.body); + let s = getSessionByID(r.sessionIds[0]) + res.json({"rewardSeed":s?.rewardSeed,"sessionId":{"$oid":s?.sessionId}}); +}; + +export { joinSessionController }; \ No newline at end of file diff --git a/src/controllers/api/logoutController.ts b/src/controllers/api/logoutController.ts index 615008a5..e41ac656 100644 --- a/src/controllers/api/logoutController.ts +++ b/src/controllers/api/logoutController.ts @@ -1,12 +1,11 @@ import { RequestHandler } from "express"; const logoutController: RequestHandler = (_req, res) => { - const data = Buffer.from([0x31]); res.writeHead(200, { "Content-Type": "text/html", - "Content-Length": data.length + "Content-Length": 1 }); - res.end(data); + res.end("1"); }; export { logoutController }; diff --git a/src/controllers/api/updateSessionController.ts b/src/controllers/api/updateSessionController.ts index f9e1cf16..ddaf901c 100644 --- a/src/controllers/api/updateSessionController.ts +++ b/src/controllers/api/updateSessionController.ts @@ -1,11 +1,13 @@ import { RequestHandler } from "express"; +import { updateSession } from '@/src/managers/sessionManager'; const updateSessionGetController: RequestHandler = (_req, res) => { res.json({}); }; const updateSessionPostController: RequestHandler = (_req, res) => { console.log("UpdateSessions POST Request:", JSON.parse(_req.body)); - - res.json({ hasStarted: true }); + console.log("ReqID:",_req.query.sessionId as string) + updateSession(_req.query.sessionId as string, _req.body) + res.json({}); }; export { updateSessionGetController, updateSessionPostController }; diff --git a/src/managers/sessionManager.ts b/src/managers/sessionManager.ts new file mode 100644 index 00000000..24a502cf --- /dev/null +++ b/src/managers/sessionManager.ts @@ -0,0 +1,157 @@ +interface Session { + sessionId: string; + creatorId: string; + maxPlayers: number; + minPlayers: number; + privateSlots: number; + scoreLimit: number; + timeLimit: number; + gameModeId: number; + eloRating: number; + regionId: number; + difficulty: number; + hasStarted: boolean; + enableVoice: boolean; + matchType: string; + maps: string[]; + originalSessionId: string; + customSettings: string; + rewardSeed: number; + guildId: string; + buildId: number; + platform: number; + xplatform: boolean; + freePublic: number; + freePrivate: number; + fullReset: number; + } + + const sessions: Session[] = []; + + function createNewSession(sessionData: Session, Creator: string): Session { + const sessionId = getNewSessionID(); + const newSession: Session = { + sessionId, + creatorId: Creator, + maxPlayers: sessionData.maxPlayers || 4, + minPlayers: sessionData.minPlayers || 1, + privateSlots: sessionData.privateSlots || 0, + scoreLimit: sessionData.scoreLimit || 15, + timeLimit: sessionData.timeLimit || 900, + gameModeId: sessionData.gameModeId || 0, + eloRating: sessionData.eloRating || 3, + regionId: sessionData.regionId || 3, + difficulty: sessionData.difficulty || 0, + hasStarted: sessionData.hasStarted || false, + enableVoice: sessionData.enableVoice || true, + matchType: sessionData.matchType || 'NORMAL', + maps: sessionData.maps || [], + originalSessionId: sessionData.originalSessionId || '', + customSettings: sessionData.customSettings || '', + rewardSeed: sessionData.rewardSeed || -1, + guildId: sessionData.guildId || '', + buildId: sessionData.buildId || 4920386201513015989, + platform: sessionData.platform || 0, + xplatform: sessionData.xplatform || true, + freePublic: sessionData.freePublic || 3, + freePrivate: sessionData.freePrivate || 0, + fullReset:0, + }; + sessions.push(newSession); + return newSession; + } + + function getAllSessions(): Session[] { + return sessions; + } + + function getSessionByID(sessionId: string): Session | undefined { + return sessions.find(session => session.sessionId === sessionId); + } + + + interface FindSessionRequest { + [key: string]: any; + } + + function getSession(sessionIdOrRequest: string | FindSessionRequest): any[] { + if (typeof sessionIdOrRequest === 'string') { + const session = sessions.find(session => session.sessionId === sessionIdOrRequest); + if (session) { + console.log("Found Sessions:",session) + return [ + { + createdBy: session.creatorId, + id: session.sessionId, + }, + ]; + } + return []; + } else { + const request = sessionIdOrRequest as FindSessionRequest; + const matchingSessions = sessions.filter(session => { + for (const key in request) { + if (key !== 'eloRating' && key !== 'queryId' && request[key] !== session[key as keyof Session]) { + return false; + } + } + console.log("Found Matching Sessions:",matchingSessions) + return true; + }); + return matchingSessions.map(session => ({ + createdBy: session.creatorId, + id: session.sessionId, + })); + } + } + + function getSessionByCreatorID(creatorId: string): Session | undefined { + return sessions.find(session => session.creatorId === creatorId); + } + + function getNewSessionID(): string { + const characters = '0123456789abcdef'; + const maxAttempts = 100; + let sessionId = ''; + + for (let attempt = 0; attempt < maxAttempts; attempt++) { + sessionId = '64'; + for (let i = 0; i < 22; i++) { + const randomIndex = Math.floor(Math.random() * characters.length); + sessionId += characters[randomIndex]; + } + + if (!sessions.some(session => session.sessionId === sessionId)) { + return sessionId; + } + } + + throw new Error('Failed to generate a unique session ID'); + } + + function updateSession(sessionId: string, sessionData: string): boolean { + const session = sessions.find(session => session.sessionId === sessionId); + if (session) { + try { + const updatedData = JSON.parse(sessionData); + Object.assign(session, updatedData); + return true; + } catch (error) { + console.error('Invalid JSON string for session update.'); + return false; + } + } + return false; + } + + function deleteSession(sessionId: string): boolean { + const index = sessions.findIndex(session => session.sessionId === sessionId); + if (index !== -1) { + sessions.splice(index, 1); + return true; + } + return false; + } + + export { createNewSession, getAllSessions, getSessionByID, getSessionByCreatorID, getNewSessionID, updateSession, deleteSession, getSession }; + \ No newline at end of file diff --git a/src/routes/api.ts b/src/routes/api.ts index d13e8edd..1a5d8a11 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -27,6 +27,8 @@ import { surveysController } from "@/src/controllers/api/surveysController"; import { updateChallengeProgressController } from "@/src/controllers/api/updateChallengeProgressController"; import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController"; import { viewController } from "@/src/controllers/api/viewController"; +import { joinSessionController } from "@/src/controllers/api/joinSessionController"; + import express from "express"; const apiRouter = express.Router(); @@ -65,4 +67,5 @@ apiRouter.post("/updateSession.php", updateSessionPostController); apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController); apiRouter.post("/genericUpdate.php", genericUpdateController); apiRouter.post("/rerollRandomMod.php", rerollRandomModController); +apiRouter.post("/joinSession.php", joinSessionController); export { apiRouter };