Newer
Older
PixelPaintWar / apps / server / src / domains / room / RoomHandler.ts
import { Server, Socket } from "socket.io";
import { RoomManager } from "./RoomManager";
import { protocol } from "@repo/shared";
import type { roomTypes } from "@repo/shared";

export const registerRoomHandlers = (io: Server, socket: Socket, roomManager: RoomManager) => {
  
  socket.on(protocol.SocketEvents.JOIN_ROOM, (data: roomTypes.JoinRoomPayload) => {
    const { roomId, playerName } = data;
    console.log("[RoomHandler] JOIN_ROOM received", { roomId, socketId: socket.id, playerName });
    
    socket.join(roomId);

    // RoomManagerにデータ操作を依頼
    const room = roomManager.addPlayerToRoom(roomId, socket.id, playerName);

    // ルーム内全員向け最新状態配信
    io.to(roomId).emit(protocol.SocketEvents.ROOM_UPDATE, room);
    console.log("[RoomHandler] ROOM_UPDATE emitted", {
      roomId,
      ownerId: room.ownerId,
      totalPlayers: room.players.length
    });
  });

};

/**
 * 切断時のルームクリーンアップ処理
 */
export const handleRoomDisconnect = (io: Server, socket: Socket, roomManager: RoomManager) => {
  // ルームからの除外処理
  const updatedRooms = roomManager.removePlayer(socket.id);
  console.log("[RoomHandler] disconnect cleanup", {
    socketId: socket.id,
    updatedRoomCount: updatedRooms.length
  });
  
  // 更新があったルーム(オーナー変更など)にのみ通知を飛ばす
  updatedRooms.forEach(room => {
    io.to(room.roomId).emit(protocol.SocketEvents.ROOM_UPDATE, room);
    console.log("[RoomHandler] ROOM_UPDATE emitted", {
      roomId: room.roomId,
      ownerId: room.ownerId,
      totalPlayers: room.players.length
    });
  });
};