Newer
Older
KeeperJerry_Launcher / LaunchServer / source / command / handler / JLineCommandHandler.java
package launchserver.command.handler;

import jline.console.ConsoleReader;
import jline.console.completer.Completer;
import launcher.helper.LogHelper;
import launcher.helper.LogHelper.Output;
import launchserver.LaunchServer;

import java.io.IOException;
import java.util.List;
import java.util.Optional;

public final class JLineCommandHandler extends CommandHandler
{
    private final ConsoleReader reader;

    public JLineCommandHandler(LaunchServer server) throws IOException
    {
        super(server);

        // Set reader
        reader = new ConsoleReader();
        reader.setExpandEvents(false);
        reader.addCompleter(new JLineConsoleCompleter());

        // Replace writer
        LogHelper.removeStdOutput();
        LogHelper.addOutput(new JLineOutput());
    }

    @Override
    public void bell() throws IOException
    {
        reader.beep();
    }

    @Override
    public void clear() throws IOException
    {
        reader.clearScreen();
    }

    @Override
    public String readLine() throws IOException
    {
        return reader.readLine();
    }

    private final class JLineOutput implements Output
    {
        @Override
        public void println(String message)
        {
            try
            {
                reader.println(ConsoleReader.RESET_LINE + message);
                reader.drawLine();
                reader.flush();
            }
            catch (IOException ignored)
            {
                // Ignored
            }
        }
    }

    public class JLineConsoleCompleter implements Completer
    {
        @Override
        public int complete(String line, int pos, List<CharSequence> list)
        {
            if (pos == 0) {
                list.addAll(commandsMap().keySet());
            } else {
                commandsMap().keySet().stream().filter(c -> c.startsWith(line)).findFirst().ifPresent(list::add);
            }
            return 0;
        }
    }
}