Commit 5c89cddb authored by nanahira's avatar nanahira

add player-joined

parent 0b5522ac
Pipeline #42301 failed with stages
in 1 minute and 18 seconds
...@@ -46,7 +46,7 @@ class Pool { ...@@ -46,7 +46,7 @@ class Pool {
handleTimeout(user) { handleTimeout(user) {
if (clearUserPools(user)) if (clearUserPools(user))
localLog(this.config.timeoutLogPrefix + user); localLog(this.config.logPrefix + user);
} }
transferToPool(targetPool, user, logPrefix) { transferToPool(targetPool, user, logPrefix) {
...@@ -60,9 +60,10 @@ class Pool { ...@@ -60,9 +60,10 @@ class Pool {
} }
} }
let playingPool = new Pool({ timeoutLogPrefix: "With timeout, user is seen as had left the game: ", timeoutMs: config.match.longestMatchTime }); let pendingPool = new Pool({ logPrefix: "Pending room expired for user: ", timeoutMs: 600000 });
let pendingPool = new Pool({ timeoutLogPrefix: "Pending room expired for user: ", timeoutMs: 600000 }); let joinedPool = new Pool({ logPrefix: "Joined room expired for user: ", timeoutMs: 600000 });
const allPools = [playingPool, pendingPool]; let playingPool = new Pool({ logPrefix: "With timeout, user is seen as had left the game: ", timeoutMs: config.match.longestMatchTime });
const allPools = [playingPool, joinedPool, pendingPool];
let playerOpponents = new Map(); let playerOpponents = new Map();
let predictedEntertainTime = 600, predictedAthleticTime = 600; let predictedEntertainTime = 600, predictedAthleticTime = 600;
let entertainRequestCountInTime = 0, athleticRequestCountInTime = 0; let entertainRequestCountInTime = 0, athleticRequestCountInTime = 0;
...@@ -378,6 +379,7 @@ let closedUser = function (res, pool) { ...@@ -378,6 +379,7 @@ let closedUser = function (res, pool) {
// 当 srvpro 通知本服务器游戏已正常结束时 // 当 srvpro 通知本服务器游戏已正常结束时
let finishUser = function (json) { let finishUser = function (json) {
localLog("room-finish: " + JSON.stringify(json));
let userA = json.usernameA; let userA = json.usernameA;
let userB = json.usernameB; let userB = json.usernameB;
if (!userA && !userB) return; if (!userA && !userB) return;
...@@ -391,6 +393,15 @@ let finishUser = function (json) { ...@@ -391,6 +393,15 @@ let finishUser = function (json) {
localLog("Player " + userA + " and " + userB + " finished the game."); localLog("Player " + userA + " and " + userB + " finished the game.");
}; };
// 当 srvpro 通知本服务器玩家已进入房间时
let joinUser = function (query) {
localLog("room-joined: " + JSON.stringify(query));
let user = query.username;
if (!user) return;
pendingPool.transferToPool(joinedPool, user, "Unknown pending player joined the room: ");
localLog("Player " + user + " joined the room.");
};
// 当 srvpro 通知本服务器游戏已开始时 // 当 srvpro 通知本服务器游戏已开始时
let startUser = function (query) { let startUser = function (query) {
localLog("room-start: " + JSON.stringify(query)); localLog("room-start: " + JSON.stringify(query));
...@@ -399,7 +410,9 @@ let startUser = function (query) { ...@@ -399,7 +410,9 @@ let startUser = function (query) {
if (!userA && !userB) return; if (!userA && !userB) return;
for (let user of [userA, userB]) { for (let user of [userA, userB]) {
if (!user) continue; if (!user) continue;
pendingPool.transferToPool(playingPool, user, "Unknown pending player started the game: "); let roomInfo = joinedPool.transferToPool(playingPool, user, null);
if (!roomInfo)
pendingPool.transferToPool(playingPool, user, "Unknown pending player started the game: ");
} }
localLog("Player " + userA + " and " + userB + " started the game."); localLog("Player " + userA + " and " + userB + " started the game.");
}; };
...@@ -450,9 +463,24 @@ let matchResponse = function(req, res) { ...@@ -450,9 +463,24 @@ let matchResponse = function(req, res) {
localLog(username + " is droped due to try relining."); localLog(username + " is droped due to try relining.");
return; return;
default: default:
break; // 什么都不做,继续加入匹配池。 clearUserPools(username);
break; // 继续加入匹配池。
}
}
if (joinedPool.has(username)) {
switch (config.match.reconnect) {
case "reconnect":
case "drop":
rejectUser(res);
localLog(username + " is rejected due to joined room.");
return;
default:
clearUserPools(username);
break;
} }
} }
if (pendingPool.has(username))
clearUserPools(username);
// let arg = url.parse(req.url, true).query; // let arg = url.parse(req.url, true).query;
let arg = parseRequestUrl(req).query; let arg = parseRequestUrl(req).query;
if (!arg.arena) arg.arena = 'entertain'; if (!arg.arena) arg.arena = 'entertain';
...@@ -524,10 +552,11 @@ let endUserPermit = function(query, res) { ...@@ -524,10 +552,11 @@ let endUserPermit = function(query, res) {
let password = query.password; let password = query.password;
let arena = query.arena; let arena = query.arena;
let info = null; let info = null;
if (pendingPool.has(username)) { for (let pool of allPools) {
info = pendingPool.get(username); if (pool.has(username)) {
} else if (playingPool.has(username)) { info = pool.get(username);
info = playingPool.get(username); break;
}
} }
if (info) { if (info) {
if (password == info.password) { if (password == info.password) {
...@@ -583,6 +612,16 @@ let startUserResponse = function(query, res) { ...@@ -583,6 +612,16 @@ let startUserResponse = function(query, res) {
res.end('ok'); res.end('ok');
}; };
// 玩家进入房间 (POST /player-joined)
let playerJoinedResponse = function(query, res) {
let ak = query.ak;
if (ak != config.ak)
return notAllowedResponse(res);
let result = joinUser(query);
res.statusCode = 200;
res.end('ok');
};
let notAllowedResponse = function(res) { let notAllowedResponse = function(res) {
res.statusCode = 405; res.statusCode = 405;
res.end("Check your access key.") res.end("Check your access key.")
...@@ -627,6 +666,8 @@ const server = http.createServer((req, res) => { ...@@ -627,6 +666,8 @@ const server = http.createServer((req, res) => {
endUserResponse(req, res) endUserResponse(req, res)
} else if (req.method === 'POST' && pathname.startsWith('/room-start')) { } else if (req.method === 'POST' && pathname.startsWith('/room-start')) {
startUserResponse(query, res) startUserResponse(query, res)
} else if (req.method === 'POST' && pathname.startsWith('/player-joined')) {
playerJoinedResponse(query, res)
} else if (req.method === 'GET' && pathname.startsWith('/permit')) { } else if (req.method === 'GET' && pathname.startsWith('/permit')) {
endUserPermit(query, res) endUserPermit(query, res)
} else if (req.method === 'POST' && pathname.startsWith('/clear')) { } else if (req.method === 'POST' && pathname.startsWith('/clear')) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment