diff --git a/src/main/java/com/uniovi/controllers/GameController.java b/src/main/java/com/uniovi/controllers/GameController.java index 3762ac5d..1baa3664 100644 --- a/src/main/java/com/uniovi/controllers/GameController.java +++ b/src/main/java/com/uniovi/controllers/GameController.java @@ -74,10 +74,15 @@ public String getMultiplayerGame() { @GetMapping("/multiplayerGame/{code}") public String joinMultiplayerGame(@PathVariable String code, HttpSession session, Principal principal, Model model) { + if (!multiplayerSessionService.existsCode(code)) { + model.addAttribute("errorKey", "multi.code.invalid"); + return "game/multiplayerGame"; + } + Optional player = playerService.getUserByUsername(principal.getName()); Player p = player.orElse(null); isMultiPlayer=true; - if(playerService.changeMultiplayerCode(p.getId(),code)){ + if (playerService.changeMultiplayerCode(p.getId(),code)) { multiplayerSessionService.addToLobby(code,p.getId()); model.addAttribute("multiplayerGameCode",code); session.setAttribute("multiplayerCode",code); @@ -153,6 +158,7 @@ public List updatePlayerList(@PathVariable String code) { Collections.sort(playerNames); return playerNames; } + @GetMapping("/game/lobby") public String createLobby( HttpSession session, Model model) { int code = Integer.parseInt((String)session.getAttribute("multiplayerCode")); diff --git a/src/main/java/com/uniovi/services/MultiplayerSessionService.java b/src/main/java/com/uniovi/services/MultiplayerSessionService.java index c0932339..7b917458 100644 --- a/src/main/java/com/uniovi/services/MultiplayerSessionService.java +++ b/src/main/java/com/uniovi/services/MultiplayerSessionService.java @@ -19,4 +19,6 @@ public interface MultiplayerSessionService { void addToLobby(String code, Long id); void changeScore(String code,Long id,int score); + + boolean existsCode(String code); } diff --git a/src/main/java/com/uniovi/services/impl/MultiplayerSessionImpl.java b/src/main/java/com/uniovi/services/impl/MultiplayerSessionImpl.java index 0c10044e..4570b8ad 100644 --- a/src/main/java/com/uniovi/services/impl/MultiplayerSessionImpl.java +++ b/src/main/java/com/uniovi/services/impl/MultiplayerSessionImpl.java @@ -34,7 +34,7 @@ public Map getPlayersWithScores(int multiplayerCode) { List sortedPlayers = playerScores.entrySet().stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .map(Map.Entry::getKey) - .collect(Collectors.toList()); + .toList(); Map playersSorted = new HashMap<>(); for (Player player : sortedPlayers) { @@ -45,25 +45,38 @@ public Map getPlayersWithScores(int multiplayerCode) { @Override public void multiCreate(String code, Long id) { - Player p = playerRepository.findById(id).get(); - multiplayerSessionRepository.save(new MultiplayerSession(code,p)); + Player p = playerRepository.findById(id).orElse(null); + + if (p != null) + multiplayerSessionRepository.save(new MultiplayerSession(code,p)); } @Override @Transactional public void addToLobby(String code, Long id) { - Player p = playerRepository.findById(id).get(); - MultiplayerSession ms=multiplayerSessionRepository.findByMultiplayerCode(code); - ms.addPlayer(p); - multiplayerSessionRepository.save(ms); + Player p = playerRepository.findById(id).orElse(null); + + if (p != null) { + MultiplayerSession ms = multiplayerSessionRepository.findByMultiplayerCode(code); + ms.addPlayer(p); + multiplayerSessionRepository.save(ms); + } } @Override @Transactional public void changeScore(String code, Long id, int score) { - Player p = playerRepository.findById(id).get(); - MultiplayerSession ms=multiplayerSessionRepository.findByMultiplayerCode(code); - ms.getPlayerScores().put(p,score); - multiplayerSessionRepository.save(ms); + Player p = playerRepository.findById(id).orElse(null); + + if (p != null) { + MultiplayerSession ms = multiplayerSessionRepository.findByMultiplayerCode(code); + ms.getPlayerScores().put(p, score); + multiplayerSessionRepository.save(ms); + } + } + + @Override + public boolean existsCode(String code) { + return multiplayerSessionRepository.findByMultiplayerCode(code) != null; } } diff --git a/src/main/java/com/uniovi/services/impl/PlayerServiceImpl.java b/src/main/java/com/uniovi/services/impl/PlayerServiceImpl.java index f8cde7ee..c3c7e566 100644 --- a/src/main/java/com/uniovi/services/impl/PlayerServiceImpl.java +++ b/src/main/java/com/uniovi/services/impl/PlayerServiceImpl.java @@ -15,17 +15,19 @@ import org.springframework.stereotype.Service; import com.uniovi.entities.Role; +import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.Random; @Service public class PlayerServiceImpl implements PlayerService { private final PlayerRepository playerRepository; private final RoleService roleService; private final PasswordEncoder passwordEncoder; - - private MultiplayerSessionService multiplayerSessionService; + private final MultiplayerSessionService multiplayerSessionService; + private final Random random = new SecureRandom(); public PlayerServiceImpl(PlayerRepository playerRepository, RoleService roleService, MultiplayerSessionService multiplayerSessionService,PasswordEncoder passwordEncoder) { this.playerRepository = playerRepository; @@ -190,7 +192,7 @@ public int createMultiplayerGame(Long id){ return -1; Player p = player.get(); - int code = (int)Math.floor(Math.random()*10000); + int code = random.nextInt(10000); p.setMultiplayerCode(code); playerRepository.save(p); return code; diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index ea14131d..d8d8fa7f 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -108,6 +108,7 @@ multi.results =Ver resultados multi.finished= Partida finalizada multi.points = Puntuaciones multi.menu = Ir a la página de inicio +multi.code.invalid = Código de partida inválido # -------------------Statements for the apiHome.html file--------------------- api.doc.title=Documentación de la API api.doc.description=Esta es la documentación de la API de WIQ. Aquí puedes encontrar información sobre los recursos disponibles, los parámetros que aceptan y los ejemplos de uso. diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 479c891f..be8a7d16 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -110,7 +110,7 @@ multi.results = See results multi.finished= Finished game multi.points = Points multi.menu =Go to home page - +multi.code.invalid = Invalid game code # -------------------Statements for the apiHome.html file--------------------- api.doc.title=API Documentation diff --git a/src/main/resources/messages_es.properties b/src/main/resources/messages_es.properties index 3a860636..08bd8b34 100644 --- a/src/main/resources/messages_es.properties +++ b/src/main/resources/messages_es.properties @@ -110,7 +110,7 @@ multi.results =Ver resultados multi.finished= Partida finalizada multi.points = Puntuaciones multi.menu = Ir a la página de inicio - +multi.code.invalid = Código de partida inválido # -------------------Statements for the apiHome.html file--------------------- api.doc.title=Documentación de la API diff --git a/src/main/resources/messages_fr.properties b/src/main/resources/messages_fr.properties index 96a377f1..ff7f4cee 100644 --- a/src/main/resources/messages_fr.properties +++ b/src/main/resources/messages_fr.properties @@ -103,7 +103,7 @@ multi.results=Voir les résultats multi.finished= Jeu terminé multi.points = Points multi.menu =aller à la page d'accueil - +multi.code.invalid = Code invalide # -------------------Statements for the apiHome.html file--------------------- api.doc.title=Documentation de l'API diff --git a/src/main/resources/templates/game/multiplayerGame.html b/src/main/resources/templates/game/multiplayerGame.html index 6b26fe71..a25a8d44 100644 --- a/src/main/resources/templates/game/multiplayerGame.html +++ b/src/main/resources/templates/game/multiplayerGame.html @@ -7,6 +7,7 @@
+
elems = SeleniumUtils.waitLoadElementsBy(driver, "id", "startBtn", 5); elems.get(0).click(); } + + @And("I save the code") + public void iSaveACode() { + List elems = SeleniumUtils.waitLoadElementsBy(driver, "id", "lobbyCode", 5); + Assertions.assertEquals(1, elems.size()); + code = elems.get(0).getText(); + } + + @And("I fill in the saved code") + public void iFillInTheSavedCode() { + List elems = SeleniumUtils.waitLoadElements(driver, By.xpath("//input[contains(@id,'code')]"), 5); + elems.get(0).sendKeys(code); + elems = SeleniumUtils.waitLoadElementsBy(driver, "id", "joinBtn", 5); + elems.get(0).click(); + } + + @And("I see the multiplayer results") + public void iSeeTheMultiplayerResults() { + List elems = SeleniumUtils.waitLoadElementsBy(driver, "id", "createBtn", 5); + Assertions.assertEquals(1, elems.size()); + elems.get(0).click(); + } } diff --git a/src/test/resources/features/MultiplayerGame.feature b/src/test/resources/features/MultiplayerGame.feature index 0ec53959..c7e93ef1 100644 --- a/src/test/resources/features/MultiplayerGame.feature +++ b/src/test/resources/features/MultiplayerGame.feature @@ -8,4 +8,25 @@ Feature: I play a multiplayer game When I press Play With Friends And I create a code And I press start - Then I should start playing until I see message "multi.finished" \ No newline at end of file + Then I should start playing until I see message "multi.finished" + + Scenario: I start a multiplayer game + Given I am not registered or logged in + And I am on the register page + When I fill in the form with valid data username: "userGame" email: "userGame@gmail.com" password: "password" password_confirmation: "password" + And I press the register button + And I go to the home page + When I press Play With Friends + And I create a code + And I save the code + Then I logout + Given I am not registered or logged in + And I am on the register page + When I fill in the form with valid data username: "userGame2" email: "userGame2@gmail.com" password: "password" password_confirmation: "password" + And I press the register button + And I go to the home page + And I press Play With Friends + And I fill in the saved code + And I press start + Then I should start playing until I see message "multi.finished" + And I see the multiplayer results \ No newline at end of file