From 7cde213e63c1e529d16d636d3305dbaa43da24a8 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 1 Jun 2025 12:09:40 +1000 Subject: [PATCH] #3837: Update to JLine 3 --- log/pom.xml | 4 ++-- .../net/md_5/bungee/log/BungeeLogger.java | 4 ++-- .../net/md_5/bungee/log/ColouredWriter.java | 24 +++++-------------- pom.xml | 2 +- .../main/java/net/md_5/bungee/BungeeCord.java | 17 +++++++------ .../net/md_5/bungee/BungeeCordLauncher.java | 16 +++++++++---- .../command/ConsoleCommandCompleter.java | 19 +++++++++------ 7 files changed, 45 insertions(+), 41 deletions(-) diff --git a/log/pom.xml b/log/pom.xml index 37679ec1..8fa24a92 100644 --- a/log/pom.xml +++ b/log/pom.xml @@ -20,9 +20,9 @@ - jline + org.jline jline - 2.12.1 + 3.30.4 compile diff --git a/log/src/main/java/net/md_5/bungee/log/BungeeLogger.java b/log/src/main/java/net/md_5/bungee/log/BungeeLogger.java index 4954d332..6cbd0b35 100644 --- a/log/src/main/java/net/md_5/bungee/log/BungeeLogger.java +++ b/log/src/main/java/net/md_5/bungee/log/BungeeLogger.java @@ -5,14 +5,14 @@ import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; -import jline.console.ConsoleReader; +import org.jline.reader.LineReader; public class BungeeLogger extends Logger { private final LogDispatcher dispatcher = new LogDispatcher( this ); - public BungeeLogger(String loggerName, String filePattern, ConsoleReader reader) + public BungeeLogger(String loggerName, String filePattern, LineReader reader) { super( loggerName, null ); setLevel( Level.ALL ); diff --git a/log/src/main/java/net/md_5/bungee/log/ColouredWriter.java b/log/src/main/java/net/md_5/bungee/log/ColouredWriter.java index 5b4f245d..dcb3e504 100644 --- a/log/src/main/java/net/md_5/bungee/log/ColouredWriter.java +++ b/log/src/main/java/net/md_5/bungee/log/ColouredWriter.java @@ -1,15 +1,15 @@ package net.md_5.bungee.log; -import java.io.IOException; import java.util.logging.Handler; import java.util.logging.LogRecord; import java.util.regex.Pattern; -import jline.console.ConsoleReader; import lombok.Data; +import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.ChatColor; -import org.fusesource.jansi.Ansi; -import org.fusesource.jansi.Ansi.Erase; +import org.jline.jansi.Ansi; +import org.jline.reader.LineReader; +@RequiredArgsConstructor public class ColouredWriter extends Handler { @@ -52,12 +52,7 @@ public class ColouredWriter extends Handler compile( ChatColor.RESET, Ansi.ansi().a( Ansi.Attribute.RESET ).toString() ), }; // - private final ConsoleReader console; - - public ColouredWriter(ConsoleReader console) - { - this.console = console; - } + private final LineReader console; public void print(String s) { @@ -65,14 +60,7 @@ public class ColouredWriter extends Handler { s = replacement.pattern.matcher( s ).replaceAll( replacement.replacement ); } - try - { - console.print( Ansi.ansi().eraseLine( Erase.ALL ).toString() + ConsoleReader.RESET_LINE + s + Ansi.ansi().reset().toString() ); - console.drawLine(); - console.flush(); - } catch ( IOException ex ) - { - } + console.printAbove( s + Ansi.ansi().reset().toString() ); } @Override diff --git a/pom.xml b/pom.xml index ae9d4f62..57bac7e4 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ org.codehaus.mojo animal-sniffer-maven-plugin - 1.23 + 1.24 process-classes diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 45090154..d412c58a 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -44,7 +44,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; -import jline.console.ConsoleReader; import lombok.Getter; import lombok.Setter; import lombok.Synchronized; @@ -84,7 +83,10 @@ import net.md_5.bungee.protocol.packet.PluginMessage; import net.md_5.bungee.query.RemoteQuery; import net.md_5.bungee.scheduler.BungeeScheduler; import net.md_5.bungee.util.CaseInsensitiveMap; -import org.fusesource.jansi.AnsiConsole; +import org.jline.reader.LineReader; +import org.jline.reader.LineReaderBuilder; +import org.jline.terminal.Terminal; +import org.jline.terminal.TerminalBuilder; import org.slf4j.impl.JDK14LoggerFactory; /** @@ -146,7 +148,7 @@ public class BungeeCord extends ProxyServer @Getter private final BungeeScheduler scheduler = new BungeeScheduler(); @Getter - private final ConsoleReader consoleReader; + private final LineReader consoleReader; @Getter private final Logger logger; @Getter @@ -195,10 +197,11 @@ public class BungeeCord extends ProxyServer // BungeeCord. This version is only used when extracting the libraries to their temp folder. System.setProperty( "library.jansi.version", "BungeeCord" ); - AnsiConsole.systemInstall(); - consoleReader = new ConsoleReader(); - consoleReader.setExpandEvents( false ); - consoleReader.addCompleter( new ConsoleCommandCompleter( this ) ); + Terminal terminal = TerminalBuilder.builder().build(); + consoleReader = LineReaderBuilder.builder().terminal( terminal ) + .option( LineReader.Option.DISABLE_EVENT_EXPANSION, true ) + .completer( new ConsoleCommandCompleter( this ) ) + .build(); logger = new BungeeLogger( "BungeeCord", "proxy.log", consoleReader ); JDK14LoggerFactory.LOGGER = logger; diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java index 7281d6b2..cec7fadb 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java @@ -12,6 +12,8 @@ import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.command.ConsoleCommandSender; +import org.jline.reader.EndOfFileException; +import org.jline.reader.UserInterruptException; public class BungeeCordLauncher { @@ -68,13 +70,19 @@ public class BungeeCordLauncher if ( !options.has( "noconsole" ) ) { - String line; - while ( bungee.isRunning && ( line = bungee.getConsoleReader().readLine( ">" ) ) != null ) + try { - if ( !bungee.getPluginManager().dispatchCommand( ConsoleCommandSender.getInstance(), line ) ) + String line; + while ( bungee.isRunning && ( line = bungee.getConsoleReader().readLine( ">" ) ) != null ) { - bungee.getConsole().sendMessage( new ComponentBuilder( "Command not found" ).color( ChatColor.RED ).create() ); + if ( !bungee.getPluginManager().dispatchCommand( ConsoleCommandSender.getInstance(), line ) ) + { + bungee.getConsole().sendMessage( new ComponentBuilder( "Command not found" ).color( ChatColor.RED ).create() ); + } } + } catch ( EndOfFileException | UserInterruptException ex ) + { + // ignore } } } diff --git a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java index 3e5ca394..783ed60e 100644 --- a/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java +++ b/proxy/src/main/java/net/md_5/bungee/command/ConsoleCommandCompleter.java @@ -5,9 +5,12 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; -import jline.console.completer.Completer; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.ProxyServer; +import org.jline.reader.Candidate; +import org.jline.reader.Completer; +import org.jline.reader.LineReader; +import org.jline.reader.ParsedLine; @RequiredArgsConstructor public class ConsoleCommandCompleter implements Completer @@ -16,23 +19,25 @@ public class ConsoleCommandCompleter implements Completer private final ProxyServer proxy; @Override - public int complete(String buffer, int cursor, List candidates) + public void complete(LineReader reader, ParsedLine line, List candidates) { + List suggestions; + String buffer = line.line(); + int lastSpace = buffer.lastIndexOf( ' ' ); if ( lastSpace == -1 ) { String lowerCase = buffer.toLowerCase( Locale.ROOT ); - candidates.addAll( proxy.getPluginManager().getCommands().stream() + suggestions = proxy.getPluginManager().getCommands().stream() .map( Map.Entry::getKey ) .filter( (name) -> name.toLowerCase( Locale.ROOT ).startsWith( lowerCase ) ) - .collect( Collectors.toList() ) ); + .collect( Collectors.toList() ); } else { - List suggestions = new ArrayList<>(); + suggestions = new ArrayList<>(); proxy.getPluginManager().dispatchCommand( proxy.getConsole(), buffer, suggestions ); - candidates.addAll( suggestions ); } - return ( lastSpace == -1 ) ? cursor - buffer.length() : cursor - ( buffer.length() - lastSpace - 1 ); + suggestions.stream().map( Candidate::new ).forEach( (candidate) -> candidates.add( candidate ) ); } }