diff --git a/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java b/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java index e8dd3f7..ab0bb2b 100644 --- a/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java +++ b/src/main/java/inf112/fiasko/roborally/networking/RoboRallyServerListener.java @@ -5,12 +5,17 @@ import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Listener; import inf112.fiasko.roborally.elementproperties.RobotID; import inf112.fiasko.roborally.networking.containers.ErrorResponse; +import inf112.fiasko.roborally.networking.containers.PowerdownContainer; +import inf112.fiasko.roborally.networking.containers.ProgamsContainer; +import inf112.fiasko.roborally.networking.containers.ProgramAndPowerdownRequest; +import inf112.fiasko.roborally.objects.ProgrammingCard; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * This listener handles all sending and responses for the server @@ -20,15 +25,19 @@ class RoboRallyServerListener extends Listener { private final Map clients; private final Map playerNames; private final List deadPlayers; + private Map StayInPowerdown = new HashMap<>(); + private Map programs = new HashMap<>(); + private RoboRallyServer server; /** * Instantiates a new Robo Rally server listener */ - RoboRallyServerListener() { + RoboRallyServerListener(RoboRallyServer server) { super(); clients = new HashMap<>(); playerNames = new HashMap<>(); deadPlayers = new ArrayList<>(); + this.server = server; } /** @@ -64,16 +73,64 @@ class RoboRallyServerListener extends Listener { @Override public void received (Connection connection, Object object) { if (object instanceof String) { - String playerName = (String) object; - if (playerNames.containsValue(playerName)) { - String errorMessage = "The player name send is already taken."; - connection.sendTCP(new ErrorResponse(errorMessage, new IllegalArgumentException(errorMessage))); - } else { - playerNames.put(connection, playerName); + System.out.println((String) object); + recivedString(connection,(String) object); + } + else if(object instanceof Boolean){ + recivedContinuePowerdown(connection,(Boolean) object); + } + else if(object instanceof ProgramAndPowerdownRequest){ + reciveProgamAndPowerdownRequest(connection,(ProgramAndPowerdownRequest) object); + } + + } + + private void recivedString(Connection connection,String name){ + String playerName = name; + if (playerNames.containsValue(playerName)) { + String errorMessage = "The player name send is already taken."; + connection.sendTCP(new ErrorResponse(errorMessage, new IllegalArgumentException(errorMessage))); + } else { + playerNames.put(connection, playerName); + } + + } + + private void recivedContinuePowerdown(Connection connection,Boolean bool){ + StayInPowerdown.put(connection,bool); + if(recivedDataFromAllConnections(StayInPowerdown)){ + Map powerdowns = new HashMap<>(); + for (Connection connected:StayInPowerdown.keySet()) { + powerdowns.put(playerNames.get(connected),StayInPowerdown.get(connected)); } + server.sendToAllClients(new PowerdownContainer(powerdowns)); + StayInPowerdown = new HashMap<>(); } } + private void reciveProgamAndPowerdownRequest(Connection connection,ProgramAndPowerdownRequest request){ + programs.put(connection,request); + if(recivedDataFromAllConnections(programs)){ + Map powerdown = new HashMap<>(); + Map> program = new HashMap<>(); + + for (Connection connected:programs.keySet()) { + powerdown.put(playerNames.get(connected),programs.get(connected).getPowerdown()); + program.put(playerNames.get(connected),programs.get(connected).getProgram()); + + } + server.sendToAllClients(new ProgamsContainer(program,powerdown)); + programs = new HashMap<>(); + + } + } + private boolean recivedDataFromAllConnections(Map data){ + Set connections = clients.keySet(); + connections.removeAll(deadPlayers); + return connections.containsAll(data.keySet()) && data.keySet().containsAll(connections); + } + + @Override public void connected(Connection connection) { //The first client to connect is assumed to be the host