56 lines
1.9 KiB
JavaScript
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);
|
|
});
|
|
});
|
|
}; |