#3837: Update to JLine 3
This commit is contained in:
parent
aa44ebe770
commit
7cde213e63
@ -20,9 +20,9 @@
|
|||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>jline</groupId>
|
<groupId>org.jline</groupId>
|
||||||
<artifactId>jline</artifactId>
|
<artifactId>jline</artifactId>
|
||||||
<version>2.12.1</version>
|
<version>3.30.4</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
@ -5,14 +5,14 @@ import java.util.logging.FileHandler;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.LogRecord;
|
import java.util.logging.LogRecord;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import jline.console.ConsoleReader;
|
import org.jline.reader.LineReader;
|
||||||
|
|
||||||
public class BungeeLogger extends Logger
|
public class BungeeLogger extends Logger
|
||||||
{
|
{
|
||||||
|
|
||||||
private final LogDispatcher dispatcher = new LogDispatcher( this );
|
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 );
|
super( loggerName, null );
|
||||||
setLevel( Level.ALL );
|
setLevel( Level.ALL );
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
package net.md_5.bungee.log;
|
package net.md_5.bungee.log;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
import java.util.logging.LogRecord;
|
import java.util.logging.LogRecord;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import jline.console.ConsoleReader;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import org.fusesource.jansi.Ansi;
|
import org.jline.jansi.Ansi;
|
||||||
import org.fusesource.jansi.Ansi.Erase;
|
import org.jline.reader.LineReader;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
public class ColouredWriter extends Handler
|
public class ColouredWriter extends Handler
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -52,12 +52,7 @@ public class ColouredWriter extends Handler
|
|||||||
compile( ChatColor.RESET, Ansi.ansi().a( Ansi.Attribute.RESET ).toString() ),
|
compile( ChatColor.RESET, Ansi.ansi().a( Ansi.Attribute.RESET ).toString() ),
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
private final ConsoleReader console;
|
private final LineReader console;
|
||||||
|
|
||||||
public ColouredWriter(ConsoleReader console)
|
|
||||||
{
|
|
||||||
this.console = console;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void print(String s)
|
public void print(String s)
|
||||||
{
|
{
|
||||||
@ -65,14 +60,7 @@ public class ColouredWriter extends Handler
|
|||||||
{
|
{
|
||||||
s = replacement.pattern.matcher( s ).replaceAll( replacement.replacement );
|
s = replacement.pattern.matcher( s ).replaceAll( replacement.replacement );
|
||||||
}
|
}
|
||||||
try
|
console.printAbove( s + Ansi.ansi().reset().toString() );
|
||||||
{
|
|
||||||
console.print( Ansi.ansi().eraseLine( Erase.ALL ).toString() + ConsoleReader.RESET_LINE + s + Ansi.ansi().reset().toString() );
|
|
||||||
console.drawLine();
|
|
||||||
console.flush();
|
|
||||||
} catch ( IOException ex )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
2
pom.xml
2
pom.xml
@ -179,7 +179,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>animal-sniffer-maven-plugin</artifactId>
|
<artifactId>animal-sniffer-maven-plugin</artifactId>
|
||||||
<version>1.23</version>
|
<version>1.24</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<phase>process-classes</phase>
|
<phase>process-classes</phase>
|
||||||
|
@ -44,7 +44,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|||||||
import java.util.logging.Handler;
|
import java.util.logging.Handler;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import jline.console.ConsoleReader;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.Synchronized;
|
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.query.RemoteQuery;
|
||||||
import net.md_5.bungee.scheduler.BungeeScheduler;
|
import net.md_5.bungee.scheduler.BungeeScheduler;
|
||||||
import net.md_5.bungee.util.CaseInsensitiveMap;
|
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;
|
import org.slf4j.impl.JDK14LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -146,7 +148,7 @@ public class BungeeCord extends ProxyServer
|
|||||||
@Getter
|
@Getter
|
||||||
private final BungeeScheduler scheduler = new BungeeScheduler();
|
private final BungeeScheduler scheduler = new BungeeScheduler();
|
||||||
@Getter
|
@Getter
|
||||||
private final ConsoleReader consoleReader;
|
private final LineReader consoleReader;
|
||||||
@Getter
|
@Getter
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
@Getter
|
@Getter
|
||||||
@ -195,10 +197,11 @@ public class BungeeCord extends ProxyServer
|
|||||||
// BungeeCord. This version is only used when extracting the libraries to their temp folder.
|
// BungeeCord. This version is only used when extracting the libraries to their temp folder.
|
||||||
System.setProperty( "library.jansi.version", "BungeeCord" );
|
System.setProperty( "library.jansi.version", "BungeeCord" );
|
||||||
|
|
||||||
AnsiConsole.systemInstall();
|
Terminal terminal = TerminalBuilder.builder().build();
|
||||||
consoleReader = new ConsoleReader();
|
consoleReader = LineReaderBuilder.builder().terminal( terminal )
|
||||||
consoleReader.setExpandEvents( false );
|
.option( LineReader.Option.DISABLE_EVENT_EXPANSION, true )
|
||||||
consoleReader.addCompleter( new ConsoleCommandCompleter( this ) );
|
.completer( new ConsoleCommandCompleter( this ) )
|
||||||
|
.build();
|
||||||
|
|
||||||
logger = new BungeeLogger( "BungeeCord", "proxy.log", consoleReader );
|
logger = new BungeeLogger( "BungeeCord", "proxy.log", consoleReader );
|
||||||
JDK14LoggerFactory.LOGGER = logger;
|
JDK14LoggerFactory.LOGGER = logger;
|
||||||
|
@ -12,6 +12,8 @@ import net.md_5.bungee.api.ChatColor;
|
|||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||||
import net.md_5.bungee.command.ConsoleCommandSender;
|
import net.md_5.bungee.command.ConsoleCommandSender;
|
||||||
|
import org.jline.reader.EndOfFileException;
|
||||||
|
import org.jline.reader.UserInterruptException;
|
||||||
|
|
||||||
public class BungeeCordLauncher
|
public class BungeeCordLauncher
|
||||||
{
|
{
|
||||||
@ -68,13 +70,19 @@ public class BungeeCordLauncher
|
|||||||
|
|
||||||
if ( !options.has( "noconsole" ) )
|
if ( !options.has( "noconsole" ) )
|
||||||
{
|
{
|
||||||
String line;
|
try
|
||||||
while ( bungee.isRunning && ( line = bungee.getConsoleReader().readLine( ">" ) ) != null )
|
|
||||||
{
|
{
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,12 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import jline.console.completer.Completer;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
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
|
@RequiredArgsConstructor
|
||||||
public class ConsoleCommandCompleter implements Completer
|
public class ConsoleCommandCompleter implements Completer
|
||||||
@ -16,23 +19,25 @@ public class ConsoleCommandCompleter implements Completer
|
|||||||
private final ProxyServer proxy;
|
private final ProxyServer proxy;
|
||||||
|
|
||||||
@Override
|
@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( ' ' );
|
int lastSpace = buffer.lastIndexOf( ' ' );
|
||||||
if ( lastSpace == -1 )
|
if ( lastSpace == -1 )
|
||||||
{
|
{
|
||||||
String lowerCase = buffer.toLowerCase( Locale.ROOT );
|
String lowerCase = buffer.toLowerCase( Locale.ROOT );
|
||||||
candidates.addAll( proxy.getPluginManager().getCommands().stream()
|
suggestions = proxy.getPluginManager().getCommands().stream()
|
||||||
.map( Map.Entry::getKey )
|
.map( Map.Entry::getKey )
|
||||||
.filter( (name) -> name.toLowerCase( Locale.ROOT ).startsWith( lowerCase ) )
|
.filter( (name) -> name.toLowerCase( Locale.ROOT ).startsWith( lowerCase ) )
|
||||||
.collect( Collectors.toList() ) );
|
.collect( Collectors.toList() );
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
List<String> suggestions = new ArrayList<>();
|
suggestions = new ArrayList<>();
|
||||||
proxy.getPluginManager().dispatchCommand( proxy.getConsole(), buffer, suggestions );
|
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 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user