XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

basic session management completed (#11)

52a8ad6b
AKCore <AKCore@users.noreply.github.com>
提交于

代码差异

11 个文件 +213 -9
Modified src/controllers/api/deleteSessionController.ts +2 -0
@@ -1,6 +1,8 @@
1 1 import { RequestHandler } from "express";
2 import { deleteSession } from "@/src/managers/sessionManager";
2 3
3 4 const deleteSessionController: RequestHandler = (_req, res) => {
5 deleteSession(_req.query.sessionId as string);
4 6 res.sendStatus(200);
5 7 };
6 8
Modified src/controllers/api/findSessionsController.ts +20 -1
@@ -1,9 +1,28 @@
1 1 import { RequestHandler } from "express";
2 import { getSession } from "@/src/managers/sessionManager";
2 3
3 4 const findSessionsController: RequestHandler = (_req, res) => {
4 5 console.log("FindSession Request:", JSON.parse(_req.body));
6 let req = JSON.parse(_req.body);
7 if (req.id != undefined) {
8 console.log("Found ID");
9 let session = getSession(req.id);
5 10
6 res.json({ sessionId: { $oid: "64768f104722f795300c9fc0" }, rewardSeed: 5867309943877621023 });
11 if (session) res.json({ queryId: req.queryId, Sessions: session });
12 else res.json({});
13 } else if (req.originalSessionId != undefined) {
14 console.log("Found OriginalSessionID");
15
16 let session = getSession(req.originalSessionId);
17 if (session) res.json({ queryId: req.queryId, Sessions: session });
18 else res.json({});
19 } else {
20 console.log("Found SessionRequest");
21
22 let session = getSession(_req.body);
23 if (session) res.json({ queryId: req.queryId, Sessions: session });
24 else res.json({});
25 }
7 26 };
8 27
9 28 export { findSessionsController };
Modified src/controllers/api/getNewRewardSeedController.ts +7 -1
@@ -1,7 +1,13 @@
1 1 import { RequestHandler } from "express";
2 2
3 3 const getNewRewardSeedController: RequestHandler = (_req, res) => {
4 res.json({ rewardSeed: 5867309943877621023 });
4 res.json({ rewardSeed: generateRewardSeed() });
5 5 };
6 6
7 function generateRewardSeed(): number {
8 const min = -Number.MAX_SAFE_INTEGER;
9 const max = Number.MAX_SAFE_INTEGER;
10 return Math.floor(Math.random() * (max - min + 1)) + min;
11 }
12
7 13 export { getNewRewardSeedController };
Modified src/controllers/api/hostSessionController.ts +4 -1
@@ -1,9 +1,12 @@
1 1 import { RequestHandler } from "express";
2 import { createNewSession } from "@/src/managers/sessionManager";
2 3
3 4 const hostSessionController: RequestHandler = (_req, res) => {
4 5 console.log("HostSession Request:", JSON.parse(_req.body));
6 let session = createNewSession(JSON.parse(_req.body), _req.query.accountId as string);
7 console.log("New Session Created: ", session);
5 8
6 res.json({ sessionId: { $oid: "64768f104722f795300c9fc0" }, rewardSeed: 5867309943877621023 });
9 res.json({ sessionId: { $oid: session.sessionId }, rewardSeed: 99999999 });
7 10 };
8 11
9 12 export { hostSessionController };
Added src/controllers/api/joinSessionController.ts +11 -0
@@ -0,0 +1,11 @@
1 import { RequestHandler } from "express";
2 import { getSessionByID } from "@/src/managers/sessionManager";
3
4 const joinSessionController: RequestHandler = (_req, res) => {
5 console.log("JoinSession Request:", JSON.parse(_req.body));
6 let req = JSON.parse(_req.body);
7 let session = getSessionByID(req.sessionIds[0]);
8 res.json({ rewardSeed: session?.rewardSeed, sessionId: { $oid: session?.sessionId } });
9 };
10
11 export { joinSessionController };
Modified src/controllers/api/logoutController.ts +2 -3
@@ -1,12 +1,11 @@
1 1 import { RequestHandler } from "express";
2 2
3 3 const logoutController: RequestHandler = (_req, res) => {
4 const data = Buffer.from([0x31]);
5 4 res.writeHead(200, {
6 5 "Content-Type": "text/html",
7 "Content-Length": data.length
6 "Content-Length": 1
8 7 });
9 res.end(data);
8 res.end("1");
10 9 };
11 10
12 11 export { logoutController };
Modified src/controllers/api/updateSessionController.ts +4 -2
@@ -1,11 +1,13 @@
1 1 import { RequestHandler } from "express";
2 import { updateSession } from "@/src/managers/sessionManager";
2 3
3 4 const updateSessionGetController: RequestHandler = (_req, res) => {
4 5 res.json({});
5 6 };
6 7 const updateSessionPostController: RequestHandler = (_req, res) => {
7 8 console.log("UpdateSessions POST Request:", JSON.parse(_req.body));
8
9 res.json({ hasStarted: true });
9 console.log("ReqID:", _req.query.sessionId as string);
10 updateSession(_req.query.sessionId as string, _req.body);
11 res.json({});
10 12 };
11 13 export { updateSessionGetController, updateSessionPostController };
Added src/managers/sessionManager.ts +132 -0
@@ -0,0 +1,132 @@
1 import { Session, FindSessionRequest } from "@/src/types/session";
2
3 const sessions: Session[] = [];
4
5 function createNewSession(sessionData: Session, Creator: string): Session {
6 const sessionId = getNewSessionID();
7 const newSession: Session = {
8 sessionId,
9 creatorId: Creator,
10 maxPlayers: sessionData.maxPlayers || 4,
11 minPlayers: sessionData.minPlayers || 1,
12 privateSlots: sessionData.privateSlots || 0,
13 scoreLimit: sessionData.scoreLimit || 15,
14 timeLimit: sessionData.timeLimit || 900,
15 gameModeId: sessionData.gameModeId || 0,
16 eloRating: sessionData.eloRating || 3,
17 regionId: sessionData.regionId || 3,
18 difficulty: sessionData.difficulty || 0,
19 hasStarted: sessionData.hasStarted || false,
20 enableVoice: sessionData.enableVoice || true,
21 matchType: sessionData.matchType || "NORMAL",
22 maps: sessionData.maps || [],
23 originalSessionId: sessionData.originalSessionId || "",
24 customSettings: sessionData.customSettings || "",
25 rewardSeed: sessionData.rewardSeed || -1,
26 guildId: sessionData.guildId || "",
27 buildId: sessionData.buildId || 4920386201513015989,
28 platform: sessionData.platform || 0,
29 xplatform: sessionData.xplatform || true,
30 freePublic: sessionData.freePublic || 3,
31 freePrivate: sessionData.freePrivate || 0,
32 fullReset: 0
33 };
34 sessions.push(newSession);
35 return newSession;
36 }
37
38 function getAllSessions(): Session[] {
39 return sessions;
40 }
41
42 function getSessionByID(sessionId: string): Session | undefined {
43 return sessions.find(session => session.sessionId === sessionId);
44 }
45
46 function getSession(sessionIdOrRequest: string | FindSessionRequest): any[] {
47 if (typeof sessionIdOrRequest === "string") {
48 const session = sessions.find(session => session.sessionId === sessionIdOrRequest);
49 if (session) {
50 console.log("Found Sessions:", session);
51 return [
52 {
53 createdBy: session.creatorId,
54 id: session.sessionId
55 }
56 ];
57 }
58 return [];
59 }
60
61 const request = sessionIdOrRequest as FindSessionRequest;
62 const matchingSessions = sessions.filter(session => {
63 for (const key in request) {
64 if (key !== "eloRating" && key !== "queryId" && request[key] !== session[key as keyof Session]) {
65 return false;
66 }
67 }
68 console.log("Found Matching Sessions:", matchingSessions);
69 return true;
70 });
71 return matchingSessions.map(session => ({
72 createdBy: session.creatorId,
73 id: session.sessionId
74 }));
75 }
76
77 function getSessionByCreatorID(creatorId: string): Session | undefined {
78 return sessions.find(session => session.creatorId === creatorId);
79 }
80
81 function getNewSessionID(): string {
82 const characters = "0123456789abcdef";
83 const maxAttempts = 100;
84 let sessionId = "";
85
86 for (let attempt = 0; attempt < maxAttempts; attempt++) {
87 sessionId = "64";
88 for (let i = 0; i < 22; i++) {
89 const randomIndex = Math.floor(Math.random() * characters.length);
90 sessionId += characters[randomIndex];
91 }
92
93 if (!sessions.some(session => session.sessionId === sessionId)) {
94 return sessionId;
95 }
96 }
97
98 throw new Error("Failed to generate a unique session ID");
99 }
100
101 function updateSession(sessionId: string, sessionData: string): boolean {
102 const session = sessions.find(session => session.sessionId === sessionId);
103 if (!session) return false;
104 try {
105 const updatedData = JSON.parse(sessionData);
106 Object.assign(session, updatedData);
107 return true;
108 } catch (error) {
109 console.error("Invalid JSON string for session update.");
110 return false;
111 }
112 }
113
114 function deleteSession(sessionId: string): boolean {
115 const index = sessions.findIndex(session => session.sessionId === sessionId);
116 if (index !== -1) {
117 sessions.splice(index, 1);
118 return true;
119 }
120 return false;
121 }
122
123 export {
124 createNewSession,
125 getAllSessions,
126 getSessionByID,
127 getSessionByCreatorID,
128 getNewSessionID,
129 updateSession,
130 deleteSession,
131 getSession
132 };
Modified src/routes/api.ts +3 -0
@@ -27,6 +27,8 @@ import { surveysController } from "@/src/controllers/api/surveysController";
27 27 import { updateChallengeProgressController } from "@/src/controllers/api/updateChallengeProgressController";
28 28 import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController";
29 29 import { viewController } from "@/src/controllers/api/viewController";
30 import { joinSessionController } from "@/src/controllers/api/joinSessionController";
31
30 32 import express from "express";
31 33
32 34 const apiRouter = express.Router();
@@ -65,4 +67,5 @@ apiRouter.post("/updateSession.php", updateSessionPostController);
65 67 apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
66 68 apiRouter.post("/genericUpdate.php", genericUpdateController);
67 69 apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
70 apiRouter.post("/joinSession.php", joinSessionController);
68 71 export { apiRouter };
Added src/types/session.ts +27 -0
@@ -0,0 +1,27 @@
1 export interface Session {
2 sessionId: string;
3 creatorId: string;
4 maxPlayers: number;
5 minPlayers: number;
6 privateSlots: number;
7 scoreLimit: number;
8 timeLimit: number;
9 gameModeId: number;
10 eloRating: number;
11 regionId: number;
12 difficulty: number;
13 hasStarted: boolean;
14 enableVoice: boolean;
15 matchType: string;
16 maps: string[];
17 originalSessionId: string;
18 customSettings: string;
19 rewardSeed: number;
20 guildId: string;
21 buildId: number;
22 platform: number;
23 xplatform: boolean;
24 freePublic: number;
25 freePrivate: number;
26 fullReset: number;
27 }
Modified static/fixed_responses/login_static.ts +1 -1
@@ -24,7 +24,7 @@ export const platformCDNs = [
24 24
25 25 export const Nonce = 1231231233;
26 26
27 export const NRS = ["104.237.145.11", "139.144.69.73", "170.187.231.80", "45.33.58.33", "85.159.214.213"];
27 export const NRS = ["localhost"];
28 28
29 29 export const DTLS = 99;
30 30