1515import io .f1 .backend .domain .game .dto .MessageType ;
1616import io .f1 .backend .domain .game .dto .RoomEventType ;
1717import io .f1 .backend .domain .game .dto .request .GameSettingChanger ;
18+ import io .f1 .backend .domain .game .dto .response .GameResultListResponse ;
19+ import io .f1 .backend .domain .game .dto .response .GameResultResponse ;
1820import io .f1 .backend .domain .game .event .GameCorrectAnswerEvent ;
1921import io .f1 .backend .domain .game .event .GameTimeoutEvent ;
2022import io .f1 .backend .domain .game .event .RoomUpdatedEvent ;
23+ import io .f1 .backend .domain .game .model .ConnectionState ;
2124import io .f1 .backend .domain .game .model .Player ;
2225import io .f1 .backend .domain .game .model .Room ;
2326import io .f1 .backend .domain .game .model .RoomState ;
2629import io .f1 .backend .domain .question .entity .Question ;
2730import io .f1 .backend .domain .quiz .app .QuizService ;
2831import io .f1 .backend .domain .quiz .entity .Quiz ;
32+ import io .f1 .backend .domain .stat .app .StatService ;
2933import io .f1 .backend .domain .user .dto .UserPrincipal ;
3034import io .f1 .backend .global .exception .CustomException ;
3135import io .f1 .backend .global .exception .errorcode .GameErrorCode ;
@@ -52,6 +56,7 @@ public class GameService {
5256 private static final int CONTINUE_DELAY = 3 ;
5357 private static final String NONE_CORRECT_USER = "" ;
5458
59+ private final StatService statService ;
5560 private final QuizService quizService ;
5661 private final RoomService roomService ;
5762 private final TimerService timerService ;
@@ -170,11 +175,12 @@ public void gameEnd(Room room) {
170175
171176 Map <Long , Player > playerMap = room .getPlayerMap ();
172177
173- // TODO : 랭킹 정보 업데이트
174- messageSender .sendBroadcast (
175- destination ,
176- MessageType .GAME_RESULT ,
177- toGameResultListResponse (playerMap , room .getGameSetting ().getRound ()));
178+ GameResultListResponse gameResultListResponse =
179+ toGameResultListResponse (playerMap , room .getGameSetting ().getRound ());
180+
181+ messageSender .sendBroadcast (destination , MessageType .GAME_RESULT , gameResultListResponse );
182+
183+ updateRank (room , gameResultListResponse );
178184
179185 room .initializeRound ();
180186 room .initializePlayers ();
@@ -200,6 +206,31 @@ public void gameEnd(Room room) {
200206 destination , MessageType .ROOM_SETTING , toRoomSettingResponse (room ));
201207 }
202208
209+ private void updateRank (Room room , GameResultListResponse gameResultListResponse ) {
210+
211+ List <GameResultResponse > result = gameResultListResponse .result ();
212+
213+ for (GameResultResponse gameResultResponse : result ) {
214+ Long playerId = gameResultResponse .id ();
215+ int rank = gameResultResponse .rank ();
216+ int score = gameResultResponse .score ();
217+
218+ Player player = room .getPlayerByUserId (playerId );
219+
220+ if (room .isPlayerInState (playerId , ConnectionState .DISCONNECTED )) {
221+ statService .updateRank (playerId , false , 0 );
222+ continue ;
223+ }
224+
225+ if (rank == 1 ) {
226+ statService .updateRank (playerId , true , score );
227+ continue ;
228+ }
229+
230+ statService .updateRank (playerId , false , score );
231+ }
232+ }
233+
203234 @ DistributedLock (prefix = "room" , key = "#roomId" )
204235 public void handlePlayerReady (Long roomId , UserPrincipal userPrincipal ) {
205236
0 commit comments