package fr.lyrgard.hexscape.server.network; import java.io.IOException; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.eclipse.jetty.websocket.server.WebSocketHandler; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import fr.lyrgard.hexScape.bus.CoreMessageBus; import fr.lyrgard.hexScape.message.AbstractMessage; import fr.lyrgard.hexScape.message.AbstractUserMessage; import fr.lyrgard.hexScape.message.DisconnectedFromServerMessage; import fr.lyrgard.hexScape.message.HeartBeatMessage; import fr.lyrgard.hexScape.message.UserIdAllocatedMessage; import fr.lyrgard.hexScape.message.UserInformationMessage; import fr.lyrgard.hexScape.message.json.MessageJsonMapper; import fr.lyrgard.hexScape.model.IdGenerator; import fr.lyrgard.hexScape.model.Universe; import fr.lyrgard.hexScape.model.player.ColorEnum; import fr.lyrgard.hexScape.model.player.User; @WebSocket public class ServerWebSocket extends WebSocketHandler { private String userId; private Session session; @OnWebSocketClose public void onClose(int statusCode, String reason) { System.out.println("Close: statusCode=" + statusCode + ", reason=" + reason); ServerNetwork.getInstance().unRegisterSocket(userId); // Make the user to leave room DisconnectedFromServerMessage message = new DisconnectedFromServerMessage(userId); message.setSessionUserId(userId); CoreMessageBus.post(message); } @OnWebSocketError public void onError(Throwable t) { System.out.println("Error: " + t.getMessage()); } @OnWebSocketConnect public void onConnect(Session session) { this.session = session; userId = IdGenerator.getInstance().getNewUserId(); } @OnWebSocketMessage public void onMessage(String msg) { try { AbstractMessage message = MessageJsonMapper.getInstance().fromJson(msg); if (message instanceof HeartBeatMessage) { //System.out.println("Heart beat from player " + playerId); } else if (message instanceof UserInformationMessage) { String name = ((UserInformationMessage) message).getName(); ColorEnum color = ((UserInformationMessage) message).getColor(); User user = new User(); user.setName(name); user.setColor(color); user.setId(userId); Universe.getInstance().getUsersByIds().put(userId, user); System.out.println("User connected : " + userId + ", " + user.getName() + ", " + user.getColor() ); send(new UserIdAllocatedMessage(userId)); ServerNetwork.getInstance().registerSocket(userId, this); } else { //System.out.println("Received message " + message.getClass() + " from player " + playerId); message.setSessionUserId(userId); CoreMessageBus.post(message); } } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void configure(WebSocketServletFactory factory) { factory.getPolicy().setMaxTextMessageSize(1000000); factory.register(ServerWebSocket.class); } public void send(AbstractMessage message) { try { session.getRemote().sendString(MessageJsonMapper.getInstance().toJson(message)); } catch (IOException e) { e.printStackTrace(); } } }