package client; import java.net.InetSocketAddress; import java.net.SocketException; import java.time.Instant; import java.util.List; import java.util.Scanner; import network.protocol.ANSIColor; import network.protocol.packets.ServerResponsePacket; import network.protocol.packets.ServerResponsePacket.Response; public class ClientConsole implements ClientListener { private Client client; private final Thread inputThread; private final Scanner scanner; private volatile boolean connected = false; public static void main(String[] args) { ClientConsole console = new ClientConsole(new InetSocketAddress("localhost", 6665)); try { console.joinThread(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("End !"); } public ClientConsole(InetSocketAddress address) { this.inputThread = new Thread(this::inputLoop); this.scanner = new Scanner(System.in); String pseudo = inputPseudo(); try { this.client = new Client(address, this, pseudo); this.inputThread.start(); } catch (SocketException e) { e.printStackTrace(); } } private String inputPseudo() { System.out.println("Enter your pseudo:"); String pseudo = "chatter"; pseudo = this.scanner.nextLine(); return pseudo; } public Client getClientInterface() { return this.client; } private void inputLoop() { //waiting to be connected try { Thread.sleep(2000); return; } catch (InterruptedException e) { if (!connected) return; } // resets the interrupt Thread.interrupted(); while (!Thread.interrupted()) { String message = this.scanner.nextLine(); if (Thread.interrupted()) break; visitMessage(message); } } public void joinThread() throws InterruptedException { this.inputThread.join(); } private void visitMessage(String message) { try { if (message.startsWith("/")) { if (message.startsWith("/createRoom")) { String roomName = message.substring(12).trim(); this.client.SendCreateRoom(roomName); } else if (message.startsWith("/listRooms")) { this.client.RequestRoomList(); } else if (message.startsWith("/joinRoom")) { String roomName = message.substring(10).trim(); this.client.SendJoinRoom(roomName); } else if (message.startsWith("/leaveRoom")) { this.client.SendLeaveRoom(); } else if (message.startsWith("/bye")) { this.client.close(); } else if (message.startsWith("/help")) { System.out.println("Available commands:"); System.out.println("\t/bye"); System.out.println("\t/createRoom "); System.out.println("\t/listRooms"); System.out.println("\t/joinRoom "); System.out.println("\t/leaveRoom"); System.out.println("\t/help"); } else { System.out.println("Unknown command"); } } else { this.client.SendChatMessage(message); } } catch (Exception e) { e.printStackTrace(); } } private void stop() { this.inputThread.interrupt(); } @Override public void handleDisconnect() { System.out.println("Disconnected !"); stop(); } @Override public void handleConnexionError() { System.out.println("An error occured during the connexion !"); this.connected = false; stop(); } @Override public void handleChatMessage(Instant time, String chatter, String content) { StringBuilder sb = new StringBuilder(); String strTime = time.toString(); sb.append("&y[") .append(strTime, 11, 19) // We only take the HH:MM:SS part .append("]&n") .append(" ") .append(chatter) .append(" : ") .append(content).append("&n"); // make the color back to normal at the end of every message System.out.println(ANSIColor.formatString(sb.toString())); } @Override public void handleRoomList(List roomNames) { System.out.println("Rooms :"); for (String room : roomNames) { System.out.println("\t" + room); } } @Override public void handleServerResponse(Response response) { if (response == ServerResponsePacket.Response.MessageSent || response == ServerResponsePacket.Response.MessageNotSent) { return; } System.out.println(response); } @Override public void handleConnect() { System.out.println("Connected to server !"); this.connected = true; this.inputThread.interrupt(); } }