better command interface

This commit is contained in:
2025-03-03 21:29:54 +01:00
parent c83e39ea4b
commit 8f30f139cd

View File

@@ -4,7 +4,9 @@ import java.net.InetSocketAddress;
import java.net.SocketException; import java.net.SocketException;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Scanner; import java.util.Scanner;
import java.util.function.Consumer;
import network.protocol.ANSIColor; import network.protocol.ANSIColor;
import network.protocol.packets.ServerResponsePacket; import network.protocol.packets.ServerResponsePacket;
@@ -65,50 +67,72 @@ public class ClientConsole implements ClientListener {
this.inputThread.join(); this.inputThread.join();
} }
private void visitMessage(String message) { private void printHelp(Map<List<String>, Consumer<String>> commands) {
try { System.out.println("Available commands:");
if (message.startsWith("/")) { for (var entry : commands.entrySet()) {
if (message.startsWith("/createRoom ")) { List<String> commandNames = entry.getKey();
String roomName = message.substring(12).trim(); System.out.println("\t" + commandNames.get(0) + (commandNames.size() == 2 ? " or " + commandNames.get(1) : ""));
this.client.SendCreateRoom(roomName);
} else if (message.startsWith("/create ")) {
String roomName = message.substring(8).trim();
this.client.SendCreateRoom(roomName);
} else if (message.equals("/listRooms") || message.equals("/list")) {
this.client.RequestRoomList();
} else if (message.startsWith("/joinRoom ")) {
String roomName = message.substring(10).trim();
this.client.SendJoinRoom(roomName);
} else if (message.startsWith("/join ")) {
String roomName = message.substring(6).trim();
this.client.SendJoinRoom(roomName);
} else if (message.equals("/leaveRoom") || message.equals("/leave")) {
this.client.SendLeaveRoom();
} else if (message.equals("/room")) {
this.client.RequestActualRoom();
}
else if (message.equals("/bye")) {
this.client.close();
} else if (message.equals("/help")) {
System.out.println("Available commands:");
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/room");
System.out.println("\t/bye");
System.out.println("\t/help");
} else {
System.out.println(ANSIColor.formatString("&rUnknown command&n"));
}
} else {
this.client.SendChatMessage(message);
}
System.out.print("\033[1A\r\033[2K"); // weird sequence to clear the line (but it works !)
System.out.flush();
} catch (Exception e) {
e.printStackTrace();
} }
// the clearLine eats the last line if a new line is not skipped
System.out.println("\n");
}
private void visitMessage(String message) {
if (!message.startsWith("/")) {
this.client.SendChatMessage(message);
clearLine();
return;
}
final Map<List<String>, Consumer<String>> commands = Map.of(
List.of("/createRoom <roomName>", "/create <roomName>"), (args) -> this.client.SendCreateRoom(args),
List.of("/listRooms", "/list"), (args) -> this.client.RequestRoomList(),
List.of("/joinRoom <roomName>", "/join <roomName>"), (args) -> this.client.SendJoinRoom(args),
List.of("/leaveRoom", "/leave"), (args) -> this.client.SendLeaveRoom(),
List.of("/actualRoom", "/room"), (args) -> this.client.RequestActualRoom(),
List.of("/goodbye", "/bye"), (args) -> this.client.close(),
List.of("/help"), (args) -> {});
boolean commandFound = false;
for (var entry : commands.entrySet()) {
List<String> commandNames = entry.getKey();
Consumer<String> runnable = entry.getValue();
for (String cmd : commandNames) {
String[] cmdParts = cmd.split(" ");
if (cmdParts.length > 1) {
// the command expects arguments
if (message.startsWith(cmdParts[0] + " ")) {
runnable.accept(message.substring(cmdParts[0].length() + 1).trim());
commandFound = true;
}
} else {
// the command does not expect arguments
if (message.equals(cmd)) {
runnable.accept(message.substring(cmd.length()).trim());
commandFound = true;
}
}
}
if (commandFound)
break;
}
if (commandFound) {
if (message.equals("/help"))
printHelp(commands);
clearLine();
return;
}
System.out.println(ANSIColor.formatString("&rUnknown command&n"));
printHelp(commands);
clearLine();
}
private void clearLine() {
System.out.print("\033[1A\r\033[2K"); // weird sequence to clear the line (but it works !)
System.out.flush();
} }
private void stop() { private void stop() {