const {v4: uuidv4} = require('uuid'); const matchmakingHandlers = require('./handlers/matchmaking'); const roomEventHandlers = require('./handlers/roomEvents'); const gameEventHandlers = require('./handlers/gameEvents'); const { logger } = require('../utils/logger'); // 전역 상태 객체 (모든 핸들러에서 공유) const gameState = { rooms: [], // {roomId, hostId, rating} 형태로 저장 socketRooms: new Map(), // 소켓ID와 방ID 매핑 playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑 nickname: new Map(), // 플레이어 닉네임 imageIndex: new Map(), // 플레이어 프로필 이미지 인덱스 matchingTimeouts: new Map(), // 매치메이킹 타임아웃 }; module.exports = function(server) { const io = require('socket.io')(server, { transports: ['websocket'] }); io.on('connection', function(socket) { console.log('Connected: ' + socket.id); // 매칭 관련 이벤트 핸들러 등록 matchmakingHandlers(io, socket, gameState) // 방 관련 이벤트 핸들러 등록 roomEventHandlers(io, socket, gameState); // 게임 내 이벤트 핸들러 등록 gameEventHandlers(io, socket, gameState); // 연결 해제 시 정리 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); if (roomId) { // 상대방에게 연결 끊김 알림 socket.to(roomId).emit('opponentDisconnected', { message: "상대방의 연결이 끊어졌습니다." }); // 대기방 목록에서 제거 gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId); gameState.socketRooms.delete(socket.id); } // 플레이어 매칭 정보 제거 gameState.playerRating.delete(socket.id); gameState.nickname.delete(socket.id); gameState.imageIndex.delete(socket.id); }); }); };