diff --git a/.idea/ButtonChat.iml b/.idea/ButtonChat.iml index 215cb7a..aa60b82 100644 --- a/.idea/ButtonChat.iml +++ b/.idea/ButtonChat.iml @@ -50,5 +50,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 e099775..6587cc2 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java +++ b/src/main/java/buttondevteam/chat/components/formatter/ChatProcessing.java @@ -6,10 +6,7 @@ import buttondevteam.chat.PluginMain; import buttondevteam.chat.VanillaUtils; import buttondevteam.chat.commands.ucmds.admin.DebugCommand; import buttondevteam.chat.components.chatonly.ChatOnlyComponent; -import buttondevteam.chat.components.formatter.formatting.ChatFormatter; -import buttondevteam.chat.components.formatter.formatting.TellrawEvent; -import buttondevteam.chat.components.formatter.formatting.TellrawPart; -import buttondevteam.chat.components.formatter.formatting.TellrawSerializer; +import buttondevteam.chat.components.formatter.formatting.*; import buttondevteam.chat.components.fun.FunComponent; import buttondevteam.chat.components.towny.TownyComponent; import buttondevteam.chat.listener.PlayerListener; @@ -63,55 +60,48 @@ public class ChatProcessing { private static final Pattern WORD_PATTERN = Pattern.compile("\\S+"); private static boolean pingedconsole = false; - /** - * A special range formatter that removes the effect of the next formatter - */ - public static final ChatFormatter ESCAPE_FORMATTER = ChatFormatter.builder("escape", ESCAPE_PATTERN).type(ChatFormatter.Type.Range).build(); - - private static ArrayList commonFormatters = Lists.newArrayList( - ChatFormatter.builder("bold", BOLD_PATTERN).bold(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) - .priority(Priority.High).build(), - ChatFormatter.builder("italic", ITALIC_PATTERN).italic(true).removeCharCount((short) 1).type(ChatFormatter.Type.Range).build(), - ChatFormatter.builder("italic2", ITALIC_PATTERN_2).italic(true).removeCharCount((short) 1).type(ChatFormatter.Type.Range).build(), - ChatFormatter.builder("underlined", UNDERLINED_PATTERN).underlined(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) - .build(), - ChatFormatter.builder("strikethrough", STRIKETHROUGH_PATTERN).strikethrough(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) - .build(), - ChatFormatter.builder("spoiler", SPOILER_PATTERN).obfuscated(true).removeCharCount((short) 2).type(ChatFormatter.Type.Range) + private static ArrayList commonFormatters = Lists.newArrayList( + new RangeMatchProvider("bold", "**", FormatSettings.builder().bold(true).build()), + new RangeMatchProvider("italic", "*", FormatSettings.builder().italic(true).build()), + new RangeMatchProvider("italic2", "_", FormatSettings.builder().italic(true).build()), + new RangeMatchProvider("underlined", "__", FormatSettings.builder().underlined(true).build()), + new RangeMatchProvider("strikethrough", "~~", FormatSettings.builder().strikethrough(true).build()), + new RangeMatchProvider("spoiler", "||", FormatSettings.builder().obfuscated(true) .onmatch((match, cf, fs) -> { cf.setHoverText(match); return match; - }).build(), - ESCAPE_FORMATTER, ChatFormatter.builder("nullMention", NULL_MENTION_PATTERN).color(Color.DarkRed).build(), // Properly added a bug as a feature - ChatFormatter.builder("consolePing", CONSOLE_PING_PATTERN).color(Color.Aqua).onmatch((match, builder, section) -> { - if (!pingedconsole) { - System.out.print("\007"); - pingedconsole = true; // Will set it to false in ProcessChat - } - return match; - }).priority(Priority.High).build(), + }).build()), + new StringMatchProvider("nullMention", FormatSettings.builder().color(Color.DarkRed).build(), "null"), // Properly added a bug as a feature + new StringMatchProvider("consolePing", FormatSettings.builder().color(Color.Aqua) + .onmatch((match, builder, section) -> { + if (!pingedconsole) { + System.out.print("\007"); + pingedconsole = true; // Will set it to false in ProcessChat + } + return match; + }).build(), "@console"), - ChatFormatter.builder("hashtag", HASHTAG_PATTERN).color(Color.Blue).openlink("https://twitter.com/hashtag/$1") - .priority(Priority.High).build(), - ChatFormatter.builder("cyan", CYAN_PATTERN).color(Color.Aqua).build(), // #55 - ChatFormatter.builder("code", CODE_PATTERN).color(Color.DarkGray).removeCharCount((short) 1).type(ChatFormatter.Type.Range) - .build(), - ChatFormatter.builder("maskedLink", MASKED_LINK_PATTERN).underlined(true).onmatch((match, builder, section) -> { - String text, link; - if (section.Matches.size() < 2 || (text = section.Matches.get(0)).length() == 0 || (link = section.Matches.get(1)).length() == 0) - return ""; - builder.setOpenlink(link); - return text; - }).type(ChatFormatter.Type.Excluder).build(), - ChatFormatter.builder("url", URL_PATTERN).underlined(true).openlink("$1").type(ChatFormatter.Type.Excluder).build(), - ChatFormatter.builder("someone", SOMEONE_PATTERN).color(Color.Aqua).onmatch((match, builder, section) -> { - if (Bukkit.getOnlinePlayers().size() == 0) return match; - var players = ImmutableList.copyOf(Bukkit.getOnlinePlayers()); - var playerC = new Random().nextInt(players.size()); - var player = players.get(playerC); - playPingSound(player, ComponentManager.getIfEnabled(FormatterComponent.class)); - return "@someone (" + player.getDisplayName() + "§r)"; - }).build()); + new RegexMatchProvider("hashtag", HASHTAG_PATTERN, FormatSettings.builder().color(Color.Blue).openlink("https://twitter.com/hashtag/$1").build()), + new StringMatchProvider("cyan", FormatSettings.builder().color(Color.Aqua).build(), "cyan"), // #55 + new RangeMatchProvider("code", "`", FormatSettings.builder().color(Color.DarkGray).build()), + new RegexMatchProvider("maskedLink", MASKED_LINK_PATTERN, FormatSettings.builder().underlined(true) + .onmatch((match, builder, section) -> { + String text, link; + if (section.Matches.size() < 2 || (text = section.Matches.get(0)).length() == 0 || (link = section.Matches.get(1)).length() == 0) + return ""; + builder.setOpenlink(link); + return text; + }).build()), + new RegexMatchProvider("url", URL_PATTERN, FormatSettings.builder().underlined(true).openlink("$1").build()), + new StringMatchProvider("someone", FormatSettings.builder().color(Color.Aqua) + .onmatch((match, builder, section) -> { + if (Bukkit.getOnlinePlayers().size() == 0) return match; + var players = ImmutableList.copyOf(Bukkit.getOnlinePlayers()); + var playerC = new Random().nextInt(players.size()); + var player = players.get(playerC); + playPingSound(player, ComponentManager.getIfEnabled(FormatterComponent.class)); + return "@someone (" + player.getDisplayName() + "§r)"; + }).build())); private static Gson gson = new GsonBuilder() .registerTypeHierarchyAdapter(TellrawSerializableEnum.class, new TellrawSerializer.TwEnum()) .registerTypeHierarchyAdapter(Collection.class, new TellrawSerializer.TwCollection()) @@ -157,7 +147,7 @@ public class ChatProcessing { colormode = Color.Green; // If greentext, ignore channel or player colors - ArrayList formatters; + ArrayList formatters; if (component.allowFormatting().get()) { formatters = addFormatters(colormode, e::shouldSendTo, component); if (colormode == channel.Color().get() && mp != null && mp.RainbowPresserColorMode) { // Only overwrite channel color @@ -165,8 +155,7 @@ public class ChatProcessing { } pingedconsole = false; // Will set it to true onmatch (static constructor) } else - formatters = Lists.newArrayList(ChatFormatter.builder("entireMessage", ENTIRE_MESSAGE_PATTERN) - .color(Color.White).priority(Priority.Low).build()); //This formatter is necessary + formatters = Lists.newArrayList(); TellrawPart json = createTellraw(sender, message, player, mp, e.getUser(), channelidentifier, e.getOrigin()); long combinetime = System.nanoTime(); @@ -266,31 +255,19 @@ public class ChatProcessing { + "]"; } - static ArrayList addFormatters(Color colormode, Predicate canSee, @Nullable FormatterComponent component) { + static ArrayList addFormatters(Color colormode, Predicate canSee, @Nullable FormatterComponent component) { @SuppressWarnings("unchecked") - ArrayList formatters = (ArrayList) commonFormatters.clone(); - - formatters.add( - ChatFormatter.builder("entireMessage", ENTIRE_MESSAGE_PATTERN).color(colormode).priority(Priority.Low).build()); + ArrayList formatters = (ArrayList) commonFormatters.clone(); boolean nottest; //Not assigning a default value, so that it can only be used in the if if ((nottest = Bukkit.getOnlinePlayers().size() > 0) || Bukkit.getVersion().equals("test")) { - StringBuilder namesb = new StringBuilder("(?i)("); - boolean addNameFormatter = false; //Needed because some names may be filtered out if they can't see the channel + String[] names; if (nottest) - for (Player p : Bukkit.getOnlinePlayers()) { - if (canSee.test(p)) { - namesb.append(p.getName()).append("|"); - addNameFormatter = true; - } - } + names = Bukkit.getOnlinePlayers().stream().filter(canSee).map(CommandSender::getName).toArray(String[]::new); else { - for (String testPlayer : testPlayers) - namesb.append(testPlayer).append("|"); - addNameFormatter = true; + names = new String[testPlayers.length]; + System.arraycopy(testPlayers, 0, names, 0, testPlayers.length); } - namesb.deleteCharAt(namesb.length() - 1); - namesb.append(")"); StringBuilder nicksb = new StringBuilder("(?i)("); boolean addNickFormatter = false; for (Player p : Bukkit.getOnlinePlayers()) { @@ -311,7 +288,7 @@ public class ChatProcessing { System.out.println(message); }; - if (addNameFormatter) + if (names.length > 0) formatters.add(ChatFormatter.builder("name", Pattern.compile(namesb.toString())).color(Color.Aqua) .onmatch((match, builder, section) -> { Player p = Bukkit.getPlayer(match); 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 104cb23..ffffd68 100644 --- a/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java +++ b/src/main/java/buttondevteam/chat/components/formatter/formatting/ChatFormatter.java @@ -3,8 +3,6 @@ package buttondevteam.chat.components.formatter.formatting; import buttondevteam.chat.commands.ucmds.admin.DebugCommand; import buttondevteam.lib.architecture.IHaveConfig; import buttondevteam.lib.chat.Color; -import lombok.Builder; -import lombok.Data; import lombok.val; import java.util.*; @@ -17,9 +15,7 @@ import java.util.stream.Collectors; * again. * * @author NorbiPeti - */ -@Data -@Builder + */ //TODO: Update doc public final class ChatFormatter { private ChatFormatter() { } @@ -31,7 +27,7 @@ public final class ChatFormatter { public static void Combine(List formatters, String str, TellrawPart tp, IHaveConfig config) { /* - * This method assumes that there is always a global formatter + * A global formatter is no longer needed */ header("ChatFormatter.Combine begin"); ArrayList sections = new ArrayList<>(); @@ -57,7 +53,7 @@ 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())); + 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)