mirror of
https://github.com/PaperMC/Paper.git
synced 2025-03-25 00:07:36 +01:00
JLine 2 allows for better color matching in the console and support for colors in console on Windows. Hopefully provides better performance as well.
75 lines
3.8 KiB
Java
75 lines
3.8 KiB
Java
package org.bukkit.craftbukkit.command;
|
|
|
|
import java.util.EnumMap;
|
|
import java.util.Map;
|
|
import org.fusesource.jansi.Ansi;
|
|
import org.fusesource.jansi.Ansi.Attribute;
|
|
import jline.console.ConsoleReader;
|
|
import jline.Terminal;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.command.ConsoleCommandSender;
|
|
import org.bukkit.craftbukkit.CraftServer;
|
|
|
|
public class ColouredConsoleSender extends CraftConsoleCommandSender {
|
|
private final ConsoleReader reader;
|
|
private final Terminal terminal;
|
|
private final Map<ChatColor, String> replacements = new EnumMap<ChatColor, String>(ChatColor.class);
|
|
private final ChatColor[] colors = ChatColor.values();
|
|
|
|
protected ColouredConsoleSender() {
|
|
super();
|
|
this.reader = ((CraftServer) getServer()).getReader();
|
|
this.terminal = reader.getTerminal();
|
|
|
|
replacements.put(ChatColor.BLACK, Ansi.ansi().fg(Ansi.Color.BLACK).toString());
|
|
replacements.put(ChatColor.DARK_BLUE, Ansi.ansi().fg(Ansi.Color.BLUE).toString());
|
|
replacements.put(ChatColor.DARK_GREEN, Ansi.ansi().fg(Ansi.Color.GREEN).toString());
|
|
replacements.put(ChatColor.DARK_AQUA, Ansi.ansi().fg(Ansi.Color.CYAN).toString());
|
|
replacements.put(ChatColor.DARK_RED, Ansi.ansi().fg(Ansi.Color.RED).toString());
|
|
replacements.put(ChatColor.DARK_PURPLE, Ansi.ansi().fg(Ansi.Color.MAGENTA).toString());
|
|
replacements.put(ChatColor.GOLD, Ansi.ansi().fg(Ansi.Color.YELLOW).bold().toString());
|
|
replacements.put(ChatColor.GRAY, Ansi.ansi().fg(Ansi.Color.WHITE).toString());
|
|
replacements.put(ChatColor.DARK_GRAY, Ansi.ansi().fg(Ansi.Color.BLACK).bold().toString());
|
|
replacements.put(ChatColor.BLUE, Ansi.ansi().fg(Ansi.Color.BLUE).bold().toString());
|
|
replacements.put(ChatColor.GREEN, Ansi.ansi().fg(Ansi.Color.GREEN).bold().toString());
|
|
replacements.put(ChatColor.AQUA, Ansi.ansi().fg(Ansi.Color.CYAN).bold().toString());
|
|
replacements.put(ChatColor.RED, Ansi.ansi().fg(Ansi.Color.RED).bold().toString());
|
|
replacements.put(ChatColor.LIGHT_PURPLE, Ansi.ansi().fg(Ansi.Color.MAGENTA).bold().toString());
|
|
replacements.put(ChatColor.YELLOW, Ansi.ansi().fg(Ansi.Color.YELLOW).bold().toString());
|
|
replacements.put(ChatColor.WHITE, Ansi.ansi().fg(Ansi.Color.WHITE).bold().toString());
|
|
replacements.put(ChatColor.MAGIC, Ansi.ansi().a(Attribute.BLINK_SLOW).toString());
|
|
replacements.put(ChatColor.BOLD, Ansi.ansi().a(Attribute.UNDERLINE_DOUBLE).toString());
|
|
replacements.put(ChatColor.STRIKETHROUGH, Ansi.ansi().a(Attribute.STRIKETHROUGH_ON).toString());
|
|
replacements.put(ChatColor.UNDERLINE, Ansi.ansi().a(Attribute.UNDERLINE).toString());
|
|
replacements.put(ChatColor.ITALIC, Ansi.ansi().a(Attribute.ITALIC).toString());
|
|
replacements.put(ChatColor.RESET, Ansi.ansi().a(Attribute.RESET).fg(Ansi.Color.DEFAULT).toString());
|
|
}
|
|
|
|
@Override
|
|
public void sendMessage(String message) {
|
|
if (terminal.isAnsiSupported()) {
|
|
if (!conversationTracker.isConversingModaly()) {
|
|
String result = message;
|
|
for (ChatColor color : colors) {
|
|
if (replacements.containsKey(color)) {
|
|
result = result.replaceAll("(?i)" + color.toString(), replacements.get(color));
|
|
} else {
|
|
result = result.replaceAll("(?i)" + color.toString(), "");
|
|
}
|
|
}
|
|
System.out.println(result + Ansi.ansi().reset().toString());
|
|
}
|
|
} else {
|
|
super.sendMessage(message);
|
|
}
|
|
}
|
|
|
|
public static ConsoleCommandSender getInstance() {
|
|
if (Bukkit.getConsoleSender() != null) {
|
|
return Bukkit.getConsoleSender();
|
|
} else {
|
|
return new ColouredConsoleSender();
|
|
}
|
|
}
|
|
}
|