tdlib-session-container/src/main/java/it/tdlight/reactiveapi/Cli.java

105 lines
3.1 KiB
Java

package it.tdlight.reactiveapi;
import io.atomix.core.Atomix;
import io.atomix.core.AtomixBuilder;
import it.tdlight.reactiveapi.CreateSessionRequest.CreateBotSessionRequest;
import it.tdlight.reactiveapi.CreateSessionRequest.CreateUserSessionRequest;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import net.minecrell.terminalconsole.SimpleTerminalConsole;
import org.jline.reader.LineReader;
import org.jline.reader.LineReaderBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Cli {
private static final Logger LOG = LoggerFactory.getLogger(Cli.class);
public static void main(String[] args) throws IOException {
var validArgs = Entrypoint.parseArguments(args);
var atomixBuilder = Atomix.builder();
var api = Entrypoint.start(validArgs, atomixBuilder);
AtomicBoolean alreadyShutDown = new AtomicBoolean(false);
AtomicBoolean acceptInputs = new AtomicBoolean(true);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
acceptInputs.set(false);
if (alreadyShutDown.compareAndSet(false, true)) {
api.getAtomix().stop().join();
}
}));
var console = new SimpleTerminalConsole() {
private static final Set<String> commands = Set.of("exit", "stop", "createsession", "help", "man", "?");
@Override
protected LineReader buildReader(LineReaderBuilder builder) {
var reader = super.buildReader(builder);
reader.addCommandsInBuffer(commands);
return reader;
}
@Override
protected boolean isRunning() {
return acceptInputs.get();
}
@Override
protected void runCommand(String command) {
var parts = command.split(" ", 2);
var commandName = parts[0].trim().toLowerCase();
String commandArgs;
if (parts.length > 1) {
commandArgs = parts[1].trim();
} else {
commandArgs = "";
}
switch (commandName) {
case "exit", "stop" -> acceptInputs.set(false);
case "createsession" -> createSession(api, commandArgs);
case "help", "?", "man" -> LOG.info("Commands: {}", commands);
default -> LOG.info("Unknown command \"{}\"", command);
}
}
@Override
protected void shutdown() {
acceptInputs.set(false);
if (alreadyShutDown.compareAndSet(false, true)) {
api.getAtomix().stop().join();
}
}
};
console.start();
}
private static void createSession(ReactiveApi api, String commandArgs) {
var parts = commandArgs.split(" ");
boolean invalid = false;
if (parts.length == 3) {
CreateSessionRequest request = switch (parts[0]) {
case "bot" -> new CreateBotSessionRequest(Long.parseLong(parts[1]), parts[2]);
case "user" -> new CreateUserSessionRequest(Long.parseLong(parts[1]),
Long.parseLong(parts[2]));
default -> {
invalid = true;
yield null;
}
};
if (!invalid) {
CreateSessionResponse response = api.createSession(request).join();
LOG.info("Created a session with session id \"{}\"", response.sessionId());
}
} else {
invalid = true;
}
if (invalid) {
LOG.error("Syntax: CreateSession <\"bot\"|\"user\"> <userid> <token|phoneNumber>");
}
}
}