From 12b5da35f4c307bc00d5f9940824b94a7908d46c Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 27 Jun 2017 19:41:51 -0400 Subject: [PATCH] Refactor the MessageFormatter to support any number of colors --- .../commands/BukkitMessageFormatter.java | 30 ++-------- .../commands/BungeeMessageFormatter.java | 30 ++-------- .../java/co/aikar/commands/ACFPatterns.java | 2 +- .../co/aikar/commands/CommandManager.java | 7 ++- .../co/aikar/commands/MessageFormatter.java | 58 ++++++++++++++----- .../java/co/aikar/commands/MessageKey.java | 1 + .../java/co/aikar/commands/MessageType.java | 3 +- .../commands/SpongeMessageFormatter.java | 34 ++--------- 8 files changed, 66 insertions(+), 99 deletions(-) diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitMessageFormatter.java b/bukkit/src/main/java/co/aikar/commands/BukkitMessageFormatter.java index 81d9dcf6..4d3a4776 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitMessageFormatter.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitMessageFormatter.java @@ -25,34 +25,14 @@ package co.aikar.commands; import org.bukkit.ChatColor; -public class BukkitMessageFormatter implements MessageFormatter { - private final ChatColor color1; - private final ChatColor color2; - private final ChatColor color3; +public class BukkitMessageFormatter extends MessageFormatter { - public BukkitMessageFormatter(ChatColor color1) { - this(color1, color1); - } - public BukkitMessageFormatter(ChatColor color1, ChatColor color2) { - this(color1, color2, color2); - } - public BukkitMessageFormatter(ChatColor color1, ChatColor color2, ChatColor color3) { - this.color1 = color1; - this.color2 = color2; - this.color3 = color3; - } - @Override - public String c1(String message) { - return color1 + message; + public BukkitMessageFormatter(ChatColor... colors) { + super(colors); } @Override - public String c2(String message) { - return color2 + message; - } - - @Override - public String c3(String message) { - return color3 + message; + String format(ChatColor color, String message) { + return color + message; } } diff --git a/bungee/src/main/java/co/aikar/commands/BungeeMessageFormatter.java b/bungee/src/main/java/co/aikar/commands/BungeeMessageFormatter.java index c2e2916f..86ca6020 100644 --- a/bungee/src/main/java/co/aikar/commands/BungeeMessageFormatter.java +++ b/bungee/src/main/java/co/aikar/commands/BungeeMessageFormatter.java @@ -2,34 +2,14 @@ package co.aikar.commands; import net.md_5.bungee.api.ChatColor; -public class BungeeMessageFormatter implements MessageFormatter { - private final ChatColor color1; - private final ChatColor color2; - private final ChatColor color3; +public class BungeeMessageFormatter extends MessageFormatter { - public BungeeMessageFormatter(ChatColor color1) { - this(color1, color1); - } - public BungeeMessageFormatter(ChatColor color1, ChatColor color2) { - this(color1, color2, color2); - } - public BungeeMessageFormatter(ChatColor color1, ChatColor color2, ChatColor color3) { - this.color1 = color1; - this.color2 = color2; - this.color3 = color3; - } - @Override - public String c1(String message) { - return color1 + message; + public BungeeMessageFormatter(ChatColor... colors) { + super(colors); } @Override - public String c2(String message) { - return color2 + message; - } - - @Override - public String c3(String message) { - return color3 + message; + String format(ChatColor color, String message) { + return color + message; } } diff --git a/core/src/main/java/co/aikar/commands/ACFPatterns.java b/core/src/main/java/co/aikar/commands/ACFPatterns.java index 71dcaf5c..9394de58 100644 --- a/core/src/main/java/co/aikar/commands/ACFPatterns.java +++ b/core/src/main/java/co/aikar/commands/ACFPatterns.java @@ -44,7 +44,7 @@ final class ACFPatterns { public static final Pattern VALID_NAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_-]{2,16}$"); public static final Pattern NON_PRINTABLE_CHARACTERS = Pattern.compile("[^\\x20-\\x7F]"); public static final Pattern EQUALS = Pattern.compile("="); - public static final Pattern FORMATTER = Pattern.compile("<(?c1|c2|c3)>(?.+?)", Pattern.CASE_INSENSITIVE); + public static final Pattern FORMATTER = Pattern.compile("<(?c\\d)>(?.+?)", Pattern.CASE_INSENSITIVE); diff --git a/core/src/main/java/co/aikar/commands/CommandManager.java b/core/src/main/java/co/aikar/commands/CommandManager.java index 91b50a6c..daa93acb 100644 --- a/core/src/main/java/co/aikar/commands/CommandManager.java +++ b/core/src/main/java/co/aikar/commands/CommandManager.java @@ -41,7 +41,12 @@ abstract class CommandManager { protected ExceptionHandler defaultExceptionHandler = null; protected Map formatters = new IdentityHashMap<>(); { - MessageFormatter plain = message -> message; + MessageFormatter plain = new MessageFormatter() { + @Override + String format(Object color, String message) { + return message; + } + }; formatters.put(MessageType.INFO, plain); formatters.put(MessageType.SYNTAX, plain); formatters.put(MessageType.ERROR, plain); diff --git a/core/src/main/java/co/aikar/commands/MessageFormatter.java b/core/src/main/java/co/aikar/commands/MessageFormatter.java index b56ca82a..5a43b2ab 100644 --- a/core/src/main/java/co/aikar/commands/MessageFormatter.java +++ b/core/src/main/java/co/aikar/commands/MessageFormatter.java @@ -23,33 +23,59 @@ package co.aikar.commands; +import java.util.*; import java.util.regex.Matcher; -public interface MessageFormatter { +/** + * Handles formatting Messages and managing colors + * @param The platform specific color object + */ +@Deprecated +public abstract class MessageFormatter { - String c1(String message); + private final List colors = new ArrayList<>(); + + public MessageFormatter(C... colors) { + for (int i = 0; i < colors.length; i++) { + this.colors.set(i, colors[i]); + } - default String c2(String message) { - return c1(message); } - default String c3(String message) { - return c2(message); + public C setColor(int index, C color) { + if (this.colors.size() < index) { + this.colors.addAll(Collections.nCopies(index - this.colors.size(), null)); + } + return colors.set(index, color); } - default String format(String message) { + public C getColor(int index) { + C color = colors.get(index); + if (color == null) { + color = getDefaultColor(); + } + return color; + } + + public C getDefaultColor() { + return getColor(1); + } + + abstract String format(C color, String message); + + public String format(int index, String message) { + return format(getColor(index), message); + } + + public String format(String message) { + String def = format(1, ""); Matcher matcher = ACFPatterns.FORMATTER.matcher(message); StringBuffer sb = new StringBuffer(message.length()); while (matcher.find()) { - String type = matcher.group("type"); - String msg = matcher.group("msg"); - switch (type.toLowerCase()) { - case "c3": msg = c3(msg); break; - case "c2": msg = c2(msg); break; - default: msg = c1(msg); break; - } - matcher.appendReplacement(sb, Matcher.quoteReplacement(msg + c1(""))); + Integer color = ACFUtil.parseInt(matcher.group("color"), 1); + String msg = format(color, matcher.group("msg")) + def; + matcher.appendReplacement(sb, Matcher.quoteReplacement(msg)); } matcher.appendTail(sb); - return c1("") + sb.toString(); + return def + sb.toString(); } } diff --git a/core/src/main/java/co/aikar/commands/MessageKey.java b/core/src/main/java/co/aikar/commands/MessageKey.java index 84df0719..500a7065 100644 --- a/core/src/main/java/co/aikar/commands/MessageKey.java +++ b/core/src/main/java/co/aikar/commands/MessageKey.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +@Deprecated public class MessageKey { private static final AtomicInteger counter = new AtomicInteger(); private static final Map keyMap = new ConcurrentHashMap<>(); diff --git a/core/src/main/java/co/aikar/commands/MessageType.java b/core/src/main/java/co/aikar/commands/MessageType.java index 4dcf7842..3e74dfb2 100644 --- a/core/src/main/java/co/aikar/commands/MessageType.java +++ b/core/src/main/java/co/aikar/commands/MessageType.java @@ -25,8 +25,9 @@ package co.aikar.commands; import java.util.concurrent.atomic.AtomicInteger; +@SuppressWarnings("WeakerAccess") +@Deprecated public class MessageType { - @SuppressWarnings("WeakerAccess") public static MessageType INFO = new MessageType(); public static MessageType SYNTAX = new MessageType(); public static MessageType ERROR = new MessageType(); diff --git a/sponge/src/main/java/co/aikar/commands/SpongeMessageFormatter.java b/sponge/src/main/java/co/aikar/commands/SpongeMessageFormatter.java index b5d63826..fec2a2aa 100644 --- a/sponge/src/main/java/co/aikar/commands/SpongeMessageFormatter.java +++ b/sponge/src/main/java/co/aikar/commands/SpongeMessageFormatter.java @@ -4,39 +4,13 @@ import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.serializer.TextSerializers; -public class SpongeMessageFormatter implements MessageFormatter { - private final TextColor color1; - private final TextColor color2; - private final TextColor color3; +public class SpongeMessageFormatter extends MessageFormatter { - public SpongeMessageFormatter(TextColor color1) { - this(color1, color1); - } - public SpongeMessageFormatter(TextColor color1, TextColor color2) { - this(color1, color2, color2); - } - public SpongeMessageFormatter(TextColor color1, TextColor color2, TextColor color3) { - this.color1 = color1; - this.color2 = color2; - this.color3 = color3; + public SpongeMessageFormatter(TextColor... colors) { + super(colors); } - @Override - public String c1(String message) { - return convert(color1, message); - } - - @Override - public String c2(String message) { - return convert(color2, message); - } - - @Override - public String c3(String message) { - return convert(color3, message); - } - - private String convert(TextColor color, String message) { + public String format(TextColor color, String message) { return TextSerializers.LEGACY_FORMATTING_CODE.serialize(Text.of(color, message)); } }