package client; import java.io.IOException; import java.net.InetSocketAddress; import network.PacketHandler; import network.Socket; import network.protocol.Packet; import network.protocol.PacketVisitor; import network.protocol.packets.*; import network.protocol.packets.ServerResponsePacket.Response; public class ClientConnexion implements PacketVisitor, PacketHandler { private final InetSocketAddress serverAddress; private final Socket socket; private final ClientListener callback; public ClientConnexion(Socket socket, InetSocketAddress serverAddress, ClientListener callback) { this.serverAddress = serverAddress; this.socket = socket; this.callback = callback; this.socket.onClose.connect(this::onSocketClose); this.socket.addHandler(this); } private void onSocketClose() { this.callback.handleConnexionError(); } public void close() { this.socket.close(); } public void sendPacket(Packet packet) { try { this.socket.sendPacket(packet, serverAddress); } catch (IOException e) { this.close(); this.callback.handleConnexionError(); e.printStackTrace(); } } @Override public void handlePacket(Packet packet, InetSocketAddress address) { // we assume that the packet comes from the server visit(packet); } @Override public void visitPacket(ChatMessagePacket packet) { this.callback.handleChatMessage(packet.getTime(), packet.getChatter(), packet.getContent()); } @Override public void visitPacket(RoomListPacket packet) { this.callback.handleRoomList(packet.getRoomNames()); } @Override public void visitPacket(ServerResponsePacket packet) { this.callback.handleServerResponse(packet.getResponse()); if (packet.getResponse() == Response.AuthSuccess) this.callback.handleConnect(); } @Override public void visitPacket(RequestActualRoomPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } @Override public void visitPacket(ActualRoomPacket packet) { this.callback.handleActualRoom(packet.getRoomName()); } @Override public void visitPacket(DisconnectPacket packet) { this.close(); this.callback.handleDisconnect(); } @Override public void visitPacket(CreateRoomPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } @Override public void visitPacket(JoinRoomPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } @Override public void visitPacket(LeaveRoomPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } @Override public void visitPacket(LoginPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } @Override public void visitPacket(RequestRoomListPacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } @Override public void visitPacket(SendChatMessagePacket packet) { throw new UnsupportedOperationException("Unimplemented method 'visitPacket'"); } }