#3837: Update to JLine 3

This commit is contained in:
md_5 2025-06-01 12:09:40 +10:00
parent aa44ebe770
commit 7cde213e63
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
7 changed files with 45 additions and 41 deletions

View File

@ -20,9 +20,9 @@
<dependencies>
<dependency>
<groupId>jline</groupId>
<groupId>org.jline</groupId>
<artifactId>jline</artifactId>
<version>2.12.1</version>
<version>3.30.4</version>
<scope>compile</scope>
</dependency>
<dependency>

View File

@ -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 );

View File

@ -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

View File

@ -179,7 +179,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>animal-sniffer-maven-plugin</artifactId>
<version>1.23</version>
<version>1.24</version>
<executions>
<execution>
<phase>process-classes</phase>

View File

@ -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;

View File

@ -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
}
}
}

View File

@ -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<CharSequence> candidates)
public void complete(LineReader reader, ParsedLine line, List<Candidate> candidates)
{
List<String> 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<String> 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 ) );
}
}