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 {
handleTimeout(user) {
if (clearUserPools(user))
localLog(this.config.timeoutLogPrefix + user);
localLog(this.config.logPrefix + user);
}
transferToPool(targetPool, user, logPrefix) {
......@@ -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({ timeoutLogPrefix: "Pending room expired for user: ", timeoutMs: 600000 });
const allPools = [playingPool, pendingPool];
let pendingPool = new Pool({ logPrefix: "Pending room expired for user: ", timeoutMs: 600000 });
let joinedPool = new Pool({ logPrefix: "Joined room expired for user: ", timeoutMs: 600000 });
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 predictedEntertainTime = 600, predictedAthleticTime = 600;
let entertainRequestCountInTime = 0, athleticRequestCountInTime = 0;
......@@ -378,6 +379,7 @@ let closedUser = function (res, pool) {
// 当 srvpro 通知本服务器游戏已正常结束时
let finishUser = function (json) {
localLog("room-finish: " + JSON.stringify(json));
let userA = json.usernameA;
let userB = json.usernameB;
if (!userA && !userB) return;
......@@ -391,6 +393,15 @@ let finishUser = function (json) {
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 通知本服务器游戏已开始时
let startUser = function (query) {
localLog("room-start: " + JSON.stringify(query));
......@@ -399,7 +410,9 @@ let startUser = function (query) {
if (!userA && !userB) return;
for (let user of [userA, userB]) {
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.");
};
......@@ -450,9 +463,24 @@ let matchResponse = function(req, res) {
localLog(username + " is droped due to try relining.");
return;
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 = parseRequestUrl(req).query;
if (!arg.arena) arg.arena = 'entertain';
......@@ -524,10 +552,11 @@ let endUserPermit = function(query, res) {
let password = query.password;
let arena = query.arena;
let info = null;
if (pendingPool.has(username)) {
info = pendingPool.get(username);
} else if (playingPool.has(username)) {
info = playingPool.get(username);
for (let pool of allPools) {
if (pool.has(username)) {
info = pool.get(username);
break;
}
}
if (info) {
if (password == info.password) {
......@@ -583,6 +612,16 @@ let startUserResponse = function(query, res) {
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) {
res.statusCode = 405;
res.end("Check your access key.")
......@@ -627,6 +666,8 @@ const server = http.createServer((req, res) => {
endUserResponse(req, res)
} else if (req.method === 'POST' && pathname.startsWith('/room-start')) {
startUserResponse(query, res)
} else if (req.method === 'POST' && pathname.startsWith('/player-joined')) {
playerJoinedResponse(query, res)
} else if (req.method === 'GET' && pathname.startsWith('/permit')) {
endUserPermit(query, res)
} 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