diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index ff81da4..6f3b82c 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -18,9 +18,7 @@ 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.MatchResult; import java.util.regex.Pattern; public final class DPUtils { @@ -65,11 +63,19 @@ public final class DPUtils { while (matcher.find()) ts.add(new int[]{matcher.start(), matcher.end()}); matcher = FORMAT_PATTERN.matcher(message); - Function aFunctionalInterface = result -> + /*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 + return matcher.replaceAll(aFunctionalInterface); //Find nearest URL match and if it's not reaching to the char then escape*/ + StringBuffer sb = new StringBuffer(); + while (matcher.find()) { + matcher.appendReplacement(sb, Optional.ofNullable(ts.floor(new int[]{matcher.start(), 0})) //Find a URL start <= our start + .map(a -> a[1]).orElse(-1) < matcher.start() //Check if URL end < our start + ? "\\\\" + matcher.group() : matcher.group()); + } + matcher.appendTail(sb); + return sb.toString(); + } public static Logger getLogger() { if (DiscordPlugin.plugin == null || DiscordPlugin.plugin.getLogger() == null) @@ -77,8 +83,8 @@ public final class DPUtils { return DiscordPlugin.plugin.getLogger(); } - public static ReadOnlyConfigData> channelData(IHaveConfig config, String key, long defID) { - return config.getReadOnlyDataPrimDef(key, defID, id -> getMessageChannel(key, Snowflake.of((Long) id)), ch -> defID); //We can afford to search for the channel in the cache once (instead of using mainServer) + public static ReadOnlyConfigData> channelData(IHaveConfig config, String key) { + return config.getReadOnlyDataPrimDef(key, 0L, id -> getMessageChannel(key, Snowflake.of((Long) id)), ch -> 0L); //We can afford to search for the channel in the cache once (instead of using mainServer) } public static ReadOnlyConfigData> roleData(IHaveConfig config, String key, String defName) { @@ -169,7 +175,15 @@ public final class DPUtils { return "<#" + channelId.asString() + ">"; } + /** + * Gets a message channel for a config. Returns empty for ID 0. + * + * @param key The config key + * @param id The channel ID + * @return A message channel + */ public static Mono getMessageChannel(String key, Snowflake id) { + if (id.asLong() == 0L) return Mono.empty(); return DiscordPlugin.dc.getChannelById(id).onErrorResume(e -> { getLogger().warning("Failed to get channel data for " + key + "=" + id + " - " + e.getMessage()); return Mono.empty(); diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 3c4bc68..11d9f29 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -201,7 +201,7 @@ public class DiscordPlugin extends ButtonPlugin { "Won't load because we're in testing mode and not using a separate account.", new Exception( "The plugin refuses to load until you change the token to a testing account. (The account needs to have \"test\" in its name.)" - + "\nYou can disable test mode in ThorpeCore config.")); + + "\nYou can disable test mode in ChromaCore config.")); Bukkit.getPluginManager().disablePlugin(this); } TBMCCoreAPI.SendUnsentExceptions(); diff --git a/src/main/java/buttondevteam/discordplugin/announcer/AnnouncerModule.java b/src/main/java/buttondevteam/discordplugin/announcer/AnnouncerModule.java index 11250a8..5a28ece 100644 --- a/src/main/java/buttondevteam/discordplugin/announcer/AnnouncerModule.java +++ b/src/main/java/buttondevteam/discordplugin/announcer/AnnouncerModule.java @@ -26,14 +26,14 @@ public class AnnouncerModule extends Component { * Channel to post new posts. */ public ReadOnlyConfigData> channel() { - return DPUtils.channelData(getConfig(), "channel", 239519012529111040L); + return DPUtils.channelData(getConfig(), "channel"); } /** * Channel where distinguished (moderator) posts go. */ public ReadOnlyConfigData> modChannel() { - return DPUtils.channelData(getConfig(), "modChannel", 239519012529111040L); + return DPUtils.channelData(getConfig(), "modChannel"); } /** diff --git a/src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java b/src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java index 17d029a..bfb3048 100755 --- a/src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java +++ b/src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java @@ -85,7 +85,7 @@ public class ExceptionListenerModule extends Component implements } private ReadOnlyConfigData> channel() { - return DPUtils.channelData(getConfig(), "channel", 239519012529111040L); + return DPUtils.channelData(getConfig(), "channel"); } private ConfigData> pingRole(Mono guild) { diff --git a/src/main/java/buttondevteam/discordplugin/fun/FunModule.java b/src/main/java/buttondevteam/discordplugin/fun/FunModule.java index fa5e7d3..2ec9e2b 100644 --- a/src/main/java/buttondevteam/discordplugin/fun/FunModule.java +++ b/src/main/java/buttondevteam/discordplugin/fun/FunModule.java @@ -125,7 +125,7 @@ public class FunModule extends Component implements Listener { private ReadOnlyConfigData> fullHouseChannel() { - return DPUtils.channelData(getConfig(), "fullHouseChannel", 219626707458457603L); + return DPUtils.channelData(getConfig(), "fullHouseChannel"); } private static long lasttime = 0; diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java index 52cc604..2487f30 100755 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java @@ -84,13 +84,14 @@ public class MCChatListener implements Listener { final Consumer embed = ecs -> { ecs.setDescription(e.getMessage()).setColor(new Color(color.getRed(), color.getGreen(), color.getBlue())); + String url = module.profileURL().get(); if (e.getSender() instanceof Player) DPUtils.embedWithHead(ecs, authorPlayer, e.getSender().getName(), - "https://tbmcplugins.github.io/profile.html?type=minecraft&id=" - + ((Player) e.getSender()).getUniqueId()); + url.length() > 0 ? url + "?type=minecraft&id=" + + ((Player) e.getSender()).getUniqueId() : null); else if (e.getSender() instanceof DiscordSenderBase) - ecs.setAuthor(authorPlayer, "https://tbmcplugins.github.io/profile.html?type=discord&id=" // TODO: Constant/method to get URLs like this - + ((DiscordSenderBase) e.getSender()).getUser().getId().asString(), + ecs.setAuthor(authorPlayer, url.length() > 0 ? url + "?type=discord&id=" + + ((DiscordSenderBase) e.getSender()).getUser().getId().asString() : null, ((DiscordSenderBase) e.getSender()).getUser().getAvatarUrl()); else DPUtils.embedWithHead(ecs, authorPlayer, e.getSender().getName(), null); diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java b/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java index 4862c6a..eacf823 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MinecraftChatModule.java @@ -58,7 +58,7 @@ public class MinecraftChatModule extends Component { * The channel where the plugin can log when it mutes a player on Discord because of a Minecraft mute */ public ReadOnlyConfigData> modlogChannel() { - return DPUtils.channelData(getConfig(), "modlogChannel", 283840717275791360L); + return DPUtils.channelData(getConfig(), "modlogChannel"); } /** @@ -104,6 +104,13 @@ public class MinecraftChatModule extends Component { return getConfig().getData("allowPrivateChat", true); } + /** + * If set, message authors appearing on Discord will link to this URL. A 'type' and 'id' parameter will be added with the user's platform (Discord, Minecraft, ...) and ID. + */ + public ConfigData profileURL() { + return getConfig().getData("profileURL", ""); + } + @Override protected void enable() { if (DPUtils.disableIfConfigErrorRes(this, chatChannel(), chatChannelMono())) diff --git a/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.java b/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.java index babb47c..e4713b7 100644 --- a/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.java +++ b/src/main/java/buttondevteam/discordplugin/role/GameRoleModule.java @@ -36,7 +36,7 @@ public class GameRoleModule extends Component { } private ReadOnlyConfigData> logChannel() { - return DPUtils.channelData(getConfig(), "logChannel", 239519012529111040L); + return DPUtils.channelData(getConfig(), "logChannel"); } public static void handleRoleEvent(RoleEvent roleEvent) {