From b1ab489d9577a6112f4eb6b7c29a9ee98bc55285 Mon Sep 17 00:00:00 2001 From: Huisu <87214089+ranunclulus@users.noreply.github.com> Date: Thu, 14 Sep 2023 01:04:05 +0900 Subject: [PATCH 1/3] Feat/#239 game end final (#321) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: feat: <놓친 커밋> * :sparkles: feat: --- .../com/springles/game/DayToNightManager.java | 47 ++++++++++----- .../springles/game/GameSessionManager.java | 10 ++++ .../com/springles/game/NightVoteManager.java | 58 ++++++++++++++----- 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/springles/game/DayToNightManager.java b/src/main/java/com/springles/game/DayToNightManager.java index 7b2fd82..bf0d143 100644 --- a/src/main/java/com/springles/game/DayToNightManager.java +++ b/src/main/java/com/springles/game/DayToNightManager.java @@ -51,21 +51,6 @@ public void sendMessage(Long roomId) { playerRedisRepository.save(player); } - // 살아 있는 인원 업데이트 -// gameSession.setAliveCivilian((int) players.stream() -// .filter(e -> e.getRole() == GameRole.CIVILIAN) -// .filter(Player::isAlive).count()); -// gameSession.setAliveDoctor((int) players.stream() -// .filter(e -> e.getRole() == GameRole.DOCTOR) -// .filter(Player::isAlive).count()); -// gameSession.setAliveMafia((int) players.stream() -// .filter(e -> e.getRole() == GameRole.MAFIA) -// .filter(Player::isAlive).count()); -// gameSession.setAlivePolice((int) players.stream() -// .filter(e -> e.getRole() == GameRole.POLICE) -// .filter(Player::isAlive).count()); -// -// gameSessionManager.saveSession(gameSession); log.info("Room {} CIVILIAN: {}, POLICE: {}, MAFIA: {}, DOCTOR: {}", roomId, gameSession.getAliveCivilian(), @@ -74,8 +59,40 @@ public void sendMessage(Long roomId) { gameSession.getAliveDoctor()); if (gameSessionManager.isEnd(gameSession)) { + if (gameSessionManager.mafiaWin(gameSession) == 1) { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "마피아팀이 승리하였습니다", + gameSession.getRoomId(), "admin" + ); + } + else if (gameSessionManager.mafiaWin(gameSession) == 0) { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "시민팀이 승리하였습니다", + gameSession.getRoomId(), "admin" + ); + } + else { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "무승부입니다", + gameSession.getRoomId(), "admin" + ); + } + + messageManager.sendMessage( + "/sub/chat/" + roomId, + "end", + gameSession.getRoomId(), "admin" + ); log.info("game end"); gameSessionManager.endGame(gameSession.getRoomId()); + messageManager.sendMessage( + "/sub/chat/" + roomId + "/timer", + "end", + gameSession.getRoomId(), "admin" + ); return; } diff --git a/src/main/java/com/springles/game/GameSessionManager.java b/src/main/java/com/springles/game/GameSessionManager.java index 07704e2..140e530 100644 --- a/src/main/java/com/springles/game/GameSessionManager.java +++ b/src/main/java/com/springles/game/GameSessionManager.java @@ -207,4 +207,14 @@ else if (gameSession.getAliveMafia() >= gameSession.getAlivePolice() + gameSessi } return false; } + + public int mafiaWin(GameSession gameSession) { + if (gameSession.getAliveMafia() >= gameSession.getAlivePolice() + gameSession.getAliveDoctor() + gameSession.getAliveCivilian()) { + return 1; + } + else if (gameSession.getAliveMafia() == 0) { + return 0; + } + else return 2; + } } diff --git a/src/main/java/com/springles/game/NightVoteManager.java b/src/main/java/com/springles/game/NightVoteManager.java index 4e2697c..13fb509 100644 --- a/src/main/java/com/springles/game/NightVoteManager.java +++ b/src/main/java/com/springles/game/NightVoteManager.java @@ -129,6 +129,16 @@ private boolean setNightDay(GameSession gameSession, Long deadPlayerId) { Player deadPlayer = deadPlayerOptional.get(); // 아직 살아 있다면 if (deadPlayer.isAlive()) { + if (deadPlayer.getRole() == GameRole.CIVILIAN) { + gameSession.setAliveCivilian(gameSession.getAliveCivilian() - 1); + } else if (deadPlayer.getRole() == GameRole.MAFIA) { + gameSession.setAliveMafia(gameSession.getAliveMafia() - 1); + } else if (deadPlayer.getRole() == GameRole.DOCTOR) { + gameSession.setAliveDoctor(gameSession.getAliveDoctor() - 1); + } else if (deadPlayer.getRole() == GameRole.POLICE) { + gameSession.setAlivePolice(gameSession.getAlivePolice() - 1); + } + gameSessionManager.saveSession(gameSession); log.info("{} 님이 마피아에게 사망하셨습니다.", deadPlayer.getMemberName()); messageManager.sendMessage( "/sub/chat/" + roomId, @@ -143,22 +153,6 @@ private boolean setNightDay(GameSession gameSession, Long deadPlayerId) { List playersRe = playerRedisRepository.findByRoomId(gameSession.getRoomId()); - - // 살아 있는 인원 업데이트 - gameSession.setAliveCivilian((int) playersRe.stream() - .filter(e -> e.getRole() == GameRole.CIVILIAN) - .filter(Player::isAlive).count()); - gameSession.setAliveDoctor((int) playersRe.stream() - .filter(e -> e.getRole() == GameRole.DOCTOR) - .filter(Player::isAlive).count()); - gameSession.setAliveMafia((int) playersRe.stream() - .filter(e -> e.getRole() == GameRole.MAFIA) - .filter(Player::isAlive).count()); - gameSession.setAlivePolice((int) playersRe.stream() - .filter(e -> e.getRole() == GameRole.POLICE) - .filter(Player::isAlive).count()); - - gameSessionManager.saveSession(gameSession); log.info("Room {} CIVILIAN: {}, POLICE: {}, MAFIA: {}, DOCTOR: {}", roomId, gameSession.getAliveCivilian(), @@ -167,8 +161,40 @@ private boolean setNightDay(GameSession gameSession, Long deadPlayerId) { gameSession.getAliveDoctor()); if (gameSessionManager.isEnd(gameSession)) { + if (gameSessionManager.mafiaWin(gameSession) == 1) { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "마피아팀이 승리하였습니다", + gameSession.getRoomId(), "admin" + ); + } + else if (gameSessionManager.mafiaWin(gameSession) == 0) { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "시민팀이 승리하였습니다", + gameSession.getRoomId(), "admin" + ); + } + else { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "무승부입니다", + gameSession.getRoomId(), "admin" + ); + } + + messageManager.sendMessage( + "/sub/chat/" + roomId, + "end", + gameSession.getRoomId(), "admin" + ); log.info("game end"); gameSessionManager.endGame(gameSession.getRoomId()); + messageManager.sendMessage( + "/sub/chat/" + roomId + "/timer", + "end", + gameSession.getRoomId(), "admin" + ); return true; } } From e21e0fdb2417cbcc61a310efcd67dea62fabd20f Mon Sep 17 00:00:00 2001 From: dlrjs2360 Date: Thu, 14 Sep 2023 01:23:29 +0900 Subject: [PATCH 2/3] =?UTF-8?q?:recycle:=20refactor:=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B0=8F=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/message/MessageController.java | 51 +++++++++---------- .../controller/message/VoteController.java | 12 ++--- .../springles/game/DayDiscussionManager.java | 10 ++-- .../springles/game/DayEliminationManager.java | 7 ++- .../com/springles/game/DayToNightManager.java | 26 ++++++---- .../springles/game/GameSessionManager.java | 2 - .../com/springles/game/NightVoteManager.java | 23 ++++----- src/main/resources/templates/chat-room.html | 2 +- 8 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/springles/controller/message/MessageController.java b/src/main/java/com/springles/controller/message/MessageController.java index eb1d739..367bd17 100644 --- a/src/main/java/com/springles/controller/message/MessageController.java +++ b/src/main/java/com/springles/controller/message/MessageController.java @@ -40,7 +40,6 @@ public class MessageController { public void sendMessage(SimpMessageHeaderAccessor accessor, String message, @DestinationVariable Long roomId) { - GameSession gameSession = gameSessionManager.findGameByRoomId(roomId); Player player = gameSessionManager.findPlayerByMemberName(getMemberName(accessor)); @@ -154,36 +153,32 @@ public void sendMessage_GameStart(SimpMessageHeaderAccessor accessor, "게임이 시작되었습니다.", roomId, "admin"); - // 게임 시작 -> 직업 랜덤 부여, 게임 페이즈 변경, 직업 설명 - List mafiaList = new ArrayList<>(); - gameSessionManager.startGame(roomId, getMemberName(accessor)).forEach(p -> { - messageManager.sendMessage( - "/sub/chat/" + roomId + "/gameRole/" + p.getMemberName(), - new RoleExplainMessage(p.getRole(), getTimeString()) - ); - if (p.getRole().equals(GameRole.MAFIA)) { - mafiaList.add(p); - } - }); - - // 마피아들에게 마피아가 누구인지 알려주기 - String mafiaListString = mafiaList.stream() - .map(Player::getNickName) - .collect(Collectors.joining(", ")); - mafiaList.forEach(m -> { - messageManager.sendMessage( - "/sub/chat/" + roomId + "/" + m.getMemberName(), - "마피아 플레이어는" + " [" + mafiaListString + "] " + "입니다.", - roomId, "admin" - ); - }); - ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Runnable task = () -> { - messageManager.sendMessage("/sub/chat/" + roomId, - "자기소개를 시작해 주세요. 시간은 60 초입니다.", - roomId, "admin"); + // 게임 시작 -> 직업 랜덤 부여, 게임 페이즈 변경, 직업 설명 + List mafiaList = new ArrayList<>(); + gameSessionManager.startGame(roomId, getMemberName(accessor)).forEach(p -> { + messageManager.sendMessage( + "/sub/chat/" + roomId + "/gameRole/" + p.getMemberName(), + new RoleExplainMessage(p.getRole(), getTimeString()) + ); + if (p.getRole().equals(GameRole.MAFIA)) { + mafiaList.add(p); + } + }); + + // 마피아들에게 마피아가 누구인지 알려주기 + String mafiaListString = mafiaList.stream() + .map(Player::getNickName) + .collect(Collectors.joining(", ")); + mafiaList.forEach(m -> { + messageManager.sendMessage( + "/sub/chat/" + roomId + "/" + m.getMemberName(), + "마피아 플레이어는" + " [" + mafiaListString + "] " + "입니다.", + roomId, "admin" + ); + }); }; executor.schedule(task, 1, TimeUnit.SECONDS); } diff --git a/src/main/java/com/springles/controller/message/VoteController.java b/src/main/java/com/springles/controller/message/VoteController.java index 9e8d5ed..339e54f 100644 --- a/src/main/java/com/springles/controller/message/VoteController.java +++ b/src/main/java/com/springles/controller/message/VoteController.java @@ -79,7 +79,7 @@ private void voteStart (SimpMessageHeaderAccessor accessor, // 투표 시작 메시지 전송 messageManager.sendMessage( "/sub/chat/" + roomId, - day + "번째 날 아침이 밝았습니다. 투표를 시작합니다.", + day + "번째 날 아침이 밝았습니다. 아침 대화 시간은 60 초 입니다.", roomId, "admin" ); @@ -89,11 +89,11 @@ private void voteStart (SimpMessageHeaderAccessor accessor, log.info("마피아로 의심되는 사람을 지목한 뒤 투표해 주십시오."); messageManager.sendMessage( "/sub/chat/" + roomId, - "마피아로 의심되는 사람을 지목한 뒤 투표해 주십시오. 투표 시간은 30 초입니다.", + " 투표를 시작합니다. 마피아로 의심되는 사람을 지목한 뒤 투표해 주십시오. 투표 시간은 20 초 입니다.", roomId, "admin" ); }; - executor.schedule(task, 1, TimeUnit.SECONDS); + executor.schedule(task, 60, TimeUnit.SECONDS); Runnable endVoteTask = () -> { @@ -101,7 +101,7 @@ private void voteStart (SimpMessageHeaderAccessor accessor, publishMessage(roomId, vote); }; - executor.schedule(endVoteTask, 30, TimeUnit.SECONDS); + executor.schedule(endVoteTask, 80, TimeUnit.SECONDS); } @@ -125,7 +125,7 @@ private void dayVote(SimpMessageHeaderAccessor accessor, log.info("{}가 투표되었습니다.", votedPlayerName); messageManager.sendMessage( "/sub/chat/" + roomId, - votedPlayerName + "가 투표되었습니다.", + votedPlayerName + "가 투표 되었습니다.", roomId, "admin" ); } @@ -167,7 +167,7 @@ private void nightVoteStart (SimpMessageHeaderAccessor accessor, Map vote = gameSessionVoteService.endVote(roomId, gameSession.getPhaseCount(), gameSession.getGamePhase()); publishMessage(roomId, vote); }; - executor.schedule(task, 30, TimeUnit.SECONDS); + executor.schedule(task, 20, TimeUnit.SECONDS); } @MessageMapping("/chat/{roomId}/vote/night") diff --git a/src/main/java/com/springles/game/DayDiscussionManager.java b/src/main/java/com/springles/game/DayDiscussionManager.java index 04b658f..d0cafe5 100644 --- a/src/main/java/com/springles/game/DayDiscussionManager.java +++ b/src/main/java/com/springles/game/DayDiscussionManager.java @@ -45,7 +45,7 @@ public void sendMessage(DayDiscussionMessage message) { log.info("Room {} suspicious List is Empty", roomId); messageManager.sendMessage( "/sub/chat/" + roomId, - "동점 투표자가 발생하여 아무도 지목되지 않았습니다.", + "가장 많은 투표를 받은 플레이어가 존재하지 않습니다.", roomId, "admin" ); @@ -59,7 +59,7 @@ public void sendMessage(DayDiscussionMessage message) { log.info("{}가 마피아로 지목되었습니다.", deadPlayer.getNickName()); messageManager.sendMessage( "/sub/chat/" + roomId, - deadPlayer.getNickName() + "님이 마피아로 지목되셨습니다.", + deadPlayer.getNickName() + "님이 가장 많은 투표를 받으셨습니다.", roomId, "admin" ); ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); @@ -68,7 +68,7 @@ public void sendMessage(DayDiscussionMessage message) { // 실행하고자 하는 코드를 여기에 작성합니다. messageManager.sendMessage( "/sub/chat/" + roomId, - "60초 동안 최후 변론을 시작합니다.", + "투표 대상의 변론을 진행합니다. 변론 시간은 30초 입니다.", roomId, "admin" ); }; @@ -107,12 +107,12 @@ public void sendMessage(DayDiscussionMessage message) { log.info("변론 후 최종 투표를 시작합니다."); messageManager.sendMessage( "/sub/chat/" + roomId, - "변론 후 최종 투표를 시작합니다.", + "변론 시간이 종료되었습니다. 최종 투표를 진행합니다. 투표 시간은 30초 입니다.", roomId, "admin" ); }; - executor.schedule(eliminationTask, 60, TimeUnit.SECONDS); + executor.schedule(eliminationTask, 30, TimeUnit.SECONDS); } } diff --git a/src/main/java/com/springles/game/DayEliminationManager.java b/src/main/java/com/springles/game/DayEliminationManager.java index 0a7e090..5ef0cc4 100644 --- a/src/main/java/com/springles/game/DayEliminationManager.java +++ b/src/main/java/com/springles/game/DayEliminationManager.java @@ -97,7 +97,10 @@ private void setDayToNight(GameSession gameSession, Long deadPlayerId) { deadPlayer.getMemberName() + "님이 마피아로 지목되어 사망하셨습니다.", gameSession.getRoomId(), "admin" ); - ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + deadPlayer.setAlive(false); + deadPlayer.setRole(GameRole.OBSERVER); + playerRedisRepository.save(deadPlayer); + /*ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Runnable task = () -> { messageManager.sendMessage( "/sub/chat/" + gameSession.getRoomId(), @@ -109,7 +112,7 @@ private void setDayToNight(GameSession gameSession, Long deadPlayerId) { deadPlayer.setRole(GameRole.OBSERVER); playerRedisRepository.save(deadPlayer); }; - executor.schedule(task, 1, TimeUnit.SECONDS); + executor.schedule(task, 1, TimeUnit.SECONDS);*/ } } diff --git a/src/main/java/com/springles/game/DayToNightManager.java b/src/main/java/com/springles/game/DayToNightManager.java index 7b2fd82..fb28031 100644 --- a/src/main/java/com/springles/game/DayToNightManager.java +++ b/src/main/java/com/springles/game/DayToNightManager.java @@ -108,22 +108,28 @@ public void sendMessage(Long roomId) { Runnable taskOne = () -> { messageManager.sendMessage( - "/sub/chat/" + gameSession.getRoomId(), - "마피아는 죽일 사람을, 의사는 살릴 사람을, 경찰은 조사할 사람을 선택해 주세요.", + "/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.MAFIA, + "회의를 통해 제거하고 싶은 플레이어에게 투표해 주십시오. 투표 시간은 30초 입니다.", gameSession.getRoomId(), "admin" ); - }; - - Runnable taskTwo = () -> { messageManager.sendMessage( - "/sub/chat/" + roomId, - "투표는 30 초입니다.", - roomId, "admin" + "/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.POLICE, + "직업을 알아내고 싶은 플레이어에게 투표해 주십시오. 투표 시간은 30초 입니다.", + gameSession.getRoomId(), "admin" + ); + messageManager.sendMessage( + "/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.DOCTOR, + "밤 사이 살려내고 싶은 플레이어에게 투표해 주십시오. 투표 시간은 30초 입니다.", + gameSession.getRoomId(), "admin" + ); + messageManager.sendMessage( + "/sub/chat/" + gameSession.getRoomId() +"/"+GameRole.CIVILIAN, + "시민은 밤에 역할이 제한 됩니다. 30초 간 대기합니다.", + gameSession.getRoomId(), "admin" ); }; - executor.schedule(taskOne, 1, TimeUnit.SECONDS); - executor.schedule(taskTwo, 1, TimeUnit.SECONDS); + executor.schedule(taskOne, 1, TimeUnit.SECONDS); messageManager.sendMessage( "/sub/chat/" + roomId + "/voteInfo", diff --git a/src/main/java/com/springles/game/GameSessionManager.java b/src/main/java/com/springles/game/GameSessionManager.java index 07704e2..4bd80a9 100644 --- a/src/main/java/com/springles/game/GameSessionManager.java +++ b/src/main/java/com/springles/game/GameSessionManager.java @@ -96,8 +96,6 @@ public void endGame(Long roomId) { // MemberGameInfo 반영 - - gameSession.end(); gameSessionRedisRepository.save(gameSession); List players = findPlayersByRoomId(roomId); diff --git a/src/main/java/com/springles/game/NightVoteManager.java b/src/main/java/com/springles/game/NightVoteManager.java index 4e2697c..9dff71e 100644 --- a/src/main/java/com/springles/game/NightVoteManager.java +++ b/src/main/java/com/springles/game/NightVoteManager.java @@ -3,7 +3,6 @@ import com.springles.domain.constants.GamePhase; import com.springles.domain.constants.GameRole; import com.springles.domain.dto.message.NightVoteMessage; -import com.springles.domain.dto.message.RoleExplainMessage; import com.springles.domain.entity.GameSession; import com.springles.domain.entity.Player; import com.springles.exception.CustomException; @@ -19,8 +18,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import java.util.function.Function; -import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @@ -58,7 +55,7 @@ public void sendMessage(NightVoteMessage nightVoteMessage) { throw new CustomException(ErrorCode.GAME_NOT_FOUND); } - boolean isEnd = setNightDay(gameSession, deadPlayerId); + boolean isEnd = setNightToDay(gameSession, deadPlayerId); if (!isEnd) { // 밤이 지나고 이제 낮이 시작 @@ -79,7 +76,7 @@ public void sendMessage(NightVoteMessage nightVoteMessage) { log.info("Room {} NightVote suspectPlayer: {}", roomId, suspectPlayer.getMemberId()); messageManager.sendMessage( "/sub/chat/" + roomId + '/' + GameRole.POLICE + '/' + policeName, - suspectPlayer.getMemberName() + "님은 " + suspectPlayer.getRole() + "입니다.", + suspectPlayer.getMemberName() + "님은 '" + suspectPlayer.getRole().getVal() + "'입니다.", gameSession.getRoomId(), "admin" ); } @@ -87,9 +84,11 @@ public void sendMessage(NightVoteMessage nightVoteMessage) { ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Runnable task = () -> { - messageManager.sendMessage("/sub/chat/" + roomId, - "토의를 시작해 주세요. 시간은 60 초입니다.", - roomId, "admin"); + messageManager.sendMessage( + "/sub/chat/" + roomId, + gameSession.getDay() + "번째 날 아침이 밝았습니다. 아침 시간은 60 초 입니다.", + roomId, "admin" + ); }; executor.schedule(task, 1, TimeUnit.SECONDS); @@ -101,7 +100,7 @@ public void sendMessage(NightVoteMessage nightVoteMessage) { } } - private boolean setNightDay(GameSession gameSession, Long deadPlayerId) { + private boolean setNightToDay(GameSession gameSession, Long deadPlayerId) { gameSession.changePhase(GamePhase.NIGHT_TO_DAY, 7); Long roomId = gameSession.getRoomId(); gameSessionManager.saveSession(gameSession); @@ -120,7 +119,7 @@ private boolean setNightDay(GameSession gameSession, Long deadPlayerId) { if (deadPlayerId == null) { messageManager.sendMessage( "/sub/chat/" + roomId, - "아무도 죽지 않았습니다.", + "밤 사이 아무일도 일어나지 않았습니다.", gameSession.getRoomId(), "admin" ); } @@ -129,10 +128,10 @@ private boolean setNightDay(GameSession gameSession, Long deadPlayerId) { Player deadPlayer = deadPlayerOptional.get(); // 아직 살아 있다면 if (deadPlayer.isAlive()) { - log.info("{} 님이 마피아에게 사망하셨습니다.", deadPlayer.getMemberName()); + log.info("{} 님이 마피아에게 살해 당했습니다.", deadPlayer.getMemberName()); messageManager.sendMessage( "/sub/chat/" + roomId, - deadPlayer.getMemberName() + "님이 마피아에게 사망하셨습니다.", + deadPlayer.getMemberName() + "님이 님이 마피아에게 살해 당했습니다.", gameSession.getRoomId(), "admin" ); // 죽임 diff --git a/src/main/resources/templates/chat-room.html b/src/main/resources/templates/chat-room.html index 44058e2..114c908 100644 --- a/src/main/resources/templates/chat-room.html +++ b/src/main/resources/templates/chat-room.html @@ -583,7 +583,7 @@ function gameStart() { stompClient.send(`/pub/gameStart/${roomId}`) - setTimeout(voteStart, 60000); + setTimeout(voteStart, 3000); } function voteStart() { From 5505c0d78ad76b8474967a70b3161ef484d5d424 Mon Sep 17 00:00:00 2001 From: Huisu <87214089+ranunclulus@users.noreply.github.com> Date: Thu, 14 Sep 2023 02:16:12 +0900 Subject: [PATCH 3/3] Feat/#239 final final final (#323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: feat: <게임 후 시작 버튼 보이게 하기> * :sparkles: feat: <투표 번복 방지> --- .../controller/message/VoteController.java | 40 ++++++++++++++++--- .../com/springles/game/DayToNightManager.java | 6 +-- .../com/springles/game/NightVoteManager.java | 2 +- .../springles/repository/VoteRepository.java | 4 ++ .../service/GameSessionVoteService.java | 2 + .../impl/GameSessionVoteServiceImpl.java | 5 +++ src/main/resources/templates/chat-room.html | 7 ++++ 7 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/springles/controller/message/VoteController.java b/src/main/java/com/springles/controller/message/VoteController.java index 339e54f..f31fab8 100644 --- a/src/main/java/com/springles/controller/message/VoteController.java +++ b/src/main/java/com/springles/controller/message/VoteController.java @@ -111,6 +111,19 @@ private void dayVote(SimpMessageHeaderAccessor accessor, @Payload GameSessionVoteRequestDto request) { String playerName = getMemberName(accessor); Long playerId = gameSessionManager.findMemberByMemberName(playerName).getId(); + + Map votePossible = gameSessionVoteService.getVotePossible(roomId); + log.info(votePossible.toString()); + + if (votePossible.get(playerId) != null) { + log.info("걸렸다"); + messageManager.sendMessage( + "/sub/chat/" + roomId, + "이미 투표했습니다.", + roomId, "admin" + ); + return; + } log.info("Player {} vote {}", playerName, request.getVote()); GameSession gameSession = gameSessionManager.findGameByRoomId(roomId); @@ -175,17 +188,32 @@ private void nightVote(SimpMessageHeaderAccessor accessor, @DestinationVariable Long roomId, @Payload GameSessionVoteRequestDto request) { String playerName = getMemberName(accessor); - Long playerId = gameSessionManager.findMemberByMemberName(playerName).getId(); + Player player = gameSessionManager.findPlayerByMemberName(playerName); + Long playerId = player.getMemberId(); + GameRole role = player.getRole(); + + Map votePossible = gameSessionVoteService.getVotePossible(roomId); + if (votePossible.get(playerId) != null) { + messageManager.sendMessage( + "/sub/chat/" + roomId, + "이미 투표했습니다.", + roomId, "admin" + ); + return; + } log.info("Player {} vote {}", playerName, request.getVote()); log.info("밤 투표 메시지 받기 완료"); log.info("PlayerName: {}", playerName); - Player player = gameSessionManager.findPlayerByMemberName(playerName); - Long playerID = player.getMemberId(); - GameRole role = player.getRole(); + log.info("Player {} GameRole: {}", playerName, role); if(role == GameRole.CIVILIAN || role == GameRole.OBSERVER || role == GameRole.NONE) { - throw new CustomException(ErrorCode.VOTE_NOT_VALID); + messageManager.sendMessage( + "/sub/chat/" + roomId, + "투표 권한이 없습니다.", + roomId, "admin" + ); + return; } if (request.getPhase() != GamePhase.NIGHT_VOTE) { @@ -193,7 +221,7 @@ private void nightVote(SimpMessageHeaderAccessor accessor, } // 해당 롤의 투표 - Map voteResult = gameSessionVoteService.nightVote(roomId, playerID, request, role); + Map voteResult = gameSessionVoteService.nightVote(roomId, playerId, request, role); // 관찰자들을 위한 투표 결과 반환 Map forObserver = gameSessionVoteService.getVoteResult(roomId, request); diff --git a/src/main/java/com/springles/game/DayToNightManager.java b/src/main/java/com/springles/game/DayToNightManager.java index 67a6be2..d07e021 100644 --- a/src/main/java/com/springles/game/DayToNightManager.java +++ b/src/main/java/com/springles/game/DayToNightManager.java @@ -81,11 +81,7 @@ else if (gameSessionManager.mafiaWin(gameSession) == 0) { ); } - messageManager.sendMessage( - "/sub/chat/" + roomId, - "end", - gameSession.getRoomId(), "admin" - ); + log.info("game end"); gameSessionManager.endGame(gameSession.getRoomId()); messageManager.sendMessage( diff --git a/src/main/java/com/springles/game/NightVoteManager.java b/src/main/java/com/springles/game/NightVoteManager.java index 002729b..03890d0 100644 --- a/src/main/java/com/springles/game/NightVoteManager.java +++ b/src/main/java/com/springles/game/NightVoteManager.java @@ -184,7 +184,7 @@ else if (gameSessionManager.mafiaWin(gameSession) == 0) { } messageManager.sendMessage( - "/sub/chat/" + roomId, + "/sub/chat/" + roomId + "/timer", "end", gameSession.getRoomId(), "admin" ); diff --git a/src/main/java/com/springles/repository/VoteRepository.java b/src/main/java/com/springles/repository/VoteRepository.java index 919c1d1..f396490 100644 --- a/src/main/java/com/springles/repository/VoteRepository.java +++ b/src/main/java/com/springles/repository/VoteRepository.java @@ -46,6 +46,10 @@ public Map vote(Long roomId, Long playerId, Long player) { return voteResultConvert(getRedisVoteResult(getVoters(roomId))); } + public Map getVote(Long roomId) { + return voteResultConvert(getRedisVoteResult(getVoters(roomId))); + } + // 밤에 투표를 하는 메소드 public Map nightVote (Long roomId, Long playerId, Long player, GameRole role) { voteRedisRepository.vote(playerId, player); diff --git a/src/main/java/com/springles/service/GameSessionVoteService.java b/src/main/java/com/springles/service/GameSessionVoteService.java index 6c17f0d..21ce695 100644 --- a/src/main/java/com/springles/service/GameSessionVoteService.java +++ b/src/main/java/com/springles/service/GameSessionVoteService.java @@ -17,6 +17,8 @@ public interface GameSessionVoteService { Map nightVote (Long roomId, Long playerId, GameSessionVoteRequestDto request, GameRole role); Map getVoteResult(Long roomId, GameSessionVoteRequestDto request); + Map getVotePossible(Long roomId); + Map getSuspectResult(GameSession gameSession, Map vote); List getSuspiciousList(GameSession gameSession, Map voteResult); diff --git a/src/main/java/com/springles/service/impl/GameSessionVoteServiceImpl.java b/src/main/java/com/springles/service/impl/GameSessionVoteServiceImpl.java index 26917e2..a6b8fdc 100644 --- a/src/main/java/com/springles/service/impl/GameSessionVoteServiceImpl.java +++ b/src/main/java/com/springles/service/impl/GameSessionVoteServiceImpl.java @@ -78,6 +78,11 @@ public Map getVoteResult(Long roomId, GameSessionVoteRequestDto requ return voteRepository.getVoteResult(roomId); } + @Override + public Map getVotePossible(Long roomId) { + return voteRepository.getVote(roomId); + } + @Override public Map getSuspectResult(GameSession gameSession, Map vote) { log.info("GameSessionVoteService getSuspectResult 호출"); diff --git a/src/main/resources/templates/chat-room.html b/src/main/resources/templates/chat-room.html index 114c908..9844d42 100644 --- a/src/main/resources/templates/chat-room.html +++ b/src/main/resources/templates/chat-room.html @@ -518,9 +518,16 @@ stompClient.send(`/pub/chat/${roomId}/nightStart`); } else if (messageType == "day") { setTimeout(voteStart, 60000); + } else if (messageType == "end") { + changeButton(); } } + function changeButton() { + $('#gameStart').attr('style', "display:block;") + $('#myRoleInfo').attr('style', "display:none;") + } + function updateVoteList(message) { const list = document.getElementById('vote-select'); list.innerHTML = "";