#3837: Update to JLine 3

This commit is contained in:
md_5
2025-06-01 12:09:40 +10:00
parent aa44ebe770
commit 7cde213e63
7 changed files with 45 additions and 41 deletions

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