home / connvers / src / main / java / avividi / connvers / UserInputHandler.java

UserInputHandler.java



package avividi.connvers;

import avividi.connvers.protocol.Message;
import avividi.connvers.protocol.MessageTopic;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.time.Instant;

import static avividi.connvers.Connvers.MAX_MESSAGE_LENGTH;
import static avividi.connvers.Connvers.printSystemLine;

public class UserInputHandler implements Runnable {
  
  private final String user;
  private final boolean exitOnError;
  private final Broadcaster broadcaster;
  private final CommandInterpreter commandInterpreter;


  public UserInputHandler(String user, boolean exitOnError, Broadcaster broadcaster, CommandInterpreter commandInterpreter) {
    this.user = user;
    this.exitOnError = exitOnError;
    this.broadcaster = broadcaster;
    this.commandInterpreter = commandInterpreter;
  }

  @Override
  public void run() {

    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {

      System.out.print(">");
      String content;
      while ((content = reader.readLine()) != null) {

        if (content.isEmpty()) {
          continue;
        }
        if (commandInterpreter.isCommand(content)) {
          commandInterpreter.executeCommand(content);
          continue;
        }
        System.out.print("\033[1A\033[K"); // clear input line

        if (content.length() > MAX_MESSAGE_LENGTH) {
          printSystemLine(String.format("(Message too long, clipped down to %s chars)", MAX_MESSAGE_LENGTH));
          content = content.substring(0, MAX_MESSAGE_LENGTH);
        }

        broadcaster.broadcast(new Message(user, Instant.now(), MessageTopic.say, content));
        System.out.print(">");
      }
    }
    catch (Exception e) {
      e.printStackTrace();
      if (exitOnError) {
        System.out.println("Shutdown");
        System.exit(1);
      }
    }
  }
}