package gameengine; import gameengine.operations.MovePiece; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.codehaus.jackson.map.ObjectMapper; import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; import statemachine.Operation; import java.io.IOException; import java.net.InetSocketAddress; import java.util.Collection; /** * Created by sctu on 12/7/14. */ public class WebsocketChineseCheckersPlayer extends WebSocketServer implements GameEngineListener<ChineseCheckersState> { private static Logger LOG = LogManager.getLogger(WebsocketChineseCheckersPlayer.class); private ObjectMapper mapper = new ObjectMapper(); private GameEngine<ChineseCheckersState> gameEngine; private int playerID; public WebsocketChineseCheckersPlayer(InetSocketAddress address, GameEngine<ChineseCheckersState> gameEngine, int replicaID) { super(address); this.gameEngine = gameEngine; this.playerID = replicaID; this.gameEngine.addListener(this); // so we can be notified when moves are successfully applied LOG.info("Ready for client connection at " + address); } @Override public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) { LOG.info("Player " + playerID + " connected."); } @Override public void onClose(WebSocket webSocket, int i, String s, boolean b) { } /* We expect to get the moves as * MOVE,2,3,4,5 */ @Override public void onMessage(WebSocket webSocket, String s) { LOG.info("Got a message from frontend: " + s); String[] strParts = s.split(","); if (strParts.length == 5 && strParts[0].equals("MOVE")) { int startPointq, startPointr, endPointq, endPointr; try { startPointq = Integer.parseInt(strParts[1]); startPointr = Integer.parseInt(strParts[2]); endPointq = Integer.parseInt(strParts[3]); endPointr = Integer.parseInt(strParts[4]); gameEngine.requestCommit(new MovePiece( playerID, new HexPoint(startPointq, startPointr), new HexPoint(endPointq, endPointr))); } catch (NumberFormatException e) { LOG.error("Unrecognized MOVE coordinates: " + s); } } else { LOG.error("Unrecognized move: " + s); } } @Override public void onError(WebSocket webSocket, Exception e) { LOG.error(e); } /* Taken from the websocket example code */ public void sendToAll(String text) { Collection<WebSocket> con = connections(); synchronized (con) { for(WebSocket c : con) { c.send(text); } } } @Override public void notifyOnSuccessfulApply(Operation<ChineseCheckersState> operation) { // TODO: Make sure all Operations have a reasonable toString try { this.sendToAll(mapper.writeValueAsString(operation)); } catch (IOException e) { e.printStackTrace(); } } }