diff --git a/socket/handlers/matchmaking.js b/socket/handlers/matchmaking.js index f12a53e..e907d3b 100644 --- a/socket/handlers/matchmaking.js +++ b/socket/handlers/matchmaking.js @@ -20,6 +20,20 @@ module.exports = function(io, socket, gameState) { } }); + const switchToAI = (roomId, socket) => { + // 대기방 목록에서 제거 + gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId); + + // 플레이어 매칭 정보 제거 + gameState.playerRating.delete(socket.id); + gameState.nickname.delete(socket.id); + gameState.matchingTimeouts.delete(socket.id); + + socket.emit('switchAI', { + message: "타임아웃 AI로 전환" + }); + } + const findMatch = (socket, playerRating, nickname) => { let matchedRoom = null; @@ -83,6 +97,23 @@ module.exports = function(io, socket, gameState) { }); logger.info(`대기방 생성: ID ${socket.id}, 급수 ${playerRating}, 방 ID ${roomId}`); + + // 10초 타임아웃 설정 + const timeoutId = setTimeout(() => { + logger.info("타이머 종료, 15초 경과"); + // 타임 아웃 AI로 던지기 + + // 아직 방에 혼자인지 확인 + const room = gameState.rooms.find(r => r.roomId === roomId); + if (room) { + // 방이 남아 있으면 매칭 전임 + logger.info("방이 남아 있어 방 삭제 후 AI로 전달"); + switchToAI(roomId, socket); + } + },15000) + + // 타임아웃 ID 저장 + gameState.matchingTimeouts.set(socket.id, timeoutId); } } }; diff --git a/socket/handlers/roomEvents.js b/socket/handlers/roomEvents.js index b1a8d52..f00d865 100644 --- a/socket/handlers/roomEvents.js +++ b/socket/handlers/roomEvents.js @@ -12,8 +12,17 @@ module.exports = function(io, socket, gameState) { // 혼자 대기 중인 경우 대기방 목록에서 제거 gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId); + + // 타임아웃이 있으면 제거 + if (gameState.matchingTimeouts.has(socket.id)) { + clearTimeout(gameState.matchingTimeouts.get(socket.id)); + gameState.matchingTimeouts.delete(socket.id); + } + // 매핑 정보 삭제 gameState.socketRooms.delete(socket.id); + gameState.playerRating.delete(socket.id); + gameState.nickname.delete(socket.id); logger.info(`방 나가기 처리: 플레이어 ${socket.id}, 방 ${roomId}`); } catch (err) { diff --git a/socket/index.js b/socket/index.js index 01c1acf..d6d3c54 100644 --- a/socket/index.js +++ b/socket/index.js @@ -9,7 +9,8 @@ const gameState = { rooms: [], // {roomId, hostId, rating} 형태로 저장 socketRooms: new Map(), // 소켓ID와 방ID 매핑 playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑 - nickname: new Map() // 플레이어 닉네임 + nickname: new Map(), // 플레이어 닉네임 + matchingTimeouts: new Map(), // 매치메이킹 타임아웃 }; module.exports = function(server) { @@ -34,6 +35,12 @@ module.exports = function(server) { socket.on('disconnect', function(reason) { logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason); + // 타임아웃이 있으면 제거 + if (gameState.matchingTimeouts.has(socket.id)) { + clearTimeout(gameState.matchingTimeouts.get(socket.id)); + gameState.matchingTimeouts.delete(socket.id); + } + // 해당 소켓이 속한 방 찾기 const roomId = gameState.socketRooms.get(socket.id); @@ -49,8 +56,9 @@ module.exports = function(server) { gameState.socketRooms.delete(socket.id); } - // 플레이어 급수 정보 제거 + // 플레이어 매칭 정보 제거 gameState.playerRating.delete(socket.id); + gameState.nickname.delete(socket.id); }); }); }; \ No newline at end of file