56 lines
1.9 KiB
JavaScript

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() // 플레이어 닉네임
};
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);
// 해당 소켓이 속한 방 찾기
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);
});
});
};