From 11be6e2b9b4192072aedf70bba7cf004a47a5c16 Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Wed, 15 Apr 2026 20:43:15 +0200 Subject: [PATCH] Feat: Wired lobby controller login flow to support in-session username changes --- .../ui/lobbyui/CasinomainuiController.java | 68 +++++++++++++++++-- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java index 80498df..37587cc 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java @@ -104,6 +104,13 @@ public class CasinomainuiController { casinoTable.getChildren().add(gridManager.getGridPane()); gridManager.renderLobbyButtons(); + String sharedUsername = ClientApp.getSharedUsername(); + updateUsernameFieldPresentation(sharedUsername); + if (loginButton != null) { + loginButton.setText( + sharedUsername != null && !sharedUsername.isBlank() ? "Change Name" : "Login"); + } + initializeChat(clientService); } @@ -156,7 +163,7 @@ public class CasinomainuiController { /** Handles the login button action. Validates input and calls LobbyClient.login(). */ @FXML public void handleLoginButton() { - String username = usernameField.getText(); + String username = usernameField == null ? null : usernameField.getText(); if (username == null || username.isBlank()) { showAlert("Please enter a username."); return; @@ -170,12 +177,63 @@ public class CasinomainuiController { showAlert("Offline mode: cannot send login to server."); return; } + + String trimmed = username.trim(); try { - lobbyClient.login(username); - showAlert("Login sent: " + username); + var result = lobbyClient.login(trimmed); + String assigned = result != null ? result.getUsername() : trimmed; + ClientApp.updateSharedUsername(assigned); + if (chatController != null) { + chatController.updateUsername(assigned); + } + updateUsernameFieldPresentation(assigned); + if (loginButton != null) { + loginButton.setText("Change Name"); + } + return; + } catch (RuntimeException loginError) { + if (!containsProtocolError(loginError, "ALREADY_LOGGED_IN")) { + LOGGER.error("Login failed: {}", loginError.getMessage()); + showAlert("Login failed: " + loginError.getMessage()); + return; + } + LOGGER.info("Session already logged in, trying username change"); + } + + try { + var result = lobbyClient.changeUsername(trimmed); + String assigned = result != null ? result.getUsername() : trimmed; + ClientApp.updateSharedUsername(assigned); + if (chatController != null) { + chatController.updateUsername(assigned); + } + updateUsernameFieldPresentation(assigned); + if (loginButton != null) { + loginButton.setText("Change Name"); + } } catch (RuntimeException e) { - LOGGER.error("Login failed: {}", e.getMessage()); - showAlert("Login failed: " + e.getMessage()); + LOGGER.error("Change username failed: {}", e.getMessage()); + showAlert("Change username failed: " + e.getMessage()); + } + } + + private boolean containsProtocolError(RuntimeException error, String code) { + String msg = error.getMessage(); + return msg != null && msg.contains(code); + } + + private void updateUsernameFieldPresentation(String username) { + if (usernameField == null) { + return; + } + + if (username != null && !username.isBlank()) { + usernameField.setText(username.trim()); + usernameField.positionCaret(usernameField.getText().length()); + usernameField.setPromptText("Username"); + } else { + usernameField.clear(); + usernameField.setPromptText("Username"); } }