From 0743d383bdaffe39fce5260010301d8addf0b017 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 20 Sep 2020 12:25:47 -0500 Subject: [PATCH] PaperPR - Add hex color code support for console logging --- ...color-code-support-for-console-loggi.patch | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 patches/server/0129-PaperPR-Add-hex-color-code-support-for-console-loggi.patch diff --git a/patches/server/0129-PaperPR-Add-hex-color-code-support-for-console-loggi.patch b/patches/server/0129-PaperPR-Add-hex-color-code-support-for-console-loggi.patch new file mode 100644 index 000000000..848ac8a30 --- /dev/null +++ b/patches/server/0129-PaperPR-Add-hex-color-code-support-for-console-loggi.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 20 Sep 2020 12:25:18 -0500 +Subject: [PATCH] PaperPR - Add hex color code support for console logging + + +diff --git a/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java b/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java +index 685deaa0e..73c2bdd58 100644 +--- a/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java ++++ b/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java +@@ -1,17 +1,52 @@ + package com.destroystokyo.paper.console; + ++import java.awt.Color; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++import net.minecrell.terminalconsole.MinecraftFormattingConverter; ++import net.minecrell.terminalconsole.TerminalConsoleAppender; + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; ++import org.apache.logging.log4j.util.PropertiesUtil; ++import org.bukkit.ChatColor; + import org.bukkit.craftbukkit.command.CraftConsoleCommandSender; + + public class TerminalConsoleCommandSender extends CraftConsoleCommandSender { + + private static final Logger LOGGER = LogManager.getRootLogger(); ++ private static final char ANSI_ESC_CHAR = '\u001B'; ++ private static final String RGB_STRING = ANSI_ESC_CHAR + "[38;2;%d;%d;%dm"; ++ private static final String ANSI_RESET = ANSI_ESC_CHAR + "[0m"; ++ private static final Pattern HEX_PATTERN = Pattern.compile("(?i)(" + ChatColor.COLOR_CHAR + "x(" + ChatColor.COLOR_CHAR + "[0-9a-f]){6})"); ++ private static final boolean keepFormatting = PropertiesUtil.getProperties().getBooleanProperty(MinecraftFormattingConverter.KEEP_FORMATTING_PROPERTY); + + @Override + public void sendRawMessage(String message) { + // TerminalConsoleAppender supports color codes directly in log messages +- LOGGER.info(message); ++ // However, we need to convert hex colors manually, as those do not get transformed ++ LOGGER.info(hexMagicToAnsi(message)); + } + ++ private static String hexMagicToAnsi(String input) { ++ // If formatting should be kept, just leave the input as-is ++ if (keepFormatting) ++ return input; ++ ++ // If Ansi is not supported, just strip out any hex coloring ++ if (!TerminalConsoleAppender.isAnsiSupported()) ++ return HEX_PATTERN.matcher(input).replaceAll(""); ++ ++ Matcher matcher = HEX_PATTERN.matcher(input); ++ StringBuffer buffer = new StringBuffer(); ++ while (matcher.find()) { ++ String hex = matcher.group().replace(String.valueOf(ChatColor.COLOR_CHAR), "").replace('x', '#'); ++ Color color = Color.decode(hex); ++ String replacement = String.format(RGB_STRING, color.getRed(), color.getGreen(), color.getBlue()); ++ matcher.appendReplacement(buffer, replacement); ++ } ++ matcher.appendTail(buffer); ++ ++ // We add the Ansi reset to the end of each message to prevent the color from carrying over to the next logged message ++ return buffer.toString() + ANSI_RESET; ++ } + }