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와 플레이어 급수 매핑 }; module.exports = function(server) { const io = require('socket.io')(server, { transports: ['websocket'] }); io.on('connection', function(socket) { console.log('Connected: ' + socket.id); // 기존 단순 매칭 코드 // if (rooms.length > 0) { // var roomId = rooms.shift(); // socket.join(roomId) // socket.emit('joinRoom', { roomId: roomId }); // socket.to(roomId).emit('startGame', { roomId: socket.id }); // socketRooms.set(socket.id, roomId); // } else { // var roomId = uuidv4(); // socket.join(roomId); // socket.emit('createRoom', { room: roomId }); // rooms.push(roomId); // socketRooms.set(socket.id, roomId); // } // 매칭 관련 이벤트 핸들러 등록 matchmakingHandlers(io, socket, gameState) // 방 관련 이벤트 핸들러 등록 roomEventHandlers(io, socket, gameState); // 게임 내 이벤트 핸들러 등록 gameEventHandlers(io, socket, gameState); // 연결 해제 시 정리 socket.on('disconnect', function(reason) { logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason); // 해당 소켓이 속한 방 찾기 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); }); }); };