168 lines
4.2 KiB
Java
168 lines
4.2 KiB
Java
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 <roomName>");
|
|
System.out.println("\t/listRooms");
|
|
System.out.println("\t/joinRoom <roomName>");
|
|
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<String> 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();
|
|
}
|
|
|
|
}
|