diff --git a/gotcha-socket/src/main/java/socket_server/domain/game/service/GameStartService.java b/gotcha-socket/src/main/java/socket_server/domain/game/service/GameStartService.java index cc0f0183..99bd48cf 100644 --- a/gotcha-socket/src/main/java/socket_server/domain/game/service/GameStartService.java +++ b/gotcha-socket/src/main/java/socket_server/domain/game/service/GameStartService.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.TaskScheduler; import org.springframework.stereotype.Service; import socket_server.common.exception.ErrorType; @@ -34,7 +35,7 @@ @Service @RequiredArgsConstructor public class GameStartService { - + @Qualifier("taskScheduler") private final TaskScheduler taskScheduler; private final RoomUserService roomUserService; private final GamePlayerRepository gamePlayerRepository; @@ -91,6 +92,16 @@ public void startGame(String roomId, String userUuid, ErrorType errorType) { // 8. 5초 후 게임 시작(EntryPoint) taskScheduler.schedule(() -> roundStartService.startNextRound(roomId), Instant.now().plusSeconds(5)); + + List users = new ArrayList<>(roomUserRepository.findUsersByRoomId(roomId, errorType)); + String ownerUuid = roomMetadata.getOwnerUuid(); + + for (RoomUserInfo user : users) { + if (!user.getUserUuid().equals(ownerUuid)) { + user.setReady(false); + roomUserRepository.saveUserToRoom(user, roomId, errorType); + } + } } private void saveGame(Game game) { diff --git a/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomService.java b/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomService.java index 8755ce6a..417a64ea 100644 --- a/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomService.java +++ b/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomService.java @@ -171,7 +171,8 @@ private void broadcastUpdatedRoomInfoToListAndRoom(String roomId, RoomMetadata m RoomSummaryRes summary = RoomSummaryRes.of(metadata, currentUser); lobbyBroadCaster.broadcastToRoomList("SYSTEM", RoomEventType.UPDATE, summary); - List userList = roomUserRepository.findUsersByRoomId(roomId, ROOM_ERROR); + List userList = new ArrayList<>(roomUserRepository.findUsersByRoomId(roomId, ROOM_ERROR)); + sortUserListWithOwnerFirst(userList, metadata.getOwnerUuid()); RoomDetailRes roomDetailRes = new RoomDetailRes(RoomInfoRes.from(metadata), userList); roomBroadcaster.broadcastToRoom(roomId, "SYSTEM", RoomEventType.UPDATE, roomDetailRes); @@ -224,8 +225,21 @@ public RoomDetailRes getRoomDetails(String roomId, String userUuid) { } RoomMetadata metadata = RoomMetadata.fromRedisMap(roomId, roomData); - List userList = roomUserRepository.findUsersByRoomId(roomId, ROOM_ERROR); + List userList = new ArrayList<>(roomUserRepository.findUsersByRoomId(roomId, ROOM_ERROR)); + sortUserListWithOwnerFirst(userList, metadata.getOwnerUuid()); return new RoomDetailRes(RoomInfoRes.from(metadata), userList); } + + private void sortUserListWithOwnerFirst(List userList, String ownerUuid) { + userList.sort((u1, u2) -> { + if (u1.getUserUuid().equals(ownerUuid)) { + return -1; + } + if (u2.getUserUuid().equals(ownerUuid)) { + return 1; + } + return 0; + }); + } } diff --git a/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomUserService.java b/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomUserService.java index d9661182..32c8c57c 100644 --- a/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomUserService.java +++ b/gotcha-socket/src/main/java/socket_server/domain/room/service/RoomUserService.java @@ -19,6 +19,7 @@ import socket_server.domain.room.repository.RoomRepository; import socket_server.domain.room.repository.RoomUserRepository; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -104,6 +105,10 @@ public void passRoomOwner(String roomId, String oldOwnerId, String newOwnerId) { throw new SocketCustomException(ROOM_ERROR, RoomExceptionCode.NOT_ROOM_OWNER); } + RoomUserInfo oldOwner = roomUserRepository.findUserInfoInRoom(roomId, oldOwnerId, ROOM_ERROR); + oldOwner.setReady(false); + roomUserRepository.saveUserToRoom(oldOwner, roomId, ROOM_ERROR); + RoomUserInfo newOwner = roomUserRepository.findUserInfoInRoom(roomId, newOwnerId, ROOM_ERROR); changeRoomOwner(roomId, newOwner); @@ -147,6 +152,9 @@ private void processUserExit(String roomId, String userUuid, boolean isKicked) { } public void changeRoomOwner(String roomId, RoomUserInfo newOwner) { + newOwner.setReady(true); + roomUserRepository.saveUserToRoom(newOwner, roomId, ROOM_ERROR); + roomRepository.updateAllFields(roomId, Map.of( RoomField.OWNER_UUID.getRedisField(), newOwner.getUserUuid(), RoomField.OWNER.getRedisField(), newOwner.getNickname() @@ -154,7 +162,8 @@ public void changeRoomOwner(String roomId, RoomUserInfo newOwner) { RoomMetadata updatedMetadata = RoomMetadata.fromRedisMap(roomId, roomRepository.getRoomData(roomId)); RoomInfoRes roomInfoRes = RoomInfoRes.from(updatedMetadata); - List userList = roomUserRepository.findUsersByRoomId(roomId, ROOM_ERROR); + List userList = new ArrayList<>(roomUserRepository.findUsersByRoomId(roomId, ROOM_ERROR)); + sortUserListWithOwnerFirst(userList, updatedMetadata.getOwnerUuid()); RoomDetailRes detailRes = new RoomDetailRes(roomInfoRes, userList); roomBroadcaster.broadcastToRoom(roomId, newOwner.getUserUuid(), RoomEventType.UPDATE, detailRes); @@ -164,6 +173,18 @@ public void changeRoomOwner(String roomId, RoomUserInfo newOwner) { log.info("방장 권한이 {}에게 위임되었습니다. (roomId: {})", newOwner.getUserUuid(), roomId); } + private void sortUserListWithOwnerFirst(List userList, String ownerUuid) { + userList.sort((u1, u2) -> { + if (u1.getUserUuid().equals(ownerUuid)) { + return -1; + } + if (u2.getUserUuid().equals(ownerUuid)) { + return 1; + } + return 0; + }); + } + public RoomMetadata validateRoomOwnerAndGetRoomMetadata(String roomId, String userUuid) { if(!validateRoomOwner(roomId, userUuid)){ throw new SocketCustomException(ROOM_ERROR, RoomExceptionCode.NOT_ROOM_OWNER);