From 02f60c2162ae81ec39c1aa0e5ffba86c1f1e47c7 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Thu, 7 Nov 2019 00:20:57 +0100 Subject: [PATCH] Fix client ID race condition, attempt to fix URL escaping --- .../buttondevteam/discordplugin/DPUtils.java | 23 ++++++++++++++++--- .../mcchat/ChannelconCommand.java | 2 +- .../mcchat/MinecraftChatModule.java | 5 ++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index 84d2ced..ff81da4 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -15,11 +15,19 @@ import lombok.val; import reactor.core.publisher.Mono; import javax.annotation.Nullable; +import java.util.Comparator; +import java.util.Optional; +import java.util.TreeSet; +import java.util.function.Function; import java.util.logging.Logger; -import java.util.regex.Matcher; +import java.util.regex.MatchResult; +import java.util.regex.Pattern; public final class DPUtils { + public static final Pattern URL_PATTERN = Pattern.compile("https?://\\S*"); + public static final Pattern FORMAT_PATTERN = Pattern.compile("[*_~]"); + public static EmbedCreateSpec embedWithHead(EmbedCreateSpec ecs, String displayname, String playername, String profileUrl) { return ecs.setAuthor(displayname, profileUrl, "https://minotar.net/avatar/" + playername + "/32.png"); } @@ -51,8 +59,17 @@ public final class DPUtils { } private static String escape(String message) { - return message.replaceAll("([*_~])", Matcher.quoteReplacement("\\") + "$1"); - } + //var ts = new TreeSet<>(); + var ts = new TreeSet(Comparator.comparingInt(a -> a[0])); //Compare the start, then check the end + var matcher = URL_PATTERN.matcher(message); + while (matcher.find()) + ts.add(new int[]{matcher.start(), matcher.end()}); + matcher = FORMAT_PATTERN.matcher(message); + Function aFunctionalInterface = result -> + Optional.ofNullable(ts.floor(new int[]{result.start(), 0})).map(a -> a[1]).orElse(0) < result.start() + ? "\\\\" + result.group() : result.group(); + return matcher.replaceAll(aFunctionalInterface); //Find nearest URL match and if it's not reaching to the char then escape + } //TODO: Java 11 method overload, not present in Java 8 public static Logger getLogger() { if (DiscordPlugin.plugin == null || DiscordPlugin.plugin.getLogger() == null) diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/mcchat/ChannelconCommand.java index be1d284..38a0229 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/ChannelconCommand.java @@ -155,7 +155,7 @@ public class ChannelconCommand extends ICommand2DC { "Use the ID (command) of the channel, for example `g` for the global chat.", // "To remove a connection use @ChromaBot channelcon remove in the channel.", // "Mentioning the bot is needed in this case because the " + DiscordPlugin.getPrefix() + " prefix only works in " + DPUtils.botmention() + ".", // - "Invite link: " + "Invite link: " }; } } diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java b/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java index b4586e1..4862c6a 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java @@ -104,13 +104,12 @@ public class MinecraftChatModule extends Component { return getConfig().getData("allowPrivateChat", true); } - String clientID; - @Override protected void enable() { if (DPUtils.disableIfConfigErrorRes(this, chatChannel(), chatChannelMono())) return; - DiscordPlugin.dc.getApplicationInfo().subscribe(info -> clientID = info.getId().asString()); + /*clientID = DiscordPlugin.dc.getApplicationInfo().blockOptional().map(info->info.getId().asString()) + .orElse("Unknown"); //Need to block because otherwise it may not be set in time*/ listener = new MCChatListener(this); TBMCCoreAPI.RegisterEventsForExceptions(listener, getPlugin()); TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(this), getPlugin());//These get undone if restarting/resetting - it will ignore events if disabled