From 24f54b8b7a2567711a1147f1b6bc7def7c25d158 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Mon, 2 Feb 2026 19:18:25 +0100 Subject: [PATCH] feat: Connecting to a game --- .../game/connection/ConnectToAGame.java | 6 +++ .../connection/ConnectToAGameResponse.java | 23 ++++++++++ .../setup/scenes/connect/ServerChoose.java | 2 + .../socket/events/ConnectGameHandler.java | 33 +++++++++++++ .../socket/events/CreateGameHandler.java | 3 ++ .../jzitnik/server/context/GlobalContext.java | 9 ++-- .../server/events/AbstractEventHandler.java | 4 ++ .../handlers/ConnectToAGameHandler.java | 46 +++++++++++++++++++ .../events/handlers/CreateGameHandler.java | 5 +- .../events/handlers/PlayerMoveHandler.java | 6 +-- .../server/utils/PasswordGenerator.java | 2 +- 11 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java create mode 100644 common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java create mode 100644 game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java create mode 100644 server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java new file mode 100644 index 0000000..72fc1a2 --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGame.java @@ -0,0 +1,6 @@ +package cz.jzitnik.common.socket.messages.game.connection; + +import cz.jzitnik.common.socket.SocketMessage; + +public record ConnectToAGame(String gamePass) implements SocketMessage { +} diff --git a/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java new file mode 100644 index 0000000..d652d2a --- /dev/null +++ b/common/src/main/java/cz/jzitnik/common/socket/messages/game/connection/ConnectToAGameResponse.java @@ -0,0 +1,23 @@ +package cz.jzitnik.common.socket.messages.game.connection; + +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.SocketMessage; + +public record ConnectToAGameResponse(ResponseType responseType, PlayerCreation playerCreation) implements SocketMessage { + private enum ResponseType { + GAME_DOES_NOT_EXIST, + SUCCESS + } + + public ConnectToAGameResponse() { + this(ResponseType.GAME_DOES_NOT_EXIST, null); + } + + public ConnectToAGameResponse(PlayerCreation playerCreation) { + this(ResponseType.SUCCESS, playerCreation); + } + + public boolean success() { + return responseType == ResponseType.SUCCESS; + } +} diff --git a/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java index 888a378..c1a3d53 100644 --- a/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java +++ b/game/src/main/java/cz/jzitnik/client/game/setup/scenes/connect/ServerChoose.java @@ -23,6 +23,7 @@ import cz.jzitnik.client.ui.utils.Input; import cz.jzitnik.client.utils.DependencyManager; import cz.jzitnik.client.utils.TextRenderer; import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGame; import cz.jzitnik.common.socket.messages.game.creation.CreateGame; import jakarta.websocket.DeploymentException; import cz.jzitnik.client.ui.utils.Button; @@ -432,6 +433,7 @@ public class ServerChoose extends Scene { if (event.getKeyStroke().getKeyType() == KeyType.Enter) { connecting = true; String pass = passBuffer.toString(); + eventManager.emitEvent(new SendSocketMessageEvent(new ConnectToAGame(pass))); return; } diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java new file mode 100644 index 0000000..597d761 --- /dev/null +++ b/game/src/main/java/cz/jzitnik/client/socket/events/ConnectGameHandler.java @@ -0,0 +1,33 @@ +package cz.jzitnik.client.socket.events; + +import cz.jzitnik.client.annotations.SocketEventHandler; +import cz.jzitnik.client.annotations.injectors.InjectDependency; +import cz.jzitnik.client.annotations.injectors.InjectState; +import cz.jzitnik.client.events.FullRoomDraw; +import cz.jzitnik.client.game.GameState; +import cz.jzitnik.client.game.Player; +import cz.jzitnik.client.socket.AbstractSocketEventHandler; +import cz.jzitnik.client.utils.events.EventManager; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGameResponse; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@SocketEventHandler(ConnectToAGameResponse.class) +public class ConnectGameHandler extends AbstractSocketEventHandler { + @InjectState + private GameState gameState; + @InjectDependency + private EventManager eventManager; + + @Override + public void handle(ConnectToAGameResponse event) { + if (!event.success()) { + log.debug("Error"); + return; + } + + gameState.setPlayer(new Player(event.playerCreation())); + gameState.setScreen(null); + eventManager.emitEvent(new FullRoomDraw()); + } +} diff --git a/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java b/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java index ce8c846..4ba6b32 100644 --- a/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java +++ b/game/src/main/java/cz/jzitnik/client/socket/events/CreateGameHandler.java @@ -9,7 +9,9 @@ import cz.jzitnik.client.game.Player; import cz.jzitnik.client.socket.AbstractSocketEventHandler; import cz.jzitnik.client.utils.events.EventManager; import cz.jzitnik.common.socket.messages.game.creation.CreateGameResponse; +import lombok.extern.slf4j.Slf4j; +@Slf4j @SocketEventHandler(CreateGameResponse.class) public class CreateGameHandler extends AbstractSocketEventHandler { @InjectState @@ -19,6 +21,7 @@ public class CreateGameHandler extends AbstractSocketEventHandler getGame(String pass) { + return games.stream().filter(game -> game.getPassword().equals(pass)).findFirst(); + } + public GlobalContext() { Properties props = new Properties(); diff --git a/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java b/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java index 603b424..28e7f28 100644 --- a/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java +++ b/server/src/main/java/cz/jzitnik/server/events/AbstractEventHandler.java @@ -1,8 +1,12 @@ package cz.jzitnik.server.events; import cz.jzitnik.common.socket.SocketMessage; +import cz.jzitnik.server.context.GlobalContext; import cz.jzitnik.server.game.Client; +import lombok.RequiredArgsConstructor; +@RequiredArgsConstructor public abstract class AbstractEventHandler { + protected final GlobalContext globalContext; public abstract void handle(T event, Client client); } diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java new file mode 100644 index 0000000..b0fc35e --- /dev/null +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/ConnectToAGameHandler.java @@ -0,0 +1,46 @@ +package cz.jzitnik.server.events.handlers; + +import cz.jzitnik.common.models.player.PlayerCreation; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGame; +import cz.jzitnik.common.socket.messages.game.connection.ConnectToAGameResponse; +import cz.jzitnik.server.annotations.EventHandler; +import cz.jzitnik.server.context.GlobalContext; +import cz.jzitnik.server.events.AbstractEventHandler; +import cz.jzitnik.server.game.Client; +import cz.jzitnik.server.game.Player; +import lombok.extern.slf4j.Slf4j; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectReader; +import tools.jackson.dataformat.yaml.YAMLFactory; + +@Slf4j +@EventHandler(ConnectToAGame.class) +public class ConnectToAGameHandler extends AbstractEventHandler { + public ConnectToAGameHandler(GlobalContext globalContext) { + super(globalContext); + } + + @Override + public void handle(ConnectToAGame event, Client client) { + log.debug("Pepa"); + var gameOptional = globalContext.getGame(event.gamePass().toUpperCase()); + + if (gameOptional.isEmpty()) { + client.getSession().sendMessage(new ConnectToAGameResponse()); + return; + } + + var game = gameOptional.get(); + + ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); + ObjectReader playerReader = objectMapper.readerFor(PlayerCreation.class); + PlayerCreation player = playerReader.readValue(getClass().getClassLoader().getResourceAsStream("setup/player.yaml")); + client.setPlayer(new Player(game.getPlayers().size(), player.getPlayerCords())); + client.setGame(game); + client.getPlayer().setCurrentRoom(globalContext.getProperties().getProperty("rooms.default")); + + game.getPlayers().add(client); + + client.getSession().sendMessage(new ConnectToAGameResponse(player)); + } +} diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java index 410344f..597a937 100644 --- a/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/CreateGameHandler.java @@ -19,10 +19,11 @@ import tools.jackson.dataformat.yaml.YAMLFactory; import java.util.ArrayList; import java.util.List; -@RequiredArgsConstructor @EventHandler(CreateGame.class) public class CreateGameHandler extends AbstractEventHandler { - private final GlobalContext globalContext; + public CreateGameHandler(GlobalContext globalContext) { + super(globalContext); + } @Override public void handle(CreateGame event, Client client) { diff --git a/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java b/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java index 67a74d1..816901c 100644 --- a/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java +++ b/server/src/main/java/cz/jzitnik/server/events/handlers/PlayerMoveHandler.java @@ -6,12 +6,12 @@ import cz.jzitnik.server.annotations.EventHandler; import cz.jzitnik.server.context.GlobalContext; import cz.jzitnik.server.events.AbstractEventHandler; import cz.jzitnik.server.game.Client; -import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor @EventHandler(PlayerMove.class) public class PlayerMoveHandler extends AbstractEventHandler { - private final GlobalContext globalContext; + public PlayerMoveHandler(GlobalContext globalContext) { + super(globalContext); + } @Override public void handle(PlayerMove event, Client client) { diff --git a/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java b/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java index 2f4423f..17a2f55 100644 --- a/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java +++ b/server/src/main/java/cz/jzitnik/server/utils/PasswordGenerator.java @@ -3,7 +3,7 @@ package cz.jzitnik.server.utils; import java.security.SecureRandom; public class PasswordGenerator { - private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final SecureRandom RANDOM = new SecureRandom(); public static String generatePassword(int length) {