From 4f5d0785aa666f25e5c418a423dc3347b0289be8 Mon Sep 17 00:00:00 2001 From: Rytis Sileika Date: Thu, 28 Jan 2021 22:07:52 +0000 Subject: [PATCH] Add support for Minecraft text formating codes --- rcon/console.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/rcon/console.py b/rcon/console.py index de121fb..cab41df 100644 --- a/rcon/console.py +++ b/rcon/console.py @@ -120,10 +120,55 @@ def process_input(client: Client, passwd: str, prompt: str) -> bool: print(MSG_LOGIN_ABORTED) return False - print(result) + print(colorize(result)) + print("\033[0m") return True +def esc_256f(rgb_full): + """Convert 8 bit RGB value to extended ANSI escape sequence""" + rgb_666_value = 16 + \ + 36 * (round(rgb_full[0] / 255.0) * 5) + \ + 6 * (round(rgb_full[1] / 255.0) * 5) + \ + (round(rgb_full[2] / 255.0) * 5) + return "\033[38;5;{}m".format(str(rgb_666_value)) + + +def colorize(text): + """Replace Minecraft formating codes with ANSI escape sequences""" + # https://www.digminecraft.com/lists/color_list_pc.php + # https://en.wikipedia.org/wiki/ANSI_escape_code#Colors + chat_codes = { + "§4": esc_256f((0xAA, 0x00, 0x00)), + "§c": esc_256f((0xFF, 0x55, 0x55)), + "§6": esc_256f((0xFF, 0xAA, 0x00)), + "§e": esc_256f((0xFF, 0xFF, 0x55)), + "§2": esc_256f((0x00, 0xAA, 0x00)), + "§a": esc_256f((0x55, 0xFF, 0x55)), + "§b": esc_256f((0x55, 0xFF, 0xFF)), + "§3": esc_256f((0x00, 0xAA, 0xAA)), + "§1": esc_256f((0x00, 0x00, 0xAA)), + "§9": esc_256f((0x55, 0x55, 0xFF)), + "§d": esc_256f((0xFF, 0x55, 0xFF)), + "§5": esc_256f((0xAA, 0x00, 0xAA)), + "§f": esc_256f((0xFF, 0xFF, 0xFF)), + "§7": esc_256f((0xAA, 0xAA, 0xAA)), + "§8": esc_256f((0x55, 0x55, 0x55)), + "§0": esc_256f((0x00, 0x00, 0x00)), + + "§l": "\033[1m", # bold + "§m": "\033[9m", # strikethrough + "§n": "\033[4m", # underline + "§o": "\033[3m", # italic + + "§r": "\033[0m", # reset + } + + for k, v in chat_codes.items(): + text = text.replace(k, v) + return text + + def rconcmd(host: str, port: int, passwd: str, *, prompt: str = PROMPT): """Initializes the console."""