From cf9dbef8820b7b63c4620ab1d2c0cb5277e3e0b2 Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:36:46 +0200 Subject: [PATCH 1/3] Correct client creation and user polling --- app/src/main/java/org/toop/app/Server.java | 58 +++++++++++++--------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/toop/app/Server.java b/app/src/main/java/org/toop/app/Server.java index 8ec565a..8a198ae 100644 --- a/app/src/main/java/org/toop/app/Server.java +++ b/app/src/main/java/org/toop/app/Server.java @@ -1,5 +1,6 @@ package org.toop.app; +import com.google.common.util.concurrent.AbstractScheduledService; import org.toop.app.game.ReversiGame; import org.toop.app.game.TicTacToeGame; import org.toop.app.view.ViewStack; @@ -9,13 +10,19 @@ import org.toop.app.view.views.OnlineView; import org.toop.app.view.views.SendChallengeView; import org.toop.app.view.views.ServerView; import org.toop.framework.eventbus.EventFlow; +import org.toop.framework.networking.clients.TournamentNetworkingClient; import org.toop.framework.networking.events.NetworkEvents; +import org.toop.framework.networking.interfaces.NetworkingClient; +import org.toop.framework.networking.types.NetworkingConnector; import org.toop.local.AppContext; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public final class Server { private String user = ""; @@ -58,8 +65,12 @@ public final class Server { } new EventFlow() - .addPostEvent(NetworkEvents.StartClient.class, ip, parsedPort) + .addPostEvent(NetworkEvents.StartClient.class, + new TournamentNetworkingClient(), + new NetworkingConnector(ip, parsedPort, 10, 1, TimeUnit.SECONDS) + ) .onResponse(NetworkEvents.StartClientResponse.class, e -> { + // TODO add if unsuccessful this.user = user; clientId = e.clientId(); @@ -68,30 +79,20 @@ public final class Server { view = new ServerView(user, this::sendChallenge, this::disconnect); ViewStack.push(view); - startPopulateThread(); + startPopulateScheduler(); }).postEvent(); new EventFlow().listen(this::handleReceivedChallenge); } - private void populatePlayerList() { - new EventFlow().listen(NetworkEvents.PlayerlistResponse.class, e -> { - if (e.clientId() == clientId) { - onlinePlayers = new ArrayList(List.of(e.playerlist())); - onlinePlayers.removeIf(name -> name.equalsIgnoreCase(user)); + private void populatePlayerList(ScheduledExecutorService scheduler, Runnable populatingTask) { - view.update(onlinePlayers); - } - }); + final long DELAY = 5; - final EventFlow sendGetPlayerList = new EventFlow().addPostEvent(new NetworkEvents.SendGetPlayerlist(clientId)); - - while (isPolling) { - sendGetPlayerList.postEvent(); - - try { - Thread.sleep(5000); - } catch (InterruptedException _) {} + if (!isPolling) scheduler.shutdown(); + else { + populatingTask.run(); + scheduler.schedule(() -> populatePlayerList(scheduler, populatingTask), DELAY, TimeUnit.SECONDS); } } @@ -173,6 +174,7 @@ public final class Server { private void disconnect() { new EventFlow().addPostEvent(new NetworkEvents.CloseClient(clientId)).postEvent(); + isPolling = false; ViewStack.push(new OnlineView()); } @@ -184,15 +186,25 @@ public final class Server { forfeitGame(); ViewStack.push(view); - startPopulateThread(); + startPopulateScheduler(); } - private void startPopulateThread() { + private void startPopulateScheduler() { isPolling = true; - final Thread populateThread = new Thread(this::populatePlayerList); - populateThread.setDaemon(false); - populateThread.start(); + EventFlow getPlayerlistFlow = new EventFlow() + .addPostEvent(new NetworkEvents.SendGetPlayerlist(clientId)) + .listen(NetworkEvents.PlayerlistResponse.class, e -> { + if (e.clientId() == clientId) { + onlinePlayers = new ArrayList<>(List.of(e.playerlist())); + onlinePlayers.removeIf(name -> name.equalsIgnoreCase(user)); + + view.update(onlinePlayers); + } + }, false); + + final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + scheduler.schedule(() -> populatePlayerList(scheduler, getPlayerlistFlow::postEvent), 0, TimeUnit.MILLISECONDS); } public List getGamesList() { From 975207a6de683298a5add06821d43bd49baef6f9 Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Thu, 16 Oct 2025 00:37:20 +0200 Subject: [PATCH 2/3] Nuke everything on close. --- app/src/main/java/org/toop/app/App.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java index 64513d5..d9d1f7f 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -79,6 +79,7 @@ public final class App extends Application { public static void quit() { ViewStack.cleanup(); stage.close(); + System.exit(0); // TODO: This is like dropping a nuke } public static void reload() { From 3a120803e38e10931b40e69167566085e4d95a60 Mon Sep 17 00:00:00 2001 From: Bas de Jong Date: Thu, 16 Oct 2025 13:59:24 +0200 Subject: [PATCH 3/3] Fixes for garbage code by Omar --- app/src/main/java/org/toop/app/Server.java | 24 ++++++++++++------- .../app/view/views/SendChallengeView.java | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/toop/app/Server.java b/app/src/main/java/org/toop/app/Server.java index 8a198ae..8d71c4a 100644 --- a/app/src/main/java/org/toop/app/Server.java +++ b/app/src/main/java/org/toop/app/Server.java @@ -29,6 +29,7 @@ public final class Server { private long clientId = -1; private List onlinePlayers = new CopyOnWriteArrayList(); + private List gameList = new CopyOnWriteArrayList<>(); private ServerView view; @@ -80,6 +81,9 @@ public final class Server { ViewStack.push(view); startPopulateScheduler(); + + populateGameList(); + }).postEvent(); new EventFlow().listen(this::handleReceivedChallenge); @@ -207,16 +211,18 @@ public final class Server { scheduler.schedule(() -> populatePlayerList(scheduler, getPlayerlistFlow::postEvent), 0, TimeUnit.MILLISECONDS); } - public List getGamesList() { - final List list = new ArrayList(); - list.add("tic-tac-toe"); // Todo: get games list from server and check if the game is supported - list.add("reversi"); + private void gamesListFromServerHandler(NetworkEvents.GamelistResponse event) { + gameList.addAll(List.of(event.gamelist())); + } + public void populateGameList() { new EventFlow().addPostEvent(new NetworkEvents.SendGetGamelist(clientId)) - .listen(NetworkEvents.GamelistResponse.class, e -> { - System.out.println(Arrays.toString(e.gamelist())); - }).postEvent(); - - return list; + .listen(NetworkEvents.GamelistResponse.class, + this::gamesListFromServerHandler, true + ).postEvent(); } + + public List getGameList() { + return gameList; + } } \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/view/views/SendChallengeView.java b/app/src/main/java/org/toop/app/view/views/SendChallengeView.java index a3bde9b..5d88a13 100644 --- a/app/src/main/java/org/toop/app/view/views/SendChallengeView.java +++ b/app/src/main/java/org/toop/app/view/views/SendChallengeView.java @@ -46,7 +46,7 @@ public final class SendChallengeView extends View { gameText.setText(AppContext.getString("to-a-game-of")); final ComboBox gamesCombobox = combobox(); - gamesCombobox.getItems().addAll(server.getGamesList()); + gamesCombobox.getItems().addAll(server.getGameList()); gamesCombobox.setValue(gamesCombobox.getItems().getFirst()); final Button sendButton = button();