Commit 82074b07 authored by nanahira's avatar nanahira

unify clean opponent thing

parent 51b4e817
......@@ -24,16 +24,30 @@ let localLog = function (content) {
};
let clearUserPools = function(user) {
let removedFromPlaying = playingPlayerPool.delete(user);
let removedFromPending = pendingPlayerPool.delete(user);
if (removedFromPlaying) playingPlayerOpponents.delete(user);
if (playingPlayerTimeout.has(user)) {
clearTimeout(playingPlayerTimeout.get(user));
playingPlayerTimeout.delete(user);
}
if (pendingPlayerTimeout.has(user)) {
clearTimeout(pendingPlayerTimeout.get(user));
pendingPlayerTimeout.delete(user);
let removedFromPlaying = false;
let removedFromPending = false;
let toClear = [user];
let seen = new Set();
while (toClear.length > 0) {
let currentUser = toClear.pop();
if (!currentUser || seen.has(currentUser)) continue;
seen.add(currentUser);
if (playingPlayerPool.delete(currentUser)) removedFromPlaying = true;
if (pendingPlayerPool.delete(currentUser)) removedFromPending = true;
if (playingPlayerTimeout.has(currentUser)) {
clearTimeout(playingPlayerTimeout.get(currentUser));
playingPlayerTimeout.delete(currentUser);
}
if (pendingPlayerTimeout.has(currentUser)) {
clearTimeout(pendingPlayerTimeout.get(currentUser));
pendingPlayerTimeout.delete(currentUser);
}
let opponent = playingPlayerOpponents.get(currentUser);
playingPlayerOpponents.delete(currentUser);
if (opponent) {
playingPlayerOpponents.delete(opponent);
toClear.push(opponent);
}
}
return removedFromPlaying || removedFromPending;
};
......@@ -243,6 +257,8 @@ let pair = function (userARes, userBRes, serverName) {
}
options_buffer.writeUInt8(checksum & 0xFF, 0);
localLog(userARes.username + " and " + userBRes.username + " matched on room " + room_id);
playingPlayerOpponents.set(userARes.username, userBRes.username);
playingPlayerOpponents.set(userBRes.username, userARes.username);
for (let client of [userARes, userBRes]) {
let buffer = new Buffer(6);
let secret = parseInt(client.password) % 65535 + 1;
......@@ -343,10 +359,6 @@ let startUser = function (query) {
let userA = query.usernameA;
let userB = query.usernameB;
if (!userA && !userB) return;
if (userA && userB) {
playingPlayerOpponents.set(userA, userB);
playingPlayerOpponents.set(userB, userA);
}
for (let user of [userA, userB]) {
if (!user) continue;
let roomInfo = pendingPlayerPool.get(user);
......@@ -367,17 +379,14 @@ let startUser = function (query) {
// 当超过时间,而 srvpro 从未通知基本服务器游戏已结束时
let timeoutUser = function(user) {
if (playingPlayerPool.delete(user))
if (clearUserPools(user))
localLog("With timeout, user is seen as had left the game: " + user);
playingPlayerOpponents.delete(user);
playingPlayerTimeout.delete(user);
};
// 当房间未开始而超时
let timeoutPendingUser = function(user) {
if (pendingPlayerPool.delete(user))
if (clearUserPools(user))
localLog("Pending room expired for user: " + user);
pendingPlayerTimeout.delete(user);
};
// 计算预期时间
......
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