diff --git a/src/main/java/seng302/gameServer/GameState.java b/src/main/java/seng302/gameServer/GameState.java index 6e73de05..64197f1d 100644 --- a/src/main/java/seng302/gameServer/GameState.java +++ b/src/main/java/seng302/gameServer/GameState.java @@ -1,6 +1,7 @@ package seng302.gameServer; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -40,6 +41,7 @@ import seng302.utilities.XMLParser; */ public class GameState implements Runnable { + @FunctionalInterface interface NewMessageListener { void notify(Message message); @@ -675,6 +677,36 @@ public class GameState implements Runnable { } + public static void processChatter(ChatterMessage chatterMessage, boolean isHost) { + String chatterText = chatterMessage.getMessage(); + String[] words = chatterText.split("\\s+"); + if (words.length > 2 && isHost) { + switch (words[2].trim()) { + case ">speed": + try { + setSpeedMultiplier(Double.valueOf(words[3])); + broadcastChatter(new ChatterMessage( + chatterMessage.getMessage_type(), + "SERVER: Speed modifier set to x" + words[3] + )); + } catch (Exception e) { + Logger logger = LoggerFactory.getLogger(GameState.class); + logger.error("cannot parse >speed value"); + } + return; + case ">finish": + broadcastChatter(new ChatterMessage( + chatterMessage.getMessage_type(), + "SERVER: Game will now finish" + )); + endRace(); + return; + } + } + broadcastChatter(chatterMessage); + } + + public static void addMarkPassListener(NewMessageListener listener) { messageListeners.add(listener); } diff --git a/src/main/java/seng302/gameServer/ServerPacketParser.java b/src/main/java/seng302/gameServer/ServerPacketParser.java index f555d62f..cb8ac036 100644 --- a/src/main/java/seng302/gameServer/ServerPacketParser.java +++ b/src/main/java/seng302/gameServer/ServerPacketParser.java @@ -35,5 +35,12 @@ public class ServerPacketParser { payload[1], new String(Arrays.copyOfRange(payload, 3, payload.length)) ); } + + public static ChatterMessage extractChatterText(StreamPacket packet) { + byte[] payload = packet.getPayload(); + return new ChatterMessage( + payload[1], new String(Arrays.copyOfRange(payload, 3, payload.length)) + ); + } } diff --git a/src/main/java/seng302/gameServer/ServerToClientThread.java b/src/main/java/seng302/gameServer/ServerToClientThread.java index 2b447cf1..e1c5dc3a 100644 --- a/src/main/java/seng302/gameServer/ServerToClientThread.java +++ b/src/main/java/seng302/gameServer/ServerToClientThread.java @@ -211,10 +211,10 @@ public class ServerToClientThread implements Runnable, Observer { completeRegistration(requestedType); break; case CHATTER_TEXT: -// GameState.broadcastChatter( -// ServerPacketParser.extractChatterText(payload) -// ); - parseChatter(payload); + ChatterMessage chatterMessage = ServerPacketParser + .extractChatterText( + new StreamPacket(type, payloadLength, timeStamp, payload)); + GameState.processChatter(chatterMessage, isHost); break; case RACE_CUSTOMIZATION_REQUEST: Long sourceID = Message @@ -381,35 +381,36 @@ public class ServerToClientThread implements Runnable, Observer { isHost = true; } - private void parseChatter(byte[] chatterPayload) { - String chatterText = new String( - Arrays.copyOfRange(chatterPayload, 3, 3 + chatterPayload.length) - ); - String[] words = chatterText.split("\\s+"); - if (words.length > 2 && isHost) { - switch (words[2].trim()) { - case ">speed": - try { - GameState.setSpeedMultiplier(Double.valueOf(words[3])); - GameState.broadcastChatter(new ChatterMessage( - Byte.toUnsignedInt(chatterPayload[1]), - "SERVER: Speed modifier set to x" + words[3] - )); - } catch (Exception e) { - logger.error("cannot parse >speed value"); - } - return; - case ">finish": - GameState.broadcastChatter(new ChatterMessage( - chatterPayload[1], - "SERVER: Game will now finish" - )); - GameState.endRace(); - return; - } - } - GameState.broadcastChatter( - ServerPacketParser.extractChatterText(chatterPayload) - ); + private void checkChatterForCommands(ChatterMessage chatterMessage) { + +// String chatterText = new String( +// Arrays.copyOfRange(chatterPayload, 3, 3 + chatterPayload.length) +// ); +// String[] words = chatterText.split("\\s+"); +// if (words.length > 2 && isHost) { +// switch (words[2].trim()) { +// case ">speed": +// try { +// GameState.setSpeedMultiplier(Double.valueOf(words[3])); +// GameState.broadcastChatter(new ChatterMessage( +// Byte.toUnsignedInt(chatterPayload[1]), +// "SERVER: Speed modifier set to x" + words[3] +// )); +// } catch (Exception e) { +// logger.error("cannot parse >speed value"); +// } +// return; +// case ">finish": +// GameState.broadcastChatter(new ChatterMessage( +// chatterPayload[1], +// "SERVER: Game will now finish" +// )); +// GameState.endRace(); +// return; +// } +// } +// GameState.broadcastChatter( +// ServerPacketParser.extractChatterText(chatterPayload) +// ); } } diff --git a/src/main/java/seng302/gameServer/messages/ChatterMessage.java b/src/main/java/seng302/gameServer/messages/ChatterMessage.java index 42f17093..266fca62 100644 --- a/src/main/java/seng302/gameServer/messages/ChatterMessage.java +++ b/src/main/java/seng302/gameServer/messages/ChatterMessage.java @@ -36,5 +36,11 @@ public class ChatterMessage extends Message { return MESSAGE_SIZE + message_size; } + public String getMessage() { + return message; + } + public int getMessage_type() { + return message_type; + } } diff --git a/src/test/java/seng302/gameServer/server/ChatCommandsTest.java b/src/test/java/seng302/gameServer/server/ChatCommandsTest.java index 16e51f2c..07f6baf2 100644 --- a/src/test/java/seng302/gameServer/server/ChatCommandsTest.java +++ b/src/test/java/seng302/gameServer/server/ChatCommandsTest.java @@ -16,8 +16,6 @@ import seng302.visualiser.ClientToServerThread; */ public class ChatCommandsTest { -// @Rule -// public Timeout globalTimeout = new Timeout(3, TimeUnit.SECONDS); private boolean dcSent = false; private ClientToServerThread client; @@ -44,8 +42,6 @@ public class ChatCommandsTest { RaceStatusData rsd = StreamParser.extractRaceStatus(packet); if (rsd.getBoatData().get(0)[4] == BoatStatus.FINISHED.getCode()) { mst.terminate(); - System.out.println("AY WE DID IT"); -// host.setSocketToClose(); Assert.assertTrue(dcSent); } break; @@ -108,9 +104,7 @@ public class ChatCommandsTest { ie.printStackTrace(); } Assert.assertEquals(5.0, GameState.getSpeedMultiplier(), 0.00001); - System.out.println("the thing " + GameState.getSpeedMultiplier()); mst.terminate(); -// host.setSocketToClose(); try { Thread.sleep(2000); } catch (InterruptedException ie) { @@ -149,9 +143,7 @@ public class ChatCommandsTest { ie.printStackTrace(); } mst.terminate(); -// host.setSocketToClose(); Assert.assertEquals(1.0, GameState.getSpeedMultiplier(), 0.00001); - System.out.println("value " + GameState.getSpeedMultiplier()); try { Thread.sleep(2000); } catch (InterruptedException ie) { @@ -175,7 +167,6 @@ public class ChatCommandsTest { ie.printStackTrace(); } client = new ClientToServerThread("localhost", 4942); - System.out.println("done client and host assigning"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -239,9 +230,6 @@ public class ChatCommandsTest { RaceStatusData rsd = StreamParser.extractRaceStatus(packet); if (rsd.getBoatData().get(0)[4] == BoatStatus.FINISHED.getCode()) { mst.terminate(); - System.out.println("TEST COMPLETE"); -// client.setSocketToClose(); -// host.setSocketToClose(); Assert.assertTrue(dcSent); } break; @@ -253,30 +241,7 @@ public class ChatCommandsTest { } catch (IOException ioe) { ioe.printStackTrace(); } -// try { -// Thread.sleep(100); -// } catch (InterruptedException ie) { -// ie.printStackTrace(); -// } -// mst.startGame(); -// try { -// Thread.sleep(100); -// } catch (InterruptedException ie) { -// ie.printStackTrace(); -// } host.sendChatterMessage("[time_prefix] >finish"); dcSent = true; -// try { -// Thread.sleep(200); -// } catch (InterruptedException ie) { -// ie.printStackTrace(); -// } -//// host.setSocketToClose(); -// mst.terminate(); - try { - Thread.sleep(2000); - } catch (InterruptedException ie) { - ie.printStackTrace(); - } } } diff --git a/src/test/java/steps/SendChatSteps.java b/src/test/java/steps/SendChatSteps.java index 93600ce3..3c10260d 100644 --- a/src/test/java/steps/SendChatSteps.java +++ b/src/test/java/steps/SendChatSteps.java @@ -21,7 +21,6 @@ public class SendChatSteps { private MainServerThread mst; - //TODO Need to mock the controller pane in order to run the full game client @Given("^There are two games running$") public void the_are_two_games_running() throws Throwable { mst = new MainServerThread();