Newer
Older
PixelPaintWar / apps / server / src / domains / room / application / services / RoomExitService.ts
/**
 * RoomExitService
 * ルーム退出処理とオーナー移譲処理を担うサービス
 */
import type { roomTypes } from "@repo/shared";
import { logEvent } from "@server/logging/logEvent";

/** 退出要求に応じてプレイヤー削除とルーム整理を行うサービス */
export class RoomExitService {
  constructor(private rooms: Map<string, roomTypes.Room>) {}

  public removePlayer(socketId: string): roomTypes.Room[] {
    const updatedRooms: roomTypes.Room[] = [];

    for (const [roomId, room] of this.rooms.entries()) {
      const playerIndex = room.players.findIndex((player) => player.id === socketId);
      if (playerIndex === -1) {
        continue;
      }

      room.players.splice(playerIndex, 1);
      logEvent("RoomExitService", {
        event: "PLAYER_LEAVE",
        result: "removed",
        roomId,
        socketId,
        totalPlayers: room.players.length,
      });

      if (room.players.length === 0) {
        this.rooms.delete(roomId);
        logEvent("RoomExitService", {
          event: "ROOM_DELETE",
          result: "deleted",
          roomId,
          socketId,
        });
        continue;
      }

      if (room.ownerId === socketId) {
        room.ownerId = room.players[0].id;
        room.players[0].isOwner = true;
        logEvent("RoomExitService", {
          event: "OWNER_TRANSFER",
          result: "transferred",
          roomId,
          socketId,
          newOwnerId: room.ownerId,
        });
      }

      updatedRooms.push(room);
    }

    return updatedRooms;
  }
}