mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Implemented server re-registration when a server closes / updates
- When a server is closed, it will disappear from the server list - When a player joins a server, the number of spaces left will decrease - Servers now disappear instead of duplicating - Added tests for ServerDescription - Added documentation for new classes Tags: #story[1247]
This commit is contained in:
@@ -8,12 +8,13 @@ import javax.jmdns.ServiceEvent;
|
||||
import javax.jmdns.ServiceListener;
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Listens for servers on the local network
|
||||
*/
|
||||
public class ServerListener{
|
||||
private static ServerListener instance;
|
||||
private ServerListenerDelegate delegate;
|
||||
@@ -21,35 +22,51 @@ public class ServerListener{
|
||||
GameServeMonitor listener;
|
||||
|
||||
private class GameServeMonitor implements ServiceListener {
|
||||
private List<ServerDescription> servers;
|
||||
private Set<ServerDescription> servers;
|
||||
|
||||
GameServeMonitor(){
|
||||
servers = new ArrayList<>();
|
||||
servers = new HashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* A Service has been detected but not resolved
|
||||
* @param event The ServiceEvent
|
||||
*/
|
||||
@Override
|
||||
public void serviceAdded(ServiceEvent event) {
|
||||
}
|
||||
|
||||
/**
|
||||
* A Service has been removed / unregistered
|
||||
* @param event The ServiceEvent
|
||||
*/
|
||||
@Override
|
||||
public void serviceRemoved(ServiceEvent event) {
|
||||
Integer serverId = -1;
|
||||
String serverName = event.getInfo().getName();
|
||||
|
||||
for (int i = 0; i < servers.size(); i++){
|
||||
ServerDescription server = servers.get(i);
|
||||
if (server.getName().equals(event.getInfo().getName())){
|
||||
serverId = i;
|
||||
break;
|
||||
ServerDescription toRemove = null;
|
||||
|
||||
for (ServerDescription server : servers){
|
||||
if (server.getName().equals(serverName)){
|
||||
toRemove = server;
|
||||
}
|
||||
}
|
||||
|
||||
if (serverId > 0){
|
||||
servers.remove(serverId);
|
||||
if (toRemove != null){
|
||||
servers.remove(toRemove);
|
||||
}
|
||||
|
||||
delegate.serverRemoved(servers);
|
||||
delegate.serverRemoved(new ArrayList<ServerDescription>(servers));
|
||||
|
||||
// Get all other servers with the same name to respond if they are up
|
||||
jmdns.requestServiceInfo(ServerAdvertiser.SERVICE_TYPE, serverName);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A Service has been added and resolved
|
||||
* @param event The ServiceEvent
|
||||
*/
|
||||
@Override
|
||||
public void serviceResolved(ServiceEvent event) {
|
||||
String address = event.getInfo().getServer();
|
||||
@@ -60,9 +77,11 @@ public class ServerListener{
|
||||
Integer spacesLeft = Integer.parseInt(event.getInfo().getPropertyString("spacesLeft"));
|
||||
|
||||
ServerDescription serverDescription = new ServerDescription(serverName, mapName, spacesLeft, address, portNum);
|
||||
|
||||
servers.remove(serverDescription);
|
||||
servers.add(serverDescription);
|
||||
|
||||
delegate.serverDetected(serverDescription, Collections.unmodifiableList(servers));
|
||||
delegate.serverDetected(serverDescription, new ArrayList<ServerDescription>(servers));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,6 +99,10 @@ public class ServerListener{
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the delegate to handle events
|
||||
* @param delegate .
|
||||
*/
|
||||
public void setDelegate(ServerListenerDelegate delegate){
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
package seng302.visualiser.controllers;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.URL;
|
||||
import java.util.*;
|
||||
|
||||
import com.sun.security.ntlm.Server;
|
||||
import cucumber.api.java.en.But;
|
||||
import javafx.application.Platform;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.scene.control.Alert;
|
||||
@@ -17,12 +9,20 @@ import javafx.scene.control.ListView;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import seng302.gameServer.GameState;
|
||||
import seng302.gameServer.ServerDescription;
|
||||
import seng302.visualiser.GameClient;
|
||||
import seng302.visualiser.ServerListener;
|
||||
import seng302.visualiser.ServerListenerDelegate;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
/**
|
||||
* A Class describing the actions of the start screen controller
|
||||
* Created by wmu16 on 10/07/17.
|
||||
@@ -192,6 +192,10 @@ public class StartScreenController implements Initializable, ServerListenerDeleg
|
||||
return ipAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the server list with new information
|
||||
* @param servers The current list of servers
|
||||
*/
|
||||
private void refreshServerList(List<ServerDescription> servers){
|
||||
this.serverList.getItems().clear();
|
||||
|
||||
@@ -204,20 +208,20 @@ public class StartScreenController implements Initializable, ServerListenerDeleg
|
||||
public void serverRemoved(List<ServerDescription> currentServers) {
|
||||
this.servers = currentServers;
|
||||
|
||||
refreshServerList(currentServers);
|
||||
Platform.runLater(() -> refreshServerList(currentServers));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serverDetected(ServerDescription serverDescription, List<ServerDescription> servers) {
|
||||
this.servers = servers;
|
||||
|
||||
refreshServerList(servers);
|
||||
Platform.runLater(() -> refreshServerList(servers));
|
||||
}
|
||||
|
||||
private void joinLobbyClicked() {
|
||||
Integer selectedServer = serverList.getSelectionModel().getSelectedIndex();
|
||||
|
||||
if (this.servers == null || selectedServer >= this.servers.size()){
|
||||
if (this.servers == null || selectedServer >= this.servers.size() || selectedServer < 0){
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR, "Invalid server selected");
|
||||
alert.showAndWait();
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user