diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java b/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java index 407abf6..0ee0b70 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/BudaLogConfig.java @@ -19,7 +19,7 @@ public class BudaLogConfig { LoggerContext ctx = (LoggerContext) LogManager.getContext(false); Configuration config = ctx.getConfiguration(); LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); - loggerConfig.setLevel(Level.WARN); // change level here + loggerConfig.setLevel(Level.INFO); // change level here ctx.updateLoggers(); // This causes all Loggers to refetch information from their LoggerConfig. } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 4142d4e..6fb264d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -10,6 +10,7 @@ import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ChatApp; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.Sprites; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatController; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LobbyDisplayHandler; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LoungeApp; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LoungeSceneViewController; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; @@ -48,6 +49,7 @@ public class Client { private GameStateModel gameStateModel; private GameController gameController; private DayNightChangeListener dayNightChangeListener; + private LobbyDisplayHandler lobbyDisplayHandler; private GUI gui; @@ -92,6 +94,7 @@ public class Client { this.gameController = new GameController(ChatApp.getClientModel(), gameStateModel); this.loungeApp = new LoungeApp(ChatApp.getClientModel()); this.loungeSceneViewController = new LoungeSceneViewController(); + this.lobbyDisplayHandler = new LobbyDisplayHandler(); LoungeSceneViewController.setClient(ChatApp.getClientModel()); } catch (IOException e) { e.printStackTrace(); @@ -370,10 +373,6 @@ public class Client { LOGGER.warn("Not a position given for noise " + e.getMessage()); } break; - case GuiParameters.listOfLobbies: - updateListOfLobbies(data); - //TODO - break; case GuiParameters.VoteIsOver: chatApp.getGameController().setNoiseButtonInvisible(); chatApp.getGameController().clearAllNoiseDisplay(); @@ -393,24 +392,19 @@ public class Client { gameStateModel.setGameOver(true); //TODO break; - case GuiParameters.addNewMemberToLobby: - addPlayerToLobby(data); - break; - case GuiParameters.newLobbyCreated: - makeNewLobby(data); - break; case GuiParameters.updateHighScore: chatApp.getLoungeSceneViewController().addHighScore(data); break; case GuiParameters.yourPosition: dayNightChangeListener.setPosition(Integer.parseInt(data)); break; - case GuiParameters.updatePrintLobby: - chatApp.getLoungeSceneViewController().clearLobbyPrint(); - chatApp.getLoungeSceneViewController().addLobbyPrint(data); - break; - case GuiParameters.removeLobby: - removeLobbyFromGui(data); + case GuiParameters.updateLobbyString: + if(!data.isEmpty()) { + lobbyDisplayHandler.updateLobbies(data); + ChatApp.getListController().updateList(); + } else { + ChatApp.getListController().clearVBox(); + } break; default: notificationTextDisplay(data); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java index 373e8561..ba867ee 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java @@ -65,13 +65,12 @@ public class JClientProtocolParser { c.changeUsername(msg.substring(6)); break; case Protocol.printToGUI: - LOGGER.info("First line of printToGui case!"); String substring = msg.substring(6); - LOGGER.debug("Following parameters where recieved: " + substring); int index = substring.indexOf("$"); LOGGER.debug("Index of $: " + index); String parameter = ""; String data = substring; + LOGGER.debug(data); try { parameter = substring.substring(0, index); data = substring.substring(index + 1); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java index 915b5f7..ea0d17d 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ChatApp.java @@ -4,6 +4,7 @@ import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatController; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.game.GameController; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.ListOfLobbiesController; import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge.LoungeSceneViewController; import java.net.URL; import java.util.Objects; @@ -28,10 +29,13 @@ public class ChatApp extends Application { private GameController gameC; private static LoungeSceneViewController loungeSceneViewController; private LoungeSceneViewController lSVController; + private static ListOfLobbiesController listController; + private ListOfLobbiesController listOfLobbiesController; public Node chat; public Node game; public Node backgroundDay; + public Node lobbyList; public ChatApp() { super(); @@ -137,6 +141,22 @@ public class ChatApp extends Application { loungeSceneViewController = controller; } + public void setListOfLobbiesController( + ListOfLobbiesController listOfLobbiesController) { + this.listOfLobbiesController = listOfLobbiesController; + } + + public static void setListController(ListOfLobbiesController controller) { + listController = controller; + } + + public static ListOfLobbiesController getListController() { + return listController; + } + + public ListOfLobbiesController getListOfLobbiesController() { + return listOfLobbiesController; + } /** * The main entry point for all JavaFX applications. The start method is called after the init @@ -165,9 +185,11 @@ public class ChatApp extends Application { URL chatResource = ChatApp.class.getResource("chat/ChatView.fxml"); URL gameResource = ChatApp.class.getResource("game/GameDayAll.fxml"); URL bgDayResource = ChatApp.class.getResource("TrainAnimationViewDay.fxml"); + URL listForLobbiesResource = ChatApp.class.getResource("lounge/ListOfLobbiesScrollPane.fxml"); this.chat = FXMLLoader.load(Objects.requireNonNull(chatResource)); this.game = FXMLLoader.load(Objects.requireNonNull(gameResource)); this.backgroundDay = FXMLLoader.load(Objects.requireNonNull(bgDayResource)); + this.lobbyList = FXMLLoader.load(Objects.requireNonNull(listForLobbiesResource)); LOGGER.debug(bgDayResource); } catch (Exception e) { LOGGER.warn("There was an Exception while loading"); @@ -180,6 +202,8 @@ public class ChatApp extends Application { Objects.requireNonNull(loungeResource)); this.setlSVController(loungeSceneViewController); lSVController.setChatApp(this); + listOfLobbiesController = listController; + listOfLobbiesController.setChatApp(this); // TODO bin chatController.getChatPaneRoot() border to root border for rezising Scene scene = new Scene(lounge); scene.setRoot(lounge); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/ListOfLobbiesController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/ListOfLobbiesController.java new file mode 100644 index 0000000..b03d272 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/ListOfLobbiesController.java @@ -0,0 +1,136 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge; + +import static javafx.scene.control.PopupControl.USE_COMPUTED_SIZE; + +import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.Client; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ChatApp; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; +import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; +import ch.unibas.dmi.dbis.cs108.multiplayer.server.ClientHandler; +import ch.unibas.dmi.dbis.cs108.multiplayer.server.Lobby; +import ch.unibas.dmi.dbis.cs108.multiplayer.server.LobbyUpdater; +import java.net.URL; +import java.util.HashSet; +import java.util.ResourceBundle; +import java.util.ResourceBundle.Control; +import javafx.application.Platform; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.Background; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class ListOfLobbiesController implements Initializable { + public static final Logger LOGGER = LogManager.getLogger(ListOfLobbiesController.class); + public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + + + @FXML + private ScrollPane backDropScrolePane; + @FXML + private AnchorPane scollingAnchorPane; + @FXML + private VBox LobbyListVBox; + + private ChatApp chatApp; //TODO: VeryImportant to set this one right! + private HashSet treeViews = new HashSet(); + + public void setChatApp(ChatApp chatApp) { + this.chatApp = chatApp; + } + + + public void updateList() { + clearVBox(); + for (LobbyModel lobby : LobbyDisplayHandler.getLobbies()) { + newTreeView(lobby.getId(), lobby.getAdmin(), chatApp.getcModel().getUsername(), lobby.getMembers()); + } + } + + /** + * Creates one new TreeView for one Lobby + * @param lobbyId the id of the lobby + * @param admin the admin of the lobby + * @param userName the username of the client + */ + public void newTreeView(int lobbyId, String admin, String userName, HashSet members) { + try { + Button button = new Button(); + if (admin.equals(userName)) { // the client of this user is the admin of this lobby + button.setOnAction(event -> startGame()); + button.setText("Start"); + } else { + button.setOnAction(event -> joinALobby(lobbyId)); + button.setText("Join"); + } + HBox rootHBox = new HBox(); + rootHBox.setPrefWidth(195); + rootHBox.setMaxHeight(20); + Label adminLabel = new Label(lobbyId + " " + admin); + adminLabel.setTextFill(Color.WHITE); + rootHBox.getChildren().add(adminLabel); + rootHBox.getChildren().add(button); + TreeItem root = new TreeItem(rootHBox); + root.setExpanded(true); + for (String member : members) { + HBox memberBox = new HBox(); + memberBox.setPrefWidth(195); + memberBox.setMaxHeight(20); + memberBox.setPrefHeight(USE_COMPUTED_SIZE); + Label memberLabel = new Label("- " + member); + memberLabel.setTextFill(Color.WHITE); + memberBox.getChildren().add(memberLabel); + root.getChildren().add(new TreeItem(memberBox)); + } + TreeView treeView = new TreeView<>(root); + treeView.setVisible(true); + treeView.setPrefWidth(195); + treeView.setPrefHeight(USE_COMPUTED_SIZE); + treeView.setMaxHeight(80); + Platform.runLater(new Runnable() { + @Override + public void run() { + LobbyListVBox.getChildren().add(treeView); + LobbyListVBox.setVisible(true); + //LobbyListVBox.setBackground(Background.fill(Color.DARKBLUE)); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + + public void clearVBox() { + Platform.runLater(new Runnable() { + @Override + public void run() { + LobbyListVBox.getChildren().clear(); + } + }); + } + + public void startGame() { + chatApp.getcModel().getClient().sendMsgToServer(Protocol.startANewGame); //TODO: Very important to get right! + } + + public void joinALobby(int id) { + chatApp.getcModel().getClient().sendMsgToServer(Protocol.joinLobby + "$" + id); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + ChatApp.setListController(this); + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyDisplayHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyDisplayHandler.java new file mode 100644 index 0000000..f09e2e3 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyDisplayHandler.java @@ -0,0 +1,114 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge; + +import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import java.util.HashSet; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class LobbyDisplayHandler { + public static final Logger LOGGER = LogManager.getLogger(LobbyDisplayHandler.class); + public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + + + private static HashSet lobbies = new HashSet<>(); + + public static HashSet getLobbies() { + return lobbies; + } + + /** + * searches lobbies for a lobby with a certain id + * @param id the int representing a Lobby id to be lookes for + * @return the LobbyModel with the id if found and null otherwise + */ + public LobbyModel searchForLobbyId(int id) { + for(LobbyModel lobby : lobbies) { + if (lobby.getId() == id) { + return lobby; + } + } + return null; + } + + public void updateLobbies(String data) { + try { + for (LobbyModel model : lobbies) { + model.setHasBeenVisited(false); + } + String[] lobbiesString = data.split("\\$"); + //System.out.println(lobbiesString.length); + for (String lobby : lobbiesString) { + String[] oneLobby = lobby.split(":"); + //System.out.println(oneLobby.length); + int id = Integer.parseInt(oneLobby[0]); + String admin = oneLobby[1]; + boolean isOpen = Boolean.parseBoolean(oneLobby[2]); + if (searchForLobbyId(id) == null) { //the lobby is new and has not been saved yet + addLobbyFromString(id, admin, isOpen, oneLobby); + } else { // the lobby exists but might need to be updated + updateExistingLobby(id, isOpen, oneLobby); + } + } + //System.out.println("lobby size before removal: " + lobbies.size()); + lobbies.removeIf( + lobby -> !lobby.isHasBeenVisited()); //removes all lobbies that aren't in this string + } catch (Exception e) { + e.printStackTrace(); + LOGGER.info("empty list"); + } + } + + private void addLobbyFromString(int id, String admin, boolean isOpen, String[] oneLobby) { + //System.out.println("add Lobby"); + LobbyModel newLobby = new LobbyModel(id, admin); + newLobby.setHasBeenVisited(true); + //System.out.println(newLobby); + newLobby.setLobbyIsOpen(isOpen); + for (int i = 3; i < oneLobby.length; i++) { + newLobby.addMember(oneLobby[i]); + //System.out.println(oneLobby[i]); + } + lobbies.add(newLobby); + //System.out.println("lobby size: " + lobbies.size()); + } + + private void updateExistingLobby(int id, boolean isOpen, String[] oneLobby) { + //System.out.println("update"); + LobbyModel oldLobby = searchForLobbyId(id); + oldLobby.setHasBeenVisited(true); + oldLobby.setLobbyIsOpen(isOpen); + oldLobby.removeAllMembers(); + for (int i = 3; i < oneLobby.length; i++) { + oldLobby.addMember(oneLobby[i]); + } + } + + public static void main(String[] args) { + LobbyDisplayHandler handler = new LobbyDisplayHandler(); + String lobby = "1:Seraina:true:Alex:Jonas$2:Sebi:false:Maria:Claudia:Hansli$3:Vanessa:true:Lara:Flu"; + handler.updateLobbies(lobby); + System.out.println("lobby size in main:" + lobbies.size()); + for (LobbyModel model : lobbies) { + //System.out.println(model); + System.out.println("Lobby " + model.getId() + " " + model.isLobbyIsOpen() + " (" + model.getAdmin() + "):"); + for (String member : model.getMembers()) { + System.out.println("- " + member); + } + } + + String lobby2 = "1:Seraina:true:Alex:Jonas$3:Vanessa:true:Lara:Flu:Sebastian"; + handler.updateLobbies(lobby2); + System.out.println("lobby size in main:" + lobbies.size()); + for (LobbyModel model : lobbies) { + //System.out.println(model); + System.out.println("Lobby " + model.getId() + " " + model.isLobbyIsOpen() + " (" + model.getAdmin() + "):"); + for (String member : model.getMembers()) { + System.out.println("- " + member); + } + } + + System.out.println("done"); + } + + +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyModel.java new file mode 100644 index 0000000..7567a29 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LobbyModel.java @@ -0,0 +1,60 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.lounge; + + +import java.util.HashSet; + +/** + * This is a simple model of a Lobby designed to save Lobby objects for display + */ +public class LobbyModel { + private final int id; + private final String admin; + private HashSet members = new HashSet(5); + private boolean lobbyIsOpen = true; + private boolean hasBeenVisited = false; + + public LobbyModel(int id, String admin) { + this.id = id; + this.admin = admin; + } + + public void addMember(String name) { + members.add(name); + } + + public void removeMember(String name) { + members.remove(name); + } + + public void removeAllMembers() { + members.clear(); + } + + public HashSet getMembers() { + return members; + } + + public int getId() { + return id; + } + + public String getAdmin() { + return admin; + } + + public void setHasBeenVisited(boolean hasBeenVisited) { + this.hasBeenVisited = hasBeenVisited; + } + + public boolean isHasBeenVisited() { + return hasBeenVisited; + } + + public void setLobbyIsOpen(boolean lobbyIsOpen) { + this.lobbyIsOpen = lobbyIsOpen; + } + + public boolean isLobbyIsOpen() { + return lobbyIsOpen; + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java index 5997130..ea29f14 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneViewController.java @@ -48,6 +48,8 @@ public class LoungeSceneViewController implements Initializable { public static final Logger LOGGER = LogManager.getLogger(LoungeSceneViewController.class); public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + @FXML + private AnchorPane listLobbyAnchorPane; @FXML private AnchorPane buttonPane; @FXML @@ -146,6 +148,7 @@ public class LoungeSceneViewController implements Initializable { LOGGER.debug("Lobby in initialize" + LobbyListView); addChatView(); addBackgroundDay(); + addListOfLobbiesView(); LOGGER.debug("cApp = " + cApp); LOGGER.debug("chatApp = " + chatApp); TrainAnimationDayController.setcApp(cApp); @@ -153,6 +156,7 @@ public class LoungeSceneViewController implements Initializable { bgAnimationView.setFitHeight(1950); bgAnimationView.setFitWidth(6667.968); + LobbyListView.setItems(lobbies); LOGGER.debug("In Initialize 2 LobbyListView" + LobbyListView); LobbyListView.setCellFactory(param -> { @@ -257,6 +261,22 @@ public class LoungeSceneViewController implements Initializable { LobbyListView.setVisible(true); } + /** + * Adds the new LobbyListView + */ + public void addListOfLobbiesView() { + Platform.runLater(new Runnable() { + @Override + public void run() { + try { + listLobbyAnchorPane.getChildren().add(chatApp.lobbyList); + } catch (Exception e) { + LOGGER.warn(e.getMessage()); + } + } + }); + } + /** * Adds the gameView to the existing LobbyView */ @@ -303,7 +323,6 @@ public class LoungeSceneViewController implements Initializable { public void run() { try { ChatArea.getChildren().add(chatApp.chat); - LOGGER.debug("¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ ChatArea: " + ChatArea); } catch (Exception e) { LOGGER.debug("Not yet initialized: chatAnchorPane"); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java index 36c3df2..0cf21b4 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/helpers/GuiParameters.java @@ -105,4 +105,9 @@ public class GuiParameters { * Tells the GUI at which position you are sitting {@code POSITION$integer} */ public static final String yourPosition = "POSITION"; + + /** + * Tells gui to Update its lobbies from a String {@code ULS$id:admin:meber1:member2:...$id:admin:member1...} + */ + public static final String updateLobbyString = "ULS"; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java index 860f2fe..fe0a731 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/ClientHandler.java @@ -415,6 +415,7 @@ public class ClientHandler implements Runnable { Thread t = new Thread(game); t.start(); l.addGameToRunningGames(game); + sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.viewChangeToGame + "$"); } else { sendAnnouncementToClient("Only the admin can start the game"); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java index e5c8416..0bbaa0a 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/JServerProtocolParser.java @@ -115,7 +115,6 @@ public class JServerProtocolParser { break; case Protocol.startANewGame: h.startNewGame(); - h.sendMsgToClientsInLobby(Protocol.printToGUI + "$" + GuiParameters.viewChangeToGame + "$"); break; case Protocol.listGames: h.listGames(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Lobby.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Lobby.java index 78bd9f3..d4b488a 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Lobby.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Lobby.java @@ -59,6 +59,7 @@ public class Lobby { * @param admin the Client who called CRTGM */ public Lobby(ClientHandler admin) { + this.admin = admin; this.lobbyClients.add(admin); lobbies.add(this); @@ -69,6 +70,7 @@ public class Lobby { this.lobbyID = helper; ClientHandler.broadcastAnnouncementToAll("New Lobby created by " + admin.getClientUserName() + ". This lobby's ID: " + this.lobbyID); + System.out.println(lobbiesToString()); } /** @@ -260,4 +262,20 @@ public class Lobby { */ } + public static String lobbiesToString() { + StringBuilder lobbyStringBuilder = new StringBuilder(); + for (Lobby lobby : lobbies) { + ClientHandler admin = lobby.getAdmin(); + lobbyStringBuilder.append(lobby.getLobbyID()).append(":").append(admin.getClientUserName()) + .append(":").append(lobby.getLobbyIsOpen()); + for (ClientHandler client : lobby.getLobbyClients()) { + if (!client.equals(admin)) { + lobbyStringBuilder.append(":").append(client.getClientUserName()); + } + } + lobbyStringBuilder.append("$"); + } + return lobbyStringBuilder.toString(); + } + } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/LobbyUpdater.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/LobbyUpdater.java new file mode 100644 index 0000000..8586eb6 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/LobbyUpdater.java @@ -0,0 +1,37 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.server; + +import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.GuiParameters; +import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; +import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ServerPinger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * This class creates a thread that constantly sends a String to the Clients containing the Lobbies + */ +public class LobbyUpdater implements Runnable{ + public static final Logger LOGGER = LogManager.getLogger(LobbyUpdater.class); + public static final BudaLogConfig l = new BudaLogConfig(LOGGER); + + @Override + public void run() { + while (true) { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + LOGGER.warn(e.getMessage()); + } + String lobbiesAsString = Lobby.lobbiesToString(); + for (ClientHandler client : ClientHandler.getConnectedClients()) { + if (!Lobby.lobbies.isEmpty()) { + client.sendMsgToClient( + Protocol.printToGUI + "$" + GuiParameters.updateLobbyString + "$" + lobbiesAsString); + } else{ + client.sendMsgToClient( + Protocol.printToGUI + "$" + GuiParameters.updateLobbyString + "$"); + } + } + } + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java index 7f53f72..565b136 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/server/Server.java @@ -32,6 +32,7 @@ public class Server { try { System.out.println("Port " + gamePort + " is open."); OgGhostHighScore.main(null); + new Thread(new LobbyUpdater()).start(); while (!serverSocket.isClosed()) { Socket socket = serverSocket.accept(); ClientHandler nextClient = new ClientHandler(socket, socket.getInetAddress()); diff --git a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/ListOfLobbiesScrollPane.fxml b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/ListOfLobbiesScrollPane.fxml new file mode 100644 index 0000000..f34c759 --- /dev/null +++ b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/ListOfLobbiesScrollPane.fxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml index 0c3e2a9..d7edc81 100644 --- a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml +++ b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/LoungeSceneView.fxml @@ -13,9 +13,6 @@ - - - @@ -53,6 +50,14 @@ + + + + + + + + diff --git a/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/listStyle.css b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/listStyle.css new file mode 100644 index 0000000..e5022ed --- /dev/null +++ b/src/main/resources/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/lounge/listStyle.css @@ -0,0 +1,18 @@ +*{ + -fx-background-color: midnightblue; +} + +.button{ + -fx-text-fill: black; + -fx-background-color: lightGrey; +} +.button:hover{ + -fx-effect: innershadow(gaussian, grey, 10, 0.2 , 2, 2); +} +.button:pressed{ + -fx-background-color: grey; +} + +.tree-cell .tree-disclosure-node .arrow { + -fx-background-color: white; +}