Skip to content

Commit 018e072

Browse files
committed
✨ feat: 플레이어 준비 상태 변경 기능 추가
1 parent 693240f commit 018e072

File tree

5 files changed

+45
-2
lines changed

5 files changed

+45
-2
lines changed

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import io.f1.backend.domain.quiz.app.QuizService;
3333
import io.f1.backend.domain.quiz.entity.Quiz;
3434

35+
import io.f1.backend.global.exception.CustomException;
36+
import io.f1.backend.global.exception.errorcode.RoomErrorCode;
3537
import lombok.RequiredArgsConstructor;
3638
import lombok.extern.slf4j.Slf4j;
3739

@@ -182,6 +184,11 @@ public RoomExitData exitRoom(Long roomId, String sessionId) {
182184
}
183185
}
184186

187+
public Player findPlayerInRoomBySessionId(String sessionId, Long roomId) {
188+
return roomRepository.findPlayerInRoomBySessionId(sessionId, roomId)
189+
.orElseThrow(() -> new CustomException(RoomErrorCode.PLAYER_NOT_FOUND));
190+
}
191+
185192
public RoomListResponse getAllRooms() {
186193
List<Room> rooms = roomRepository.findAll();
187194
List<RoomResponse> roomResponses =
@@ -256,4 +263,11 @@ private void removePlayer(Room room, String sessionId, Player removePlayer) {
256263
room.removeUserId(removePlayer.getId());
257264
room.removeSessionId(sessionId);
258265
}
266+
267+
public PlayerListResponse getPlayerListResponse(Long roomId) {
268+
Room room = roomRepository.findRoom(roomId)
269+
.orElseThrow(() -> new IllegalStateException("방을 찾을 수 없습니다. roomId=" + roomId));
270+
271+
return toPlayerListResponse(room);
272+
}
259273
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package io.f1.backend.domain.game.store;
22

3+
import io.f1.backend.domain.game.model.Player;
34
import io.f1.backend.domain.game.model.Room;
45

56
import java.util.List;
67
import java.util.Optional;
78

89
public interface RoomRepository {
10+
911
void saveRoom(Room room);
1012

1113
Optional<Room> findRoom(Long roomId);
1214

1315
List<Room> findAll();
1416

1517
void removeRoom(Long roomId);
18+
19+
Optional<Player> findPlayerInRoomBySessionId(String sessionId, Long roomId);
1620
}

backend/src/main/java/io/f1/backend/domain/game/store/RoomRepositoryImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package io.f1.backend.domain.game.store;
22

3+
import io.f1.backend.domain.game.model.Player;
34
import io.f1.backend.domain.game.model.Room;
45

6+
import java.util.Optional;
57
import org.springframework.stereotype.Repository;
68

79
import java.util.ArrayList;
810
import java.util.List;
911
import java.util.Map;
10-
import java.util.Optional;
1112
import java.util.concurrent.ConcurrentHashMap;
1213

1314
@Repository
@@ -35,6 +36,11 @@ public void removeRoom(Long roomId) {
3536
roomMap.remove(roomId);
3637
}
3738

39+
@Override
40+
public Optional<Player> findPlayerInRoomBySessionId(String sessionId, Long roomId) {
41+
return findRoom(roomId).map(room -> room.getPlayerSessionMap().get(sessionId));
42+
}
43+
3844
// 테스트 전용 메소드
3945
public Room getRoomForTest(Long roomId) {
4046
return roomMap.get(roomId);

backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.f1.backend.domain.game.dto.RoomExitData;
66
import io.f1.backend.domain.game.dto.RoomInitialData;
77

8+
import io.f1.backend.domain.game.dto.response.PlayerListResponse;
9+
import io.f1.backend.domain.game.model.Player;
810
import lombok.RequiredArgsConstructor;
911

1012
import org.springframework.messaging.Message;
@@ -27,6 +29,7 @@ public void initializeRoomSocket(@DestinationVariable Long roomId, Message<?> me
2729

2830
RoomInitialData roomInitialData =
2931
roomService.initializeRoomSocket(roomId, websocketSessionId);
32+
3033
String destination = roomInitialData.destination();
3134

3235
messageSender.send(
@@ -56,6 +59,21 @@ public void exitRoom(@DestinationVariable Long roomId, Message<?> message) {
5659
}
5760
}
5861

62+
@MessageMapping("/room/ready/{roomId}")
63+
public void playerReady(@DestinationVariable Long roomId, Message<?> message) {
64+
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
65+
String sessionId = accessor.getSessionId();
66+
67+
Player player = roomService.findPlayerInRoomBySessionId(sessionId, roomId);
68+
69+
player.toggleReady();
70+
71+
PlayerListResponse response = roomService.getPlayerListResponse(roomId);
72+
73+
String destination = "/sub/room/" + roomId;
74+
messageSender.send(destination, MessageType.PLAYER_LIST, response);
75+
}
76+
5977
private static String getSessionId(Message<?> message) {
6078
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
6179
return accessor.getSessionId();

backend/src/main/java/io/f1/backend/global/exception/errorcode/RoomErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ public enum RoomErrorCode implements ErrorCode {
1111
ROOM_USER_LIMIT_REACHED("E403002", HttpStatus.FORBIDDEN, "정원이 모두 찼습니다."),
1212
ROOM_GAME_IN_PROGRESS("E403003", HttpStatus.FORBIDDEN, "게임이 진행 중 입니다."),
1313
ROOM_NOT_FOUND("E404005", HttpStatus.NOT_FOUND, "존재하지 않는 방입니다."),
14-
WRONG_PASSWORD("E401006", HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지않습니다.");
14+
WRONG_PASSWORD("E401006", HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지않습니다."),
15+
PLAYER_NOT_FOUND("E404007", HttpStatus.NOT_FOUND, "존재하지 않는 플레이어입니다.");
1516

1617
private final String code;
1718

0 commit comments

Comments
 (0)