From 66cb000fad3f480582ba8c24eff1acab228379d6 Mon Sep 17 00:00:00 2001 From: Bas de Jong Date: Fri, 12 Dec 2025 15:15:55 +0100 Subject: [PATCH] Init server code --- app/src/main/java/org/toop/app/Server.java | 16 +-- .../org/toop/app/canvas/ReversiBitCanvas.java | 5 +- .../toop/app/canvas/TicTacToeBitCanvas.java | 5 +- .../GenericGameController.java | 4 +- .../gameControllers/ReversiBitController.java | 8 +- .../TicTacToeBitController.java | 9 +- .../app/widget/view/LocalMultiplayerView.java | 18 +-- framework/pom.xml | 1 - .../java/org/toop/framework}/game/Move.java | 2 +- .../LocalFixedRateThreadBehaviour.java | 2 +- .../gameThreads/LocalThreadBehaviour.java | 2 +- .../gameThreads/OnlineThreadBehaviour.java | 4 +- .../OnlineWithSleepThreadBehaviour.java | 3 +- .../framework}/game/players/LocalPlayer.java | 3 +- .../framework}/game/players/MiniMaxAI.java | 2 +- .../framework}/game/players/OnlinePlayer.java | 2 +- .../framework}/game/players/RandomAI.java | 2 +- .../controller/GameController.java | 3 +- .../model/game/SupportsOnlinePlay.java | 2 - .../NetworkingClientEventListener.java | 8 +- .../NetworkingClientManager.java | 14 +-- .../clients/TournamentNetworkingClient.java | 8 +- .../events/NetworkEvents.java | 6 +- .../exceptions/ClientNotFoundException.java | 2 +- .../exceptions/CouldNotConnectException.java | 2 +- .../NetworkingInitializationException.java | 2 +- .../handlers/NetworkingGameClientHandler.java | 4 +- .../interfaces/NetworkingClient.java | 4 +- .../interfaces/NetworkingClientManager.java | 8 +- .../types/NetworkingConnector.java | 2 +- .../{ => connection}/types/ServerCommand.java | 2 +- .../connection/types/ServerMessage.java | 3 + .../framework/networking/server/Game.java | 30 +++++ .../networking/server/GameDefinition.java | 26 ++++ .../networking/server/GameServer.java | 8 ++ .../networking/server/MasterServer.java | 68 ++++++++++ .../networking/server/MessageStore.java | 7 ++ .../networking/server/OnlineGame.java | 7 ++ .../networking/server/ParsedMessage.java | 4 + .../framework/networking/server/Parser.java | 4 + .../networking/server/ServableGame.java | 4 + .../framework/networking/server/Server.java | 51 ++++++++ .../networking/server/ServerHandler.java | 117 ++++++++++++++++++ .../networking/server/ServerMessageStore.java | 27 ++++ .../networking/server/ServerUser.java | 9 ++ .../framework/networking/server/User.java | 40 ++++++ .../networking/types/ServerMessage.java | 3 - .../NetworkingClientManagerTest.java | 2 +- .../events/NetworkEventsTest.java | 2 +- 49 files changed, 475 insertions(+), 92 deletions(-) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/Move.java (77%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/gameThreads/LocalFixedRateThreadBehaviour.java (98%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/gameThreads/LocalThreadBehaviour.java (98%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/gameThreads/OnlineThreadBehaviour.java (96%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/gameThreads/OnlineWithSleepThreadBehaviour.java (91%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/players/LocalPlayer.java (96%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/players/MiniMaxAI.java (99%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/players/OnlinePlayer.java (96%) rename {game/src/main/java/org/toop => framework/src/main/java/org/toop/framework}/game/players/RandomAI.java (95%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/NetworkingClientEventListener.java (96%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/NetworkingClientManager.java (90%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/clients/TournamentNetworkingClient.java (92%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/events/NetworkEvents.java (97%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/exceptions/ClientNotFoundException.java (91%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/exceptions/CouldNotConnectException.java (89%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/exceptions/NetworkingInitializationException.java (76%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/handlers/NetworkingGameClientHandler.java (98%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/interfaces/NetworkingClient.java (66%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/interfaces/NetworkingClientManager.java (57%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/types/NetworkingConnector.java (73%) rename framework/src/main/java/org/toop/framework/networking/{ => connection}/types/ServerCommand.java (52%) create mode 100644 framework/src/main/java/org/toop/framework/networking/connection/types/ServerMessage.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/Game.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/GameDefinition.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/GameServer.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/MasterServer.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/MessageStore.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/OnlineGame.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/ParsedMessage.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/Parser.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/ServableGame.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/Server.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/ServerHandler.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/ServerMessageStore.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/ServerUser.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/User.java delete mode 100644 framework/src/main/java/org/toop/framework/networking/types/ServerMessage.java rename framework/src/test/java/org/toop/framework/networking/{ => connection}/events/NetworkEventsTest.java (99%) diff --git a/app/src/main/java/org/toop/app/Server.java b/app/src/main/java/org/toop/app/Server.java index ef691b4..90040ef 100644 --- a/app/src/main/java/org/toop/app/Server.java +++ b/app/src/main/java/org/toop/app/Server.java @@ -14,14 +14,14 @@ import org.toop.framework.eventbus.EventFlow; import org.toop.framework.gameFramework.controller.GameController; import org.toop.framework.eventbus.GlobalEventBus; import org.toop.framework.gameFramework.model.player.Player; -import org.toop.framework.networking.clients.TournamentNetworkingClient; -import org.toop.framework.networking.events.NetworkEvents; -import org.toop.framework.networking.types.NetworkingConnector; -import org.toop.game.games.reversi.BitboardReversi; -import org.toop.game.games.tictactoe.BitboardTicTacToe; -import org.toop.game.players.ArtificialPlayer; -import org.toop.game.players.OnlinePlayer; -import org.toop.game.players.RandomAI; +import org.toop.framework.networking.connection.clients.TournamentNetworkingClient; +import org.toop.framework.networking.connection.events.NetworkEvents; +import org.toop.framework.networking.connection.types.NetworkingConnector; +import org.toop.framework.game.games.reversi.BitboardReversi; +import org.toop.framework.game.games.tictactoe.BitboardTicTacToe; +import org.toop.framework.game.players.ArtificialPlayer; +import org.toop.framework.game.players.OnlinePlayer; +import org.toop.framework.game.players.RandomAI; import org.toop.local.AppContext; import java.util.List; diff --git a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java index 7c2bde0..99b4589 100644 --- a/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/ReversiBitCanvas.java @@ -2,10 +2,7 @@ package org.toop.app.canvas; import javafx.scene.paint.Color; import org.toop.app.App; -import org.toop.game.games.reversi.BitboardReversi; - -import java.util.Arrays; -import java.util.function.Consumer; +import org.toop.framework.game.games.reversi.BitboardReversi; public class ReversiBitCanvas extends BitGameCanvas { public ReversiBitCanvas() { diff --git a/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java b/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java index 443adbd..6c723cb 100644 --- a/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/TicTacToeBitCanvas.java @@ -2,10 +2,7 @@ package org.toop.app.canvas; import javafx.scene.paint.Color; import org.toop.app.App; -import org.toop.game.games.tictactoe.BitboardTicTacToe; - -import java.util.Arrays; -import java.util.function.Consumer; +import org.toop.framework.game.games.tictactoe.BitboardTicTacToe; public class TicTacToeBitCanvas extends BitGameCanvas{ public TicTacToeBitCanvas() { diff --git a/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java b/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java index 2c3ad49..80e998f 100644 --- a/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java +++ b/app/src/main/java/org/toop/app/gameControllers/GenericGameController.java @@ -15,8 +15,8 @@ import org.toop.framework.gameFramework.model.game.TurnBasedGame; import org.toop.framework.gameFramework.model.game.threadBehaviour.ThreadBehaviour; import org.toop.framework.gameFramework.model.player.Player; import org.toop.framework.gameFramework.view.GUIEvents; -import org.toop.framework.networking.events.NetworkEvents; -import org.toop.game.players.LocalPlayer; +import org.toop.framework.networking.connection.events.NetworkEvents; +import org.toop.framework.game.players.LocalPlayer; public class GenericGameController> implements GameController { protected final EventFlow eventFlow = new EventFlow(); diff --git a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java index 40784b0..2f1f3c2 100644 --- a/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/ReversiBitController.java @@ -3,10 +3,10 @@ package org.toop.app.gameControllers; import org.toop.app.canvas.ReversiBitCanvas; import org.toop.framework.gameFramework.model.game.threadBehaviour.ThreadBehaviour; import org.toop.framework.gameFramework.model.player.Player; -import org.toop.game.gameThreads.LocalThreadBehaviour; -import org.toop.game.gameThreads.OnlineThreadBehaviour; -import org.toop.game.games.reversi.BitboardReversi; -import org.toop.game.players.OnlinePlayer; +import org.toop.framework.game.gameThreads.LocalThreadBehaviour; +import org.toop.framework.game.gameThreads.OnlineThreadBehaviour; +import org.toop.framework.game.games.reversi.BitboardReversi; +import org.toop.framework.game.players.OnlinePlayer; public class ReversiBitController extends GenericGameController { public ReversiBitController(Player[] players) { diff --git a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java index 6307894..b874382 100644 --- a/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java +++ b/app/src/main/java/org/toop/app/gameControllers/TicTacToeBitController.java @@ -3,11 +3,10 @@ package org.toop.app.gameControllers; import org.toop.app.canvas.TicTacToeBitCanvas; import org.toop.framework.gameFramework.model.game.threadBehaviour.ThreadBehaviour; import org.toop.framework.gameFramework.model.player.Player; -import org.toop.game.gameThreads.LocalFixedRateThreadBehaviour; -import org.toop.game.gameThreads.LocalThreadBehaviour; -import org.toop.game.gameThreads.OnlineThreadBehaviour; -import org.toop.game.games.tictactoe.BitboardTicTacToe; -import org.toop.game.players.OnlinePlayer; +import org.toop.framework.game.gameThreads.LocalThreadBehaviour; +import org.toop.framework.game.gameThreads.OnlineThreadBehaviour; +import org.toop.framework.game.games.tictactoe.BitboardTicTacToe; +import org.toop.framework.game.players.OnlinePlayer; public class TicTacToeBitController extends GenericGameController { public TicTacToeBitController(Player[] players) { diff --git a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java index 9b9bed2..d84b074 100644 --- a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java +++ b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java @@ -2,24 +2,21 @@ package org.toop.app.widget.view; import javafx.application.Platform; import org.toop.app.GameInformation; -import org.toop.app.canvas.ReversiBitCanvas; -import org.toop.app.canvas.TicTacToeBitCanvas; -import org.toop.app.gameControllers.GenericGameController; import org.toop.app.gameControllers.ReversiBitController; import org.toop.app.gameControllers.TicTacToeBitController; import org.toop.framework.gameFramework.controller.GameController; import org.toop.framework.gameFramework.model.player.Player; -import org.toop.game.games.reversi.BitboardReversi; -import org.toop.game.games.tictactoe.BitboardTicTacToe; -import org.toop.game.players.ArtificialPlayer; -import org.toop.game.players.LocalPlayer; +import org.toop.framework.game.games.reversi.BitboardReversi; +import org.toop.framework.game.games.tictactoe.BitboardTicTacToe; +import org.toop.framework.game.players.ArtificialPlayer; +import org.toop.framework.game.players.LocalPlayer; import org.toop.app.widget.Primitive; import org.toop.app.widget.complex.PlayerInfoWidget; import org.toop.app.widget.complex.ViewWidget; import org.toop.app.widget.popup.ErrorPopup; import org.toop.app.widget.tutorial.*; -import org.toop.game.players.MiniMaxAI; -import org.toop.game.players.RandomAI; +import org.toop.framework.game.players.MiniMaxAI; +import org.toop.framework.game.players.RandomAI; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -27,9 +24,6 @@ import javafx.scene.control.ScrollPane; import javafx.scene.layout.VBox; import org.toop.local.AppSettings; -import java.util.Arrays; -import java.util.Random; - public class LocalMultiplayerView extends ViewWidget { private final GameInformation information; diff --git a/framework/pom.xml b/framework/pom.xml index b5796c5..9d2055f 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -147,7 +147,6 @@ 2.42.0 - diff --git a/game/src/main/java/org/toop/game/Move.java b/framework/src/main/java/org/toop/framework/game/Move.java similarity index 77% rename from game/src/main/java/org/toop/game/Move.java rename to framework/src/main/java/org/toop/framework/game/Move.java index 62a2b1a..cd1401b 100644 --- a/game/src/main/java/org/toop/game/Move.java +++ b/framework/src/main/java/org/toop/framework/game/Move.java @@ -1,3 +1,3 @@ -package org.toop.game; +package org.toop.framework.game; // TODO: Remove this, only used in ReversiCanvas. Needs to not public record Move(int position, char value) {} diff --git a/game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java b/framework/src/main/java/org/toop/framework/game/gameThreads/LocalFixedRateThreadBehaviour.java similarity index 98% rename from game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java rename to framework/src/main/java/org/toop/framework/game/gameThreads/LocalFixedRateThreadBehaviour.java index 0a9da7f..1104511 100644 --- a/game/src/main/java/org/toop/game/gameThreads/LocalFixedRateThreadBehaviour.java +++ b/framework/src/main/java/org/toop/framework/game/gameThreads/LocalFixedRateThreadBehaviour.java @@ -1,4 +1,4 @@ -package org.toop.game.gameThreads; +package org.toop.framework.game.gameThreads; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.gameFramework.GameState; diff --git a/game/src/main/java/org/toop/game/gameThreads/LocalThreadBehaviour.java b/framework/src/main/java/org/toop/framework/game/gameThreads/LocalThreadBehaviour.java similarity index 98% rename from game/src/main/java/org/toop/game/gameThreads/LocalThreadBehaviour.java rename to framework/src/main/java/org/toop/framework/game/gameThreads/LocalThreadBehaviour.java index 79c57f9..dc5d400 100644 --- a/game/src/main/java/org/toop/game/gameThreads/LocalThreadBehaviour.java +++ b/framework/src/main/java/org/toop/framework/game/gameThreads/LocalThreadBehaviour.java @@ -1,4 +1,4 @@ -package org.toop.game.gameThreads; +package org.toop.framework.game.gameThreads; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.gameFramework.model.game.threadBehaviour.AbstractThreadBehaviour; diff --git a/game/src/main/java/org/toop/game/gameThreads/OnlineThreadBehaviour.java b/framework/src/main/java/org/toop/framework/game/gameThreads/OnlineThreadBehaviour.java similarity index 96% rename from game/src/main/java/org/toop/game/gameThreads/OnlineThreadBehaviour.java rename to framework/src/main/java/org/toop/framework/game/gameThreads/OnlineThreadBehaviour.java index ae9aa88..5c53bd9 100644 --- a/game/src/main/java/org/toop/game/gameThreads/OnlineThreadBehaviour.java +++ b/framework/src/main/java/org/toop/framework/game/gameThreads/OnlineThreadBehaviour.java @@ -1,4 +1,4 @@ -package org.toop.game.gameThreads; +package org.toop.framework.game.gameThreads; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.gameFramework.model.game.threadBehaviour.AbstractThreadBehaviour; @@ -6,7 +6,7 @@ import org.toop.framework.gameFramework.view.GUIEvents; import org.toop.framework.gameFramework.model.game.TurnBasedGame; import org.toop.framework.gameFramework.model.game.SupportsOnlinePlay; import org.toop.framework.gameFramework.model.player.Player; -import org.toop.game.players.OnlinePlayer; +import org.toop.framework.game.players.OnlinePlayer; /** * Handles online multiplayer game logic. diff --git a/game/src/main/java/org/toop/game/gameThreads/OnlineWithSleepThreadBehaviour.java b/framework/src/main/java/org/toop/framework/game/gameThreads/OnlineWithSleepThreadBehaviour.java similarity index 91% rename from game/src/main/java/org/toop/game/gameThreads/OnlineWithSleepThreadBehaviour.java rename to framework/src/main/java/org/toop/framework/game/gameThreads/OnlineWithSleepThreadBehaviour.java index a666f8d..6ba3351 100644 --- a/game/src/main/java/org/toop/game/gameThreads/OnlineWithSleepThreadBehaviour.java +++ b/framework/src/main/java/org/toop/framework/game/gameThreads/OnlineWithSleepThreadBehaviour.java @@ -1,7 +1,6 @@ -package org.toop.game.gameThreads; +package org.toop.framework.game.gameThreads; import org.toop.framework.gameFramework.model.game.TurnBasedGame; -import org.toop.framework.networking.events.NetworkEvents; /** * Online thread behaviour that adds a fixed delay before processing diff --git a/game/src/main/java/org/toop/game/players/LocalPlayer.java b/framework/src/main/java/org/toop/framework/game/players/LocalPlayer.java similarity index 96% rename from game/src/main/java/org/toop/game/players/LocalPlayer.java rename to framework/src/main/java/org/toop/framework/game/players/LocalPlayer.java index 8f3b94d..3bbfe97 100644 --- a/game/src/main/java/org/toop/game/players/LocalPlayer.java +++ b/framework/src/main/java/org/toop/framework/game/players/LocalPlayer.java @@ -1,8 +1,7 @@ -package org.toop.game.players; +package org.toop.framework.game.players; import org.toop.framework.gameFramework.model.game.TurnBasedGame; import org.toop.framework.gameFramework.model.player.AbstractPlayer; -import org.toop.framework.gameFramework.model.player.Player; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/game/src/main/java/org/toop/game/players/MiniMaxAI.java b/framework/src/main/java/org/toop/framework/game/players/MiniMaxAI.java similarity index 99% rename from game/src/main/java/org/toop/game/players/MiniMaxAI.java rename to framework/src/main/java/org/toop/framework/game/players/MiniMaxAI.java index 440bb50..de67068 100644 --- a/game/src/main/java/org/toop/game/players/MiniMaxAI.java +++ b/framework/src/main/java/org/toop/framework/game/players/MiniMaxAI.java @@ -1,4 +1,4 @@ -package org.toop.game.players; +package org.toop.framework.game.players; import org.toop.framework.gameFramework.GameState; import org.toop.framework.gameFramework.model.game.PlayResult; diff --git a/game/src/main/java/org/toop/game/players/OnlinePlayer.java b/framework/src/main/java/org/toop/framework/game/players/OnlinePlayer.java similarity index 96% rename from game/src/main/java/org/toop/game/players/OnlinePlayer.java rename to framework/src/main/java/org/toop/framework/game/players/OnlinePlayer.java index 9f011c0..60a45da 100644 --- a/game/src/main/java/org/toop/game/players/OnlinePlayer.java +++ b/framework/src/main/java/org/toop/framework/game/players/OnlinePlayer.java @@ -1,4 +1,4 @@ -package org.toop.game.players; +package org.toop.framework.game.players; import org.toop.framework.gameFramework.model.game.TurnBasedGame; import org.toop.framework.gameFramework.model.player.AbstractPlayer; diff --git a/game/src/main/java/org/toop/game/players/RandomAI.java b/framework/src/main/java/org/toop/framework/game/players/RandomAI.java similarity index 95% rename from game/src/main/java/org/toop/game/players/RandomAI.java rename to framework/src/main/java/org/toop/framework/game/players/RandomAI.java index 2d0fe02..f7006fb 100644 --- a/game/src/main/java/org/toop/game/players/RandomAI.java +++ b/framework/src/main/java/org/toop/framework/game/players/RandomAI.java @@ -1,4 +1,4 @@ -package org.toop.game.players; +package org.toop.framework.game.players; import org.toop.framework.gameFramework.model.game.TurnBasedGame; import org.toop.framework.gameFramework.model.player.AbstractAI; diff --git a/framework/src/main/java/org/toop/framework/gameFramework/controller/GameController.java b/framework/src/main/java/org/toop/framework/gameFramework/controller/GameController.java index f355dc5..5591d25 100644 --- a/framework/src/main/java/org/toop/framework/gameFramework/controller/GameController.java +++ b/framework/src/main/java/org/toop/framework/gameFramework/controller/GameController.java @@ -1,8 +1,7 @@ package org.toop.framework.gameFramework.controller; -import org.toop.framework.gameFramework.model.game.SupportsOnlinePlay; import org.toop.framework.gameFramework.model.game.threadBehaviour.Controllable; -import org.toop.framework.networking.events.NetworkEvents; +import org.toop.framework.networking.connection.events.NetworkEvents; public interface GameController extends Controllable, UpdatesGameUI { /** Called when it is this player's turn to make a move. */ diff --git a/framework/src/main/java/org/toop/framework/gameFramework/model/game/SupportsOnlinePlay.java b/framework/src/main/java/org/toop/framework/gameFramework/model/game/SupportsOnlinePlay.java index 1cc1641..965056e 100644 --- a/framework/src/main/java/org/toop/framework/gameFramework/model/game/SupportsOnlinePlay.java +++ b/framework/src/main/java/org/toop/framework/gameFramework/model/game/SupportsOnlinePlay.java @@ -1,7 +1,5 @@ package org.toop.framework.gameFramework.model.game; -import org.toop.framework.networking.events.NetworkEvents; - /** * Interface for games that support online multiplayer play. *

diff --git a/framework/src/main/java/org/toop/framework/networking/NetworkingClientEventListener.java b/framework/src/main/java/org/toop/framework/networking/connection/NetworkingClientEventListener.java similarity index 96% rename from framework/src/main/java/org/toop/framework/networking/NetworkingClientEventListener.java rename to framework/src/main/java/org/toop/framework/networking/connection/NetworkingClientEventListener.java index 5a9a08d..05e9bc8 100644 --- a/framework/src/main/java/org/toop/framework/networking/NetworkingClientEventListener.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/NetworkingClientEventListener.java @@ -1,13 +1,13 @@ -package org.toop.framework.networking; +package org.toop.framework.networking.connection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.framework.SnowflakeGenerator; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.eventbus.bus.EventBus; -import org.toop.framework.networking.events.NetworkEvents; -import org.toop.framework.networking.exceptions.ClientNotFoundException; -import org.toop.framework.networking.interfaces.NetworkingClientManager; +import org.toop.framework.networking.connection.events.NetworkEvents; +import org.toop.framework.networking.connection.exceptions.ClientNotFoundException; +import org.toop.framework.networking.connection.interfaces.NetworkingClientManager; public class NetworkingClientEventListener { private static final Logger logger = LogManager.getLogger(NetworkingClientEventListener.class); diff --git a/framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java b/framework/src/main/java/org/toop/framework/networking/connection/NetworkingClientManager.java similarity index 90% rename from framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java rename to framework/src/main/java/org/toop/framework/networking/connection/NetworkingClientManager.java index 4f1d2ac..1bd0643 100644 --- a/framework/src/main/java/org/toop/framework/networking/NetworkingClientManager.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/NetworkingClientManager.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking; +package org.toop.framework.networking.connection; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -10,13 +10,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.eventbus.bus.EventBus; -import org.toop.framework.networking.events.NetworkEvents; -import org.toop.framework.networking.exceptions.ClientNotFoundException; -import org.toop.framework.networking.exceptions.CouldNotConnectException; -import org.toop.framework.networking.interfaces.NetworkingClient; -import org.toop.framework.networking.types.NetworkingConnector; +import org.toop.framework.networking.connection.events.NetworkEvents; +import org.toop.framework.networking.connection.exceptions.ClientNotFoundException; +import org.toop.framework.networking.connection.exceptions.CouldNotConnectException; +import org.toop.framework.networking.connection.interfaces.NetworkingClient; +import org.toop.framework.networking.connection.types.NetworkingConnector; -public class NetworkingClientManager implements org.toop.framework.networking.interfaces.NetworkingClientManager { +public class NetworkingClientManager implements org.toop.framework.networking.connection.interfaces.NetworkingClientManager { private static final Logger logger = LogManager.getLogger(NetworkingClientManager.class); private final EventBus eventBus; diff --git a/framework/src/main/java/org/toop/framework/networking/clients/TournamentNetworkingClient.java b/framework/src/main/java/org/toop/framework/networking/connection/clients/TournamentNetworkingClient.java similarity index 92% rename from framework/src/main/java/org/toop/framework/networking/clients/TournamentNetworkingClient.java rename to framework/src/main/java/org/toop/framework/networking/connection/clients/TournamentNetworkingClient.java index 47adef9..1976e91 100644 --- a/framework/src/main/java/org/toop/framework/networking/clients/TournamentNetworkingClient.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/clients/TournamentNetworkingClient.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.clients; +package org.toop.framework.networking.connection.clients; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; @@ -12,9 +12,9 @@ import io.netty.util.CharsetUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.framework.eventbus.bus.EventBus; -import org.toop.framework.networking.exceptions.CouldNotConnectException; -import org.toop.framework.networking.handlers.NetworkingGameClientHandler; -import org.toop.framework.networking.interfaces.NetworkingClient; +import org.toop.framework.networking.connection.exceptions.CouldNotConnectException; +import org.toop.framework.networking.connection.handlers.NetworkingGameClientHandler; +import org.toop.framework.networking.connection.interfaces.NetworkingClient; import java.net.InetSocketAddress; diff --git a/framework/src/main/java/org/toop/framework/networking/events/NetworkEvents.java b/framework/src/main/java/org/toop/framework/networking/connection/events/NetworkEvents.java similarity index 97% rename from framework/src/main/java/org/toop/framework/networking/events/NetworkEvents.java rename to framework/src/main/java/org/toop/framework/networking/connection/events/NetworkEvents.java index 891fb39..d6c0140 100644 --- a/framework/src/main/java/org/toop/framework/networking/events/NetworkEvents.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/events/NetworkEvents.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.events; +package org.toop.framework.networking.connection.events; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -6,8 +6,8 @@ import java.util.concurrent.CompletableFuture; import org.toop.annotations.AutoResponseResult; import org.toop.framework.eventbus.GlobalEventBus; import org.toop.framework.eventbus.events.*; -import org.toop.framework.networking.interfaces.NetworkingClient; -import org.toop.framework.networking.types.NetworkingConnector; +import org.toop.framework.networking.connection.interfaces.NetworkingClient; +import org.toop.framework.networking.connection.types.NetworkingConnector; /** * Defines all event types related to the networking subsystem. diff --git a/framework/src/main/java/org/toop/framework/networking/exceptions/ClientNotFoundException.java b/framework/src/main/java/org/toop/framework/networking/connection/exceptions/ClientNotFoundException.java similarity index 91% rename from framework/src/main/java/org/toop/framework/networking/exceptions/ClientNotFoundException.java rename to framework/src/main/java/org/toop/framework/networking/connection/exceptions/ClientNotFoundException.java index 2506b26..7d8594a 100644 --- a/framework/src/main/java/org/toop/framework/networking/exceptions/ClientNotFoundException.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/exceptions/ClientNotFoundException.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.exceptions; +package org.toop.framework.networking.connection.exceptions; /** * Thrown when an operation is attempted on a networking client diff --git a/framework/src/main/java/org/toop/framework/networking/exceptions/CouldNotConnectException.java b/framework/src/main/java/org/toop/framework/networking/connection/exceptions/CouldNotConnectException.java similarity index 89% rename from framework/src/main/java/org/toop/framework/networking/exceptions/CouldNotConnectException.java rename to framework/src/main/java/org/toop/framework/networking/connection/exceptions/CouldNotConnectException.java index 839fb0b..a364c9c 100644 --- a/framework/src/main/java/org/toop/framework/networking/exceptions/CouldNotConnectException.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/exceptions/CouldNotConnectException.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.exceptions; +package org.toop.framework.networking.connection.exceptions; public class CouldNotConnectException extends RuntimeException { diff --git a/framework/src/main/java/org/toop/framework/networking/exceptions/NetworkingInitializationException.java b/framework/src/main/java/org/toop/framework/networking/connection/exceptions/NetworkingInitializationException.java similarity index 76% rename from framework/src/main/java/org/toop/framework/networking/exceptions/NetworkingInitializationException.java rename to framework/src/main/java/org/toop/framework/networking/connection/exceptions/NetworkingInitializationException.java index 0ff430a..3b2582f 100644 --- a/framework/src/main/java/org/toop/framework/networking/exceptions/NetworkingInitializationException.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/exceptions/NetworkingInitializationException.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.exceptions; +package org.toop.framework.networking.connection.exceptions; public class NetworkingInitializationException extends RuntimeException { public NetworkingInitializationException(String message, Throwable cause) { diff --git a/framework/src/main/java/org/toop/framework/networking/handlers/NetworkingGameClientHandler.java b/framework/src/main/java/org/toop/framework/networking/connection/handlers/NetworkingGameClientHandler.java similarity index 98% rename from framework/src/main/java/org/toop/framework/networking/handlers/NetworkingGameClientHandler.java rename to framework/src/main/java/org/toop/framework/networking/connection/handlers/NetworkingGameClientHandler.java index 7b4bf69..a313d97 100644 --- a/framework/src/main/java/org/toop/framework/networking/handlers/NetworkingGameClientHandler.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/handlers/NetworkingGameClientHandler.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.handlers; +package org.toop.framework.networking.connection.handlers; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; @@ -9,7 +9,7 @@ import java.util.regex.Pattern; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.toop.framework.eventbus.bus.EventBus; -import org.toop.framework.networking.events.NetworkEvents; +import org.toop.framework.networking.connection.events.NetworkEvents; public class NetworkingGameClientHandler extends ChannelInboundHandlerAdapter { private static final Logger logger = LogManager.getLogger(NetworkingGameClientHandler.class); diff --git a/framework/src/main/java/org/toop/framework/networking/interfaces/NetworkingClient.java b/framework/src/main/java/org/toop/framework/networking/connection/interfaces/NetworkingClient.java similarity index 66% rename from framework/src/main/java/org/toop/framework/networking/interfaces/NetworkingClient.java rename to framework/src/main/java/org/toop/framework/networking/connection/interfaces/NetworkingClient.java index 09b215c..31731d3 100644 --- a/framework/src/main/java/org/toop/framework/networking/interfaces/NetworkingClient.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/interfaces/NetworkingClient.java @@ -1,6 +1,6 @@ -package org.toop.framework.networking.interfaces; +package org.toop.framework.networking.connection.interfaces; -import org.toop.framework.networking.exceptions.CouldNotConnectException; +import org.toop.framework.networking.connection.exceptions.CouldNotConnectException; import java.net.InetSocketAddress; diff --git a/framework/src/main/java/org/toop/framework/networking/interfaces/NetworkingClientManager.java b/framework/src/main/java/org/toop/framework/networking/connection/interfaces/NetworkingClientManager.java similarity index 57% rename from framework/src/main/java/org/toop/framework/networking/interfaces/NetworkingClientManager.java rename to framework/src/main/java/org/toop/framework/networking/connection/interfaces/NetworkingClientManager.java index c236080..31fcaa2 100644 --- a/framework/src/main/java/org/toop/framework/networking/interfaces/NetworkingClientManager.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/interfaces/NetworkingClientManager.java @@ -1,8 +1,8 @@ -package org.toop.framework.networking.interfaces; +package org.toop.framework.networking.connection.interfaces; -import org.toop.framework.networking.exceptions.ClientNotFoundException; -import org.toop.framework.networking.exceptions.CouldNotConnectException; -import org.toop.framework.networking.types.NetworkingConnector; +import org.toop.framework.networking.connection.exceptions.ClientNotFoundException; +import org.toop.framework.networking.connection.exceptions.CouldNotConnectException; +import org.toop.framework.networking.connection.types.NetworkingConnector; public interface NetworkingClientManager { void startClient( diff --git a/framework/src/main/java/org/toop/framework/networking/types/NetworkingConnector.java b/framework/src/main/java/org/toop/framework/networking/connection/types/NetworkingConnector.java similarity index 73% rename from framework/src/main/java/org/toop/framework/networking/types/NetworkingConnector.java rename to framework/src/main/java/org/toop/framework/networking/connection/types/NetworkingConnector.java index ee6ed44..ca8fc40 100644 --- a/framework/src/main/java/org/toop/framework/networking/types/NetworkingConnector.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/types/NetworkingConnector.java @@ -1,4 +1,4 @@ -package org.toop.framework.networking.types; +package org.toop.framework.networking.connection.types; import java.util.concurrent.TimeUnit; diff --git a/framework/src/main/java/org/toop/framework/networking/types/ServerCommand.java b/framework/src/main/java/org/toop/framework/networking/connection/types/ServerCommand.java similarity index 52% rename from framework/src/main/java/org/toop/framework/networking/types/ServerCommand.java rename to framework/src/main/java/org/toop/framework/networking/connection/types/ServerCommand.java index e11bb61..9472810 100644 --- a/framework/src/main/java/org/toop/framework/networking/types/ServerCommand.java +++ b/framework/src/main/java/org/toop/framework/networking/connection/types/ServerCommand.java @@ -1,3 +1,3 @@ -package org.toop.framework.networking.types; +package org.toop.framework.networking.connection.types; public record ServerCommand(long clientId, String command) {} diff --git a/framework/src/main/java/org/toop/framework/networking/connection/types/ServerMessage.java b/framework/src/main/java/org/toop/framework/networking/connection/types/ServerMessage.java new file mode 100644 index 0000000..3ca1158 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/connection/types/ServerMessage.java @@ -0,0 +1,3 @@ +package org.toop.framework.networking.connection.types; + +public record ServerMessage(String message) {} diff --git a/framework/src/main/java/org/toop/framework/networking/server/Game.java b/framework/src/main/java/org/toop/framework/networking/server/Game.java new file mode 100644 index 0000000..057e37c --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/Game.java @@ -0,0 +1,30 @@ +package org.toop.framework.networking.server; + +import org.toop.framework.game.BitboardGame; + +public class Game implements OnlineGame { + + private long id; + private User[] users; + private GameDefinition> game; + + public Game(GameDefinition game, User... users) { + this.game = game; + this.users = users; + } + + @Override + public long id() { + return id; + } + + @Override + public GameDefinition game() { + return game; + } + + @Override + public User[] users() { + return users; + } +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/GameDefinition.java b/framework/src/main/java/org/toop/framework/networking/server/GameDefinition.java new file mode 100644 index 0000000..629bc24 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/GameDefinition.java @@ -0,0 +1,26 @@ +package org.toop.framework.networking.server; + +import java.lang.reflect.InvocationTargetException; + +public class GameDefinition { + private final String name; + private final Class game; + + public GameDefinition(String name, Class game) { + this.name = name; + this.game = game; + } + + public String name() { + return name; + } + + public T create(String... users) { + try { + return game.getDeclaredConstructor().newInstance(users); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/GameServer.java b/framework/src/main/java/org/toop/framework/networking/server/GameServer.java new file mode 100644 index 0000000..39a03f7 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/GameServer.java @@ -0,0 +1,8 @@ +package org.toop.framework.networking.server; + +public interface GameServer { +// List gameTypes(); +// List ongoingGames(); +// void startGame(String gameType, User... users); +// String[] onlineUsers(); +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/MasterServer.java b/framework/src/main/java/org/toop/framework/networking/server/MasterServer.java new file mode 100644 index 0000000..634ae6f --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/MasterServer.java @@ -0,0 +1,68 @@ +package org.toop.framework.networking.server; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.nio.NioIoHandler; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LineBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import org.toop.framework.SnowflakeGenerator; +import org.toop.framework.game.BitboardGame; + +import java.util.Map; + +public class MasterServer { + private final int port; + public final Server gs; + + public MasterServer(int port, Map>> gameTypes) { + this.port = port; + this.gs = new Server(gameTypes); + } + + public void start() throws InterruptedException { + + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory()); + + try { + + ServerBootstrap bootstrap = new ServerBootstrap(); + bootstrap.group(workerGroup); + bootstrap.channel(NioServerSocketChannel.class); + bootstrap.option(ChannelOption.SO_BACKLOG, 128); + bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); + bootstrap.handler(new LoggingHandler(LogLevel.INFO)); + bootstrap.childHandler( + new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) { + + ChannelPipeline pipeline = ch.pipeline(); + + pipeline.addLast(new LineBasedFrameDecoder(8192)); + pipeline.addLast(new StringDecoder()); + pipeline.addLast(new StringEncoder()); + + long userid = SnowflakeGenerator.nextId(); + User user = new User(userid, ""+userid); + pipeline.addLast(new ServerHandler(user, gs)); + } + } + ); + + ChannelFuture future = bootstrap.bind(port).sync(); + System.out.println("MasterServer listening on port " + port); + + future.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/MessageStore.java b/framework/src/main/java/org/toop/framework/networking/server/MessageStore.java new file mode 100644 index 0000000..6fbba3b --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/MessageStore.java @@ -0,0 +1,7 @@ +package org.toop.framework.networking.server; + +public interface MessageStore { + void add(String message); + String get(); + void reset(); +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/OnlineGame.java b/framework/src/main/java/org/toop/framework/networking/server/OnlineGame.java new file mode 100644 index 0000000..59b3399 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/OnlineGame.java @@ -0,0 +1,7 @@ +package org.toop.framework.networking.server; + +public interface OnlineGame { + long id(); + GameDefinition game(); + User[] users(); +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/ParsedMessage.java b/framework/src/main/java/org/toop/framework/networking/server/ParsedMessage.java new file mode 100644 index 0000000..5f8e550 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/ParsedMessage.java @@ -0,0 +1,4 @@ +package org.toop.framework.networking.server; + +public record ParsedMessage(String command, String... args) {} + diff --git a/framework/src/main/java/org/toop/framework/networking/server/Parser.java b/framework/src/main/java/org/toop/framework/networking/server/Parser.java new file mode 100644 index 0000000..016f797 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/Parser.java @@ -0,0 +1,4 @@ +package org.toop.framework.networking.server; + +public class Parser { +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/ServableGame.java b/framework/src/main/java/org/toop/framework/networking/server/ServableGame.java new file mode 100644 index 0000000..17dd3a9 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/ServableGame.java @@ -0,0 +1,4 @@ +package org.toop.framework.networking.server; + +public interface ServableGame { +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/Server.java b/framework/src/main/java/org/toop/framework/networking/server/Server.java new file mode 100644 index 0000000..757c490 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/Server.java @@ -0,0 +1,51 @@ +package org.toop.framework.networking.server; + +import org.toop.framework.game.BitboardGame; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class Server implements GameServer { + + final private Map>> gameTypes; + public List games = new ArrayList<>(); + final private Map users = new ConcurrentHashMap<>(); + + public Server(Map>> gameTypes) { + this.gameTypes = gameTypes; + } + + public void addUser(ServerUser user) { + users.putIfAbsent(user.id(), user); + } + + public void removeUser(ServerUser user) { + users.remove(user.id()); + } + + public String[] gameTypes() { + return gameTypes.keySet().toArray(new String[0]); + } + +// public List>> ongoingGames() { +// return List.of(); +// } + + public void startGame(String gameType, User... users) { + if (!gameTypes.containsKey(gameType)) return; + + try { + var game = new Game(gameTypes.get(gameType).create(), users); + games.addLast(new Game(game, users)); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + public String[] onlineUsers() { + return users.values().stream().map(ServerUser::name).toArray(String[]::new); + } +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/ServerHandler.java b/framework/src/main/java/org/toop/framework/networking/server/ServerHandler.java new file mode 100644 index 0000000..f5da259 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/ServerHandler.java @@ -0,0 +1,117 @@ +package org.toop.framework.networking.server; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class ServerHandler extends SimpleChannelInboundHandler { + + private final User user; + private final Server server; + + public ServerHandler(User user, Server server) { + this.user = user; + this.server = server; + } + + @Override + public void channelActive(ChannelHandlerContext ctx) { + ctx.writeAndFlush("WELCOME " + user.id() + "\n"); + + user.setCtx(ctx); + server.addUser(user); // TODO set correct name on login + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, String msg) { + ParsedMessage p = parse(msg); + if (p == null) return; + + IO.println(p.command() + " " + Arrays.toString(p.args())); + + switch (p.command()) { + case "ping" -> ctx.writeAndFlush("PONG\n"); + case "login" -> handleLogin(p); + case "get" -> handleGet(p); + case "subscribe" -> handleSubscribe(p); + case "move" -> handleMove(p); + case "challenge" -> handleChallenge(p); + case "message" -> handleMessage(p); + case "help" -> handleHelp(p); + default -> ctx.writeAndFlush("ERROR Unknown command\n"); + } + } + + private boolean allowedArgs(String... args) { + if (args.length < 1) return false; + return true; + } + + private void handleLogin(ParsedMessage p) { + + if (!allowedArgs(p.args())) return; + + user.setName(p.args()[0]); + } + + private void handleGet(ParsedMessage p) { + if (!allowedArgs(p.args())) return; + + switch (p.args()[0]) { + case "playerlist" -> user.ctx().writeAndFlush(Arrays.toString(server.onlineUsers())); + case "gamelist" -> user.ctx().writeAndFlush(Arrays.toString(server.gameTypes())); + } + } + + private void handleSubscribe(ParsedMessage p) { + // TODO + } + + private void handleHelp(ParsedMessage p) { + // TODO + } + + private void handleMessage(ParsedMessage p) { + // TODO + } + + private void handleChallenge(ParsedMessage p) { + // TODO + } + + private void handleMove(ParsedMessage p) { + // TODO + } + + private ParsedMessage parse(String msg) { + // TODO, what if empty string. + + if (msg.isEmpty()) return null; + + msg = msg.trim().toLowerCase(); + + List parts = new LinkedList<>(List.of(msg.split(" "))); + + if (parts.size() > 1) { + String command = parts.removeFirst(); + return new ParsedMessage(command, parts.toArray(String[]::new)); + } + else { + return new ParsedMessage(msg); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) { + server.removeUser(user); + } +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/ServerMessageStore.java b/framework/src/main/java/org/toop/framework/networking/server/ServerMessageStore.java new file mode 100644 index 0000000..22af1d7 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/ServerMessageStore.java @@ -0,0 +1,27 @@ +package org.toop.framework.networking.server; + +import java.util.Queue; + +public class ServerMessageStore implements MessageStore { + + Queue messageQueue; + + public ServerMessageStore(Queue messageQueue) { + this.messageQueue = messageQueue; + } + + @Override + public void add(String message) { + messageQueue.offer(message); + } + + @Override + public String get() { + return messageQueue.poll(); + } + + @Override + public void reset() { + messageQueue.clear(); + } +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/ServerUser.java b/framework/src/main/java/org/toop/framework/networking/server/ServerUser.java new file mode 100644 index 0000000..8e6e7a5 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/ServerUser.java @@ -0,0 +1,9 @@ +package org.toop.framework.networking.server; + +import java.net.InetSocketAddress; + +public interface ServerUser { + long id(); + String name(); + void setName(String name); +} diff --git a/framework/src/main/java/org/toop/framework/networking/server/User.java b/framework/src/main/java/org/toop/framework/networking/server/User.java new file mode 100644 index 0000000..8ae5026 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/networking/server/User.java @@ -0,0 +1,40 @@ +package org.toop.framework.networking.server; + +import io.netty.channel.ChannelHandlerContext; + +import java.net.InetSocketAddress; + +public class User implements ServerUser { + final private long id; + private String name; + private ChannelHandlerContext connectionContext; + + public User(long userId, String name) { + this.id = userId; + this.name = name; + } + + @Override + public long id() { + return id; + } + + @Override + public String name() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + public ChannelHandlerContext ctx() { + return connectionContext; + } + + public void setCtx(ChannelHandlerContext ctx) { + this.connectionContext = ctx; + } + +} diff --git a/framework/src/main/java/org/toop/framework/networking/types/ServerMessage.java b/framework/src/main/java/org/toop/framework/networking/types/ServerMessage.java deleted file mode 100644 index 606607d..0000000 --- a/framework/src/main/java/org/toop/framework/networking/types/ServerMessage.java +++ /dev/null @@ -1,3 +0,0 @@ -package org.toop.framework.networking.types; - -public record ServerMessage(String message) {} diff --git a/framework/src/test/java/org/toop/framework/networking/NetworkingClientManagerTest.java b/framework/src/test/java/org/toop/framework/networking/NetworkingClientManagerTest.java index e626683..4ce747b 100644 --- a/framework/src/test/java/org/toop/framework/networking/NetworkingClientManagerTest.java +++ b/framework/src/test/java/org/toop/framework/networking/NetworkingClientManagerTest.java @@ -9,7 +9,7 @@ //import org.mockito.*; //import org.toop.framework.SnowflakeGenerator; //import org.toop.framework.eventbus.EventFlow; -//import org.toop.framework.networking.events.NetworkEvents; +//import org.toop.framework.networking.connection.events.NetworkEvents; // //class NetworkingClientManagerTest { // diff --git a/framework/src/test/java/org/toop/framework/networking/events/NetworkEventsTest.java b/framework/src/test/java/org/toop/framework/networking/connection/events/NetworkEventsTest.java similarity index 99% rename from framework/src/test/java/org/toop/framework/networking/events/NetworkEventsTest.java rename to framework/src/test/java/org/toop/framework/networking/connection/events/NetworkEventsTest.java index 5170381..635772d 100644 --- a/framework/src/test/java/org/toop/framework/networking/events/NetworkEventsTest.java +++ b/framework/src/test/java/org/toop/framework/networking/connection/events/NetworkEventsTest.java @@ -1,4 +1,4 @@ -//package org.toop.framework.networking.events; +//package org.toop.framework.networking.connection.events; // //import static org.junit.jupiter.api.Assertions.*; //