fiore 43a7ecfaa6 DO-49 socket io 기능 업데이트
- 방 생성 로직 개선
  방 생성시 급수를 전달 받아서 비슷한 급수 유저와 매칭 시도함
- 항복 기능 추가
  항복 메세지 요청시 상대 플레이어에게 메세지 전달
- 무승부 제안 기능 추가
  무승부 제안 요청시 상대방에게 트리거 전달
- 무승부 제안 받을 경우 수락 혹은 거절
- 재대결 요청 기능 추가
2025-03-24 18:28:14 +09:00

70 lines
2.5 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와 플레이어 급수 매핑
};
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);
});
});
};