Skip to content

Commit a735651

Browse files
committed
✨ feat: 게임 종료 후 disconnected 참여자 정리
1 parent a24dab5 commit a735651

File tree

3 files changed

+49
-13
lines changed

3 files changed

+49
-13
lines changed

backend/src/main/java/io/f1/backend/domain/game/app/GameService.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import io.f1.backend.domain.game.dto.MessageType;
1212
import io.f1.backend.domain.game.event.RoomUpdatedEvent;
13+
import io.f1.backend.domain.game.model.ConnectionState;
1314
import io.f1.backend.domain.game.model.Player;
1415
import io.f1.backend.domain.game.model.Room;
1516
import io.f1.backend.domain.game.model.RoomState;
@@ -38,9 +39,10 @@ public class GameService {
3839

3940
private static final int START_DELAY = 5;
4041

41-
private final MessageSender messageSender;
42-
private final TimerService timerService;
4342
private final QuizService quizService;
43+
private final RoomService roomService;
44+
private final TimerService timerService;
45+
private final MessageSender messageSender;
4446
private final RoomRepository roomRepository;
4547
private final ApplicationEventPublisher eventPublisher;
4648

@@ -82,23 +84,29 @@ public void gameEnd(Room room) {
8284

8385
Map<String, Player> playerSessionMap = room.getPlayerSessionMap();
8486

85-
messageSender.send(
86-
destination,
87-
MessageType.GAME_SETTING,
88-
toGameSettingResponse(room.getGameSetting(), room.getCurrentQuestion().getQuiz()));
89-
messageSender.send(destination, MessageType.PLAYER_LIST, toPlayerListResponse(room));
90-
messageSender.send(destination, MessageType.ROOM_SETTING, toRoomSettingResponse(room));
91-
messageSender.send(
92-
destination,
93-
MessageType.GAME_RESULT,
94-
toGameResultListResponse(playerSessionMap, room.getGameSetting().getRound()));
87+
messageSender.send(destination, MessageType.GAME_RESULT, toGameResultListResponse(playerSessionMap, room.getGameSetting().getRound()));
88+
89+
List<Player> disconnectedPlayers = new ArrayList<>();
9590

9691
room.initializeRound();
9792
for (Player player : playerSessionMap.values()) {
93+
if(player.getState().equals(ConnectionState.DISCONNECTED)) {
94+
disconnectedPlayers.add(player);
95+
}
9896
player.initializeCorrectCount();
9997
player.toggleReady();
10098
}
99+
100+
for(Player player : disconnectedPlayers) {
101+
String sessionId = room.getUserIdSessionMap().get(player.id);
102+
roomService.exitRoomForDisconnectedPlayer(roomId, player, sessionId);
103+
}
104+
101105
room.updateRoomState(RoomState.WAITING);
106+
messageSender.send(destination, MessageType.PLAYER_LIST, toPlayerListResponse(room));
107+
messageSender.send(destination, MessageType.GAME_SETTING, toGameSettingResponse(room.getGameSetting(), room.getCurrentQuestion()
108+
.getQuiz()));
109+
messageSender.send(destination, MessageType.ROOM_SETTING, toRoomSettingResponse(room));
102110
}
103111

104112
private boolean validateReadyStatus(Room room) {

backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,4 +336,31 @@ private void removePlayer(Room room, String sessionId, Player removePlayer) {
336336
room.removeUserId(removePlayer.getId());
337337
room.removeSessionId(sessionId);
338338
}
339+
340+
public void exitRoomForDisconnectedPlayer(Long roomId, Player player, String sessionId) {
341+
342+
// 연결 끊긴 플레이어 exit 로직 타게 해주기
343+
Room room = findRoom(roomId);
344+
345+
/* 방 삭제 */
346+
if (isLastPlayer(room, sessionId)) {
347+
removeRoom(room);
348+
return;
349+
}
350+
351+
/* 방장 변경 */
352+
if (room.isHost(player.getId())) {
353+
changeHost(room, sessionId);
354+
}
355+
356+
/* 플레이어 삭제 */
357+
removePlayer(room, sessionId, player);
358+
359+
SystemNoticeResponse systemNoticeResponse =
360+
ofPlayerEvent(player.nickname, RoomEventType.EXIT);
361+
362+
String destination = getDestination(roomId);
363+
364+
messageSender.send(destination, MessageType.SYSTEM_NOTICE, systemNoticeResponse);
365+
}
339366
}

backend/src/test/java/io/f1/backend/domain/game/app/RoomServiceTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class RoomServiceTests {
4545

4646
@Mock private RoomRepository roomRepository;
4747
@Mock private QuizService quizService;
48+
@Mock private GameService gameService;
4849
@Mock private TimerService timerService;
4950
@Mock private ApplicationEventPublisher eventPublisher;
5051
@Mock private MessageSender messageSender;
@@ -54,7 +55,7 @@ void setUp() {
5455
MockitoAnnotations.openMocks(this); // @Mock 어노테이션이 붙은 필드들을 초기화합니다.
5556
roomService =
5657
new RoomService(
57-
timerService, quizService, roomRepository, eventPublisher, messageSender);
58+
gameService ,timerService, quizService, roomRepository, eventPublisher, messageSender);
5859

5960
SecurityContextHolder.clearContext();
6061
}

0 commit comments

Comments
 (0)