diff --git a/.idea/ButtonChat.iml b/.idea/ButtonChat.iml index aa60b82..a340893 100644 --- a/.idea/ButtonChat.iml +++ b/.idea/ButtonChat.iml @@ -88,5 +88,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java index 6587cc2..d6b955e 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java +++ b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java @@ -16,7 +16,6 @@ import buttondevteam.lib.TBMCChatEvent; import buttondevteam.lib.TBMCChatEventBase; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.Color; -import buttondevteam.lib.chat.Priority; import buttondevteam.lib.chat.TellrawSerializableEnum; import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.player.TBMCPlayer; @@ -40,21 +39,9 @@ import java.util.function.Predicate; import java.util.regex.Pattern; public class ChatProcessing { - private static final Pattern NULL_MENTION_PATTERN = Pattern.compile("null"); - private static final Pattern CYAN_PATTERN = Pattern.compile("cyan"); - private static final Pattern ESCAPE_PATTERN = Pattern.compile("\\\\"); - private static final Pattern CONSOLE_PING_PATTERN = Pattern.compile("(?i)" + Pattern.quote("@console")); private static final Pattern HASHTAG_PATTERN = Pattern.compile("#(\\w+)"); private static final Pattern URL_PATTERN = Pattern.compile("(http[\\w:/?=$\\-_.+!*'(),&]+(?:#[\\w]+)?)"); - private static final Pattern UNDERLINED_PATTERN = Pattern.compile("__"); - private static final Pattern ITALIC_PATTERN = Pattern.compile("\\*"); - private static final Pattern ITALIC_PATTERN_2 = Pattern.compile("_"); - private static final Pattern BOLD_PATTERN = Pattern.compile("\\*\\*"); - private static final Pattern CODE_PATTERN = Pattern.compile("`"); private static final Pattern MASKED_LINK_PATTERN = Pattern.compile("\\[([^\\[\\]]+)]\\(([^()]+)\\)"); - private static final Pattern SOMEONE_PATTERN = Pattern.compile("@someone"); - private static final Pattern STRIKETHROUGH_PATTERN = Pattern.compile("~~"); - private static final Pattern SPOILER_PATTERN = Pattern.compile("\\|\\|"); private static final Color[] RainbowPresserColors = new Color[]{Color.Red, Color.Gold, Color.Yellow, Color.Green, Color.Blue, Color.DarkPurple}; private static final Pattern WORD_PATTERN = Pattern.compile("\\S+"); @@ -149,7 +136,7 @@ public class ChatProcessing { ArrayList formatters; if (component.allowFormatting().get()) { - formatters = addFormatters(colormode, e::shouldSendTo, component); + formatters = addFormatters(e::shouldSendTo, component); if (colormode == channel.Color().get() && mp != null && mp.RainbowPresserColorMode) { // Only overwrite channel color createRPC(colormode, formatters); } @@ -159,7 +146,7 @@ public class ChatProcessing { TellrawPart json = createTellraw(sender, message, player, mp, e.getUser(), channelidentifier, e.getOrigin()); long combinetime = System.nanoTime(); - ChatFormatter.Combine(formatters, message, json, component.getConfig()); + ChatFormatter.Combine(formatters, message, json, component.getConfig(), FormatSettings.builder().color(colormode).build()); combinetime = System.nanoTime() - combinetime; String jsonstr = toJson(json); if (jsonstr.length() >= 32767) { @@ -204,12 +191,12 @@ public class ChatProcessing { return false; } - static void createRPC(Color colormode, ArrayList formatters) { + static void createRPC(Color colormode, ArrayList formatters) { final AtomicInteger rpc = new AtomicInteger(0); - formatters.add(ChatFormatter.builder("rpc", WORD_PATTERN).color(colormode).onmatch((match, cf, s) -> { + formatters.add(new RegexMatchProvider("rpc", WORD_PATTERN, FormatSettings.builder().color(colormode).onmatch((match, cf, s) -> { cf.setColor(RainbowPresserColors[rpc.getAndUpdate(i -> ++i < RainbowPresserColors.length ? i : 0)]); return match; - }).build()); + }).build())); } public static String toJson(TellrawPart json) { @@ -255,7 +242,7 @@ public class ChatProcessing { + "]"; } - static ArrayList addFormatters(Color colormode, Predicate canSee, @Nullable FormatterComponent component) { + static ArrayList addFormatters(Predicate canSee, @Nullable FormatterComponent component) { @SuppressWarnings("unchecked") ArrayList formatters = (ArrayList) commonFormatters.clone(); @@ -268,18 +255,8 @@ public class ChatProcessing { names = new String[testPlayers.length]; System.arraycopy(testPlayers, 0, names, 0, testPlayers.length); } - StringBuilder nicksb = new StringBuilder("(?i)("); - boolean addNickFormatter = false; - for (Player p : Bukkit.getOnlinePlayers()) { - if (!canSee.test(p)) continue; - final String nick = PlayerListener.nicknames.inverse().get(p.getUniqueId()); - if (nick != null) { - nicksb.append(nick).append("|"); - addNickFormatter = true; - } - } - nicksb.deleteCharAt(nicksb.length() - 1); - nicksb.append(")"); + String[] nicknames = Bukkit.getOnlinePlayers().stream().filter(canSee).map(Player::getUniqueId).map(PlayerListener.nicknames.inverse()::get) + .filter(Objects::nonNull).toArray(String[]::new); Consumer error = message -> { if (PluginMain.Instance != null) @@ -289,7 +266,7 @@ public class ChatProcessing { }; if (names.length > 0) - formatters.add(ChatFormatter.builder("name", Pattern.compile(namesb.toString())).color(Color.Aqua) + formatters.add(new StringMatchProvider("name", FormatSettings.builder().color(Color.Aqua) .onmatch((match, builder, section) -> { Player p = Bukkit.getPlayer(match); Optional pn = nottest ? Optional.empty() @@ -304,10 +281,10 @@ public class ChatProcessing { } String color = String.format("§%x", (mpp.GetFlairColor() == 0x00 ? 0xb : mpp.GetFlairColor())); return color + (nottest ? p.getName() : pn.get()) + "§r"; //Fix name casing, except when testing - }).priority(Priority.High).type(ChatFormatter.Type.Excluder).build()); + }).build(), names)); - if (addNickFormatter) - formatters.add(ChatFormatter.builder("nickname", Pattern.compile(nicksb.toString())).color(Color.Aqua) + if (nicknames.length > 0) + formatters.add(new StringMatchProvider("nickname", FormatSettings.builder().color(Color.Aqua) .onmatch((match, builder, section) -> { if (PlayerListener.nicknames.containsKey(match.toLowerCase())) { //Made a stream and all that but I can actually store it lowercased Player p = Bukkit.getPlayer(PlayerListener.nicknames.get(match.toLowerCase())); @@ -322,7 +299,7 @@ public class ChatProcessing { error.accept("Player nicknamed " + match.toLowerCase() + " not found in nickname map but was reported as online."); return "§c" + match + "§r"; - }).priority(Priority.High).type(ChatFormatter.Type.Excluder).build()); + }).build(), nicknames)); } return formatters; } diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java index ffffd68..e3d8cbd 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java @@ -25,7 +25,7 @@ public final class ChatFormatter { R apply(T1 x1, T2 x2, T3 x3); } - public static void Combine(List formatters, String str, TellrawPart tp, IHaveConfig config) { + public static void Combine(List formatters, String str, TellrawPart tp, IHaveConfig config, FormatSettings defaults) { /* * A global formatter is no longer needed */ @@ -40,7 +40,7 @@ public final class ChatFormatter { */ val remchars = new ArrayList(); - createSections(formatters, str, sections, excluded, remchars); + createSections(formatters, str, sections, excluded, remchars, defaults); sortSections(sections); header("Section combining"); @@ -52,12 +52,18 @@ public final class ChatFormatter { } private static void createSections(List formatters, String str, ArrayList sections, - ArrayList excludedAreas, ArrayList removedCharacters) { - sections.add(new FormattedSection(FormatSettings.builder().color(Color.White).build(), 0, str.length() - 1, Collections.emptyList())); //Add entire message - for (var formatter : formatters) { - var sect = formatter.getNextSection(str, excludedAreas, removedCharacters); - if (sect != null) - sections.add(sect); + ArrayList excludedAreas, ArrayList removedCharacters, FormatSettings defaults) { + sections.add(new FormattedSection(defaults, 0, str.length() - 1, Collections.emptyList())); //Add entire message + while (formatters.size() > 0) { + for (var iterator = formatters.iterator(); iterator.hasNext(); ) { + MatchProviderBase formatter = iterator.next(); + DebugCommand.SendDebugMessage("Checking provider: " + formatter); + var sect = formatter.getNextSection(str, excludedAreas, removedCharacters); + if (sect != null) + sections.add(sect); + if (formatter.isFinished()) + iterator.remove(); + } } } diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/FormattedSection.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/FormattedSection.java index 324c8e1..f6bab89 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/FormattedSection.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/FormattedSection.java @@ -1,8 +1,11 @@ package buttondevteam.chat.components.formatter.formatting; +import lombok.ToString; + import java.util.ArrayList; import java.util.List; +@ToString public class FormattedSection { public int Start; public int End; diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java index ccefcb5..548a007 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/MatchProviderBase.java @@ -19,6 +19,9 @@ public abstract class MatchProviderBase implements MatchProvider { @Override public abstract FormattedSection getNextSection(String message, ArrayList ignoredAreas, ArrayList removedCharacters); + @Override + public abstract String toString(); + ConfigData enabled(IHaveConfig config) { return config.getData(name + ".enabled", true); } diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java index 909f7c3..c28e9d1 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/RangeMatchProvider.java @@ -1,12 +1,15 @@ package buttondevteam.chat.components.formatter.formatting; import buttondevteam.chat.commands.ucmds.admin.DebugCommand; +import lombok.ToString; import java.util.ArrayList; import java.util.Collections; +@ToString public class RangeMatchProvider extends MatchProviderBase { private final String pattern; + @ToString.Exclude private final FormatSettings settings; private int nextIndex = 0; private FormattedSection startedSection; diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java index 213592f..477c616 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/RegexMatchProvider.java @@ -1,14 +1,17 @@ package buttondevteam.chat.components.formatter.formatting; import buttondevteam.chat.commands.ucmds.admin.DebugCommand; +import lombok.ToString; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; +@ToString public class RegexMatchProvider extends MatchProviderBase { private final Pattern pattern; + @ToString.Exclude private final FormatSettings settings; private Matcher matcher; diff --git a/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java b/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java index dc197de..beabce1 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/StringMatchProvider.java @@ -1,13 +1,16 @@ package buttondevteam.chat.components.formatter.formatting; import buttondevteam.chat.commands.ucmds.admin.DebugCommand; +import lombok.ToString; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; +@ToString public class StringMatchProvider extends MatchProviderBase { private final String[] strings; + @ToString.Exclude private final FormatSettings settings; private int nextIndex = 0; diff --git a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java index 8b39810..a119584 100644 --- a/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java +++ b/src/test/java/buttondevteam/chat/components/formatter/ChatFormatIT.java @@ -5,11 +5,9 @@ import buttondevteam.chat.ObjectTestRunner; import buttondevteam.chat.ObjectTestRunner.Objects; import buttondevteam.chat.PluginMain; import buttondevteam.chat.commands.ucmds.admin.DebugCommand; -import buttondevteam.chat.components.formatter.formatting.ChatFormatter; -import buttondevteam.chat.components.formatter.formatting.TellrawEvent; +import buttondevteam.chat.components.formatter.formatting.*; import buttondevteam.chat.components.formatter.formatting.TellrawEvent.ClickAction; import buttondevteam.chat.components.formatter.formatting.TellrawEvent.HoverAction; -import buttondevteam.chat.components.formatter.formatting.TellrawPart; import buttondevteam.core.TestPrepare; import buttondevteam.core.component.channel.Channel; import buttondevteam.lib.chat.Color; @@ -109,12 +107,12 @@ public class ChatFormatIT { @Test public void testMessage() { - ArrayList cfs = ChatProcessing.addFormatters(Color.White, p -> true, null); + ArrayList cfs = ChatProcessing.addFormatters(p -> true, null); final String chid = ChatProcessing.getChannelID(Channel.GlobalChat, ChatUtils.MCORIGIN); if (rainbowMode) ChatProcessing.createRPC(Color.White, cfs); final TellrawPart tp = ChatProcessing.createTellraw(sender, message, null, null, null, chid, ChatUtils.MCORIGIN); - ChatFormatter.Combine(cfs, message, tp, null); + ChatFormatter.Combine(cfs, message, tp, null, FormatSettings.builder().color(Color.White).build()); System.out.println("Testing: " + message); // System.out.println(ChatProcessing.toJson(tp)); final TellrawPart expectedtp = ChatProcessing.createTellraw(sender, message, null, null, null, chid, ChatUtils.MCORIGIN);