返回提交历史
Modified
src/controllers/api/deleteSessionController.ts
+2
-0
Modified
src/controllers/api/findSessionsController.ts
+20
-1
Modified
src/controllers/api/getNewRewardSeedController.ts
+7
-1
Modified
src/controllers/api/hostSessionController.ts
+4
-1
Added
src/controllers/api/joinSessionController.ts
+11
-0
Modified
src/controllers/api/logoutController.ts
+2
-3
Modified
src/controllers/api/updateSessionController.ts
+4
-2
Added
src/managers/sessionManager.ts
+132
-0
Modified
src/routes/api.ts
+3
-0
Added
src/types/session.ts
+27
-0
Modified
static/fixed_responses/login_static.ts
+1
-1
XFEstudio/SpaceNinjaServer
basic session management completed (#11)
52a8ad6b
代码差异
11 个文件
+213
-9
@@ -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
@@ -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 };
@@ -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 };
@@ -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 };
@@ -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 };
@@ -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 };
@@ -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 };
@@ -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
};
@@ -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 };
@@ -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
}
@@ -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