From d078a709504c78cfe40f53116e0c07d3a51c4c3f Mon Sep 17 00:00:00 2001 From: Bas Antonius de Jong <49651652+BAFGdeJong@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:06:09 +0100 Subject: [PATCH] 289 server (#308) Incremental server update, with working tournament and player input timeout * Server update with new dev changes (#305) * merge widgets with development * readd previous game thread code * Revert "readd previous game thread code" This reverts commit d24feef73e0ba05357776d24e2a607d8be4aa849. * Revert "Merge remote-tracking branch 'origin/Development' into Development" This reverts commit 59d46cb73c3bf208ee359ce86f3ce4306d4e5964, reversing changes made to 38681c5db03e3e170c90ec3ec6795b6331b157df. * Revert "merge widgets with development" This reverts commit 38681c5db03e3e170c90ec3ec6795b6331b157df. * Merge 292 into development (#293) Applied template method pattern to abstract player * Added documentation to player classes and improved method names (#295) * mcts v1 * bitboard optimization * bitboard fix & mcts v2 & mcts v3. v3 still in progress and v4 coming soon * main --------- Co-authored-by: ramollia <> Co-authored-by: Stef Co-authored-by: Stef <48526421+StefBuwalda@users.noreply.github.com> * Hotfix for stuff * Logging and fixed user input getting stuck * Fixed merge mistakes * Working tournament * GlobalEventBus is now async instead * Shuffle now changeable, host can now switch tournament gametype * Tournament results are now send back to the clients connected to the server * Tournament now returns result to clients * Refactored tournament to use interfaces and builders * Removed unnecessary imports * Tournament refactor for better naming and easier to understand code * Starting a tournament now requires to be admin * Request admin list * Added admins to games * Tournament is now without admins * Added result comeback with a draw * Async tournament runner * Added back ability to shuffle matchmaker * Moved scoring calculation into scoring system * Tournament now uses propper builder pattern * Null handling * Removed input mistake, removed print * Refactored Tournament to use matchExecutor and ResultBroadcaster. Added turnTime and players are now added through Tournament creation instead of on MatchMaker/ScoreSystem creation * Added shuffle to builder * Removed unnecessary throw * More adaptable scoring system * Moved async runner to virtual thread * Timeout added * AI player given time change --------- Co-authored-by: Stef Co-authored-by: Stef <48526421+StefBuwalda@users.noreply.github.com> --- .idea/inspectionProfiles/Project_Default.xml | 2 +- app/src/main/java/org/toop/app/Server.java | 22 +++- .../org/toop/app/widget/view/ServerView.java | 76 +++++++---- .../toop/framework/eventbus/EventFlow.java | 4 +- .../framework/eventbus/GlobalEventBus.java | 17 ++- .../framework/eventbus/bus/AsyncEventBus.java | 7 + .../eventbus/bus/DefaultEventBus.java | 14 +- .../gameThreads/OnlineThreadBehaviour.java | 10 +- .../gameThreads/ServerThreadBehaviour.java | 67 +++++++--- .../framework/game/players/ServerPlayer.java | 11 +- .../connection/events/NetworkEvents.java | 4 + .../handlers/NetworkingGameClientHandler.java | 66 ++++++++++ .../networking/server/GameResultFuture.java | 7 + .../networking/server/GameServer.java | 6 +- .../networking/server/MatchExecutor.java | 10 ++ .../server/OnlineTurnBasedGame.java | 47 +++++-- .../framework/networking/server/Server.java | 109 +++++++++++++++- .../networking/server/client/NettyClient.java | 1 - .../server/handlers/MessageHandler.java | 39 ++++-- .../tournaments/AsyncTournamentRunner.java | 86 +++++++++++++ .../tournaments/BasicTournamentRunner.java | 40 ++++++ .../server/tournaments/ResultBroadcaster.java | 10 ++ .../server/tournaments/Tournament.java | 121 ++++++++++++++++++ .../server/tournaments/TournamentMatch.java | 18 +++ .../server/tournaments/TournamentRunner.java | 13 ++ .../DoubleRoundRobinMatchMaker.java | 81 ++++++++++++ .../tournaments/matchmakers/MatchMaker.java | 13 ++ .../matchmakers/RoundRobinMatchMaker.java | 67 ++++++++++ .../scoresystems/DrawCountScoreSystem.java | 43 +++++++ .../scoresystems/IntegerScoreSystem.java | 6 + .../scoresystems/LoseCountScoreSystem.java | 41 ++++++ .../scoresystems/MatchCountScoreSystem.java | 37 ++++++ .../tournaments/scoresystems/ScoreSystem.java | 10 ++ .../scoresystems/WinCountScoreSystem.java | 41 ++++++ .../tournaments/shufflers/RandomShuffle.java | 20 +++ .../tournaments/shufflers/Shuffler.java | 7 + 36 files changed, 1067 insertions(+), 106 deletions(-) create mode 100644 framework/src/main/java/org/toop/framework/eventbus/bus/AsyncEventBus.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/GameResultFuture.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/MatchExecutor.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/AsyncTournamentRunner.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/BasicTournamentRunner.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/ResultBroadcaster.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/Tournament.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/TournamentMatch.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/TournamentRunner.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/matchmakers/DoubleRoundRobinMatchMaker.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/matchmakers/MatchMaker.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/matchmakers/RoundRobinMatchMaker.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/scoresystems/DrawCountScoreSystem.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/scoresystems/IntegerScoreSystem.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/scoresystems/LoseCountScoreSystem.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/scoresystems/MatchCountScoreSystem.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/scoresystems/ScoreSystem.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/scoresystems/WinCountScoreSystem.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/shufflers/RandomShuffle.java create mode 100644 framework/src/main/java/org/toop/framework/networking/server/tournaments/shufflers/Shuffler.java diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 655cfae..e0e273b 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/java/org/toop/app/Server.java b/app/src/main/java/org/toop/app/Server.java index f6bcdec..43129e1 100644 --- a/app/src/main/java/org/toop/app/Server.java +++ b/app/src/main/java/org/toop/app/Server.java @@ -11,6 +11,7 @@ import org.toop.app.widget.popup.ErrorPopup; import org.toop.app.widget.popup.SendChallengePopup; import org.toop.app.widget.view.ServerView; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.game.players.ArtificialPlayer; import org.toop.framework.game.players.OnlinePlayer; import org.toop.framework.gameFramework.controller.GameController; import org.toop.framework.eventbus.GlobalEventBus; @@ -20,8 +21,10 @@ import org.toop.framework.networking.connection.events.NetworkEvents; import org.toop.framework.networking.connection.types.NetworkingConnector; import org.toop.framework.networking.server.gateway.NettyGatewayServer; import org.toop.framework.game.players.LocalPlayer; +import org.toop.game.players.ai.MCTSAI3; import org.toop.local.AppContext; +import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; @@ -117,7 +120,8 @@ public final class Server { return; } - primary = new ServerView(user, this::sendChallenge, clientId); + primary = new ServerView(user, this::sendChallenge, user, clientId); + WidgetContainer.getCurrentView().transitionNextCustom(primary, "disconnect", this::disconnect); a.unsubscribe("connecting"); @@ -159,7 +163,8 @@ public final class Server { .listen(NetworkEvents.GameResultResponse.class, this::handleGameResult, false, "game-result") .listen(NetworkEvents.GameMoveResponse.class, this::handleReceivedMove, false, "game-move") .listen(NetworkEvents.YourTurnResponse.class, this::handleYourTurn, false, "your-turn") - .listen(NetworkEvents.ClosedConnection.class, this::closedConnection, false, "closed-connection"); + .listen(NetworkEvents.ClosedConnection.class, this::closedConnection, false, "closed-connection") + .listen(NetworkEvents.TournamentResultResponse.class, this::handleTournamentResult, false, "tournament-result"); connectFlow = a; } @@ -205,7 +210,8 @@ public final class Server { information.players[opponentStartingTurn].name = response.opponent(); Player[] players = new Player[2]; - players[userStartingTurn] = new LocalPlayer(user); + + players[userStartingTurn] = new ArtificialPlayer(new MCTSAI3(1000), user); players[opponentStartingTurn] = new OnlinePlayer(response.opponent()); switch (type) { @@ -238,6 +244,13 @@ public final class Server { gameController.gameFinished(response); } + private void handleTournamentResult(NetworkEvents.TournamentResultResponse response) { + IO.println(response.gameType()); + IO.println(Arrays.toString(response.names())); + IO.println(Arrays.toString(response.scoreTypes())); + IO.println(Arrays.toString(response.scores().toArray())); + } + private void handleReceivedMove(NetworkEvents.GameMoveResponse response) { if (gameController == null) { return; @@ -337,7 +350,8 @@ public final class Server { private void gamesListFromServerHandler(NetworkEvents.GamelistResponse event) { gameList.clear(); - var gl = List.of(event.gamelist()); + var gl = new java.util.ArrayList<>(List.of(event.gamelist())); + gl.sort(String::compareTo); gameList.addAll(gl); primary.updateGameList(gl); } diff --git a/app/src/main/java/org/toop/app/widget/view/ServerView.java b/app/src/main/java/org/toop/app/widget/view/ServerView.java index 92c8101..9408b27 100644 --- a/app/src/main/java/org/toop/app/widget/view/ServerView.java +++ b/app/src/main/java/org/toop/app/widget/view/ServerView.java @@ -6,6 +6,8 @@ import javafx.scene.control.ComboBox; import org.toop.app.widget.Primitive; import org.toop.app.widget.complex.ViewWidget; +import java.io.Reader; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.function.Consumer; @@ -15,6 +17,7 @@ import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ListView; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.eventbus.GlobalEventBus; import org.toop.framework.networking.connection.events.NetworkEvents; public final class ServerView extends ViewWidget { @@ -22,46 +25,65 @@ public final class ServerView extends ViewWidget { private final Consumer onPlayerClicked; private final long clientId; - private final ComboBox gameList; + private final ComboBox gameListSub; + private final ComboBox gameListTour; private final ListView