diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index e06d5dbc1..18b9c702d 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import java.io.File; import java.text.MessageFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,10 +31,11 @@ public class DiscordSettings implements IConf { private OnlineStatus status; private Activity statusActivity; - private Pattern discordFilter; + private List discordFilter; private MessageFormat consoleFormat; private Level consoleLogLevel; + private List consoleFilter; private MessageFormat discordToMcFormat; private MessageFormat tempMuteFormat; @@ -109,7 +111,7 @@ public class DiscordSettings implements IConf { return config.getBoolean("chat.filter-newlines", true); } - public Pattern getDiscordFilter() { + public List getDiscordFilters() { return discordFilter; } @@ -153,6 +155,10 @@ public class DiscordSettings implements IConf { return consoleLogLevel; } + public List getConsoleFilters() { + return consoleFilter; + } + public boolean isShowAvatar() { return config.getBoolean("show-avatar", false); } @@ -388,20 +394,60 @@ public class DiscordSettings implements IConf { statusActivity = Activity.of(activityType, config.getString("presence.message", "Minecraft")); } - final String filter = config.getString("chat.discord-filter", null); - if (filter != null && !filter.trim().isEmpty()) { + if (config.isList("chat.discord-filter")) { + final List filters = new ArrayList<>(); + for (final String chatFilterString : config.getList("chat.discord-filter", String.class)) { + if (chatFilterString != null && !chatFilterString.trim().isEmpty()) { + try { + filters.add(Pattern.compile(chatFilterString)); + } catch (PatternSyntaxException e) { + plugin.getLogger().log(java.util.logging.Level.WARNING, "Invalid pattern for \"chat.discord-filter\": " + e.getMessage()); + } + } + } + discordFilter = Collections.unmodifiableList(filters); + } else { try { - discordFilter = Pattern.compile(filter); + final String chatFilter = config.getString("chat.discord-filter", null); + if (chatFilter != null && !chatFilter.trim().isEmpty()) { + discordFilter = Collections.singletonList(Pattern.compile(chatFilter)); + } else { + discordFilter = Collections.emptyList(); + } } catch (PatternSyntaxException e) { plugin.getLogger().log(java.util.logging.Level.WARNING, "Invalid pattern for \"chat.discord-filter\": " + e.getMessage()); - discordFilter = null; + discordFilter = Collections.emptyList(); } - } else { - discordFilter = null; } consoleLogLevel = Level.toLevel(config.getString("console.log-level", null), Level.INFO); + if (config.isList("console.console-filter")) { + final List filters = new ArrayList<>(); + for (final String filterString : config.getList("console.console-filter", String.class)) { + if (filterString != null && !filterString.trim().isEmpty()) { + try { + filters.add(Pattern.compile(filterString)); + } catch (PatternSyntaxException e) { + plugin.getLogger().log(java.util.logging.Level.WARNING, "Invalid pattern for \"console.log-level\": " + e.getMessage()); + } + } + } + consoleFilter = Collections.unmodifiableList(filters); + } else { + try { + final String cFilter = config.getString("console.console-filter", null); + if (cFilter != null && !cFilter.trim().isEmpty()) { + consoleFilter = Collections.singletonList(Pattern.compile(cFilter)); + } else { + consoleFilter = Collections.emptyList(); + } + } catch (PatternSyntaxException e) { + plugin.getLogger().log(java.util.logging.Level.WARNING, "Invalid pattern for \"console.log-level\": " + e.getMessage()); + consoleFilter = Collections.emptyList(); + } + } + consoleFormat = generateMessageFormat(getFormatString(".console.format"), "[{timestamp} {level}] {message}", false, "timestamp", "level", "message"); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java index f544553be..cdb374697 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/DiscordListener.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; public class DiscordListener extends ListenerAdapter { private final static Logger logger = Logger.getLogger("EssentialsDiscord"); @@ -51,11 +52,15 @@ public class DiscordListener extends ListenerAdapter { final String effectiveName = member == null ? event.getAuthor().getName() : member.getEffectiveName(); final Message message = event.getMessage(); - if (plugin.getSettings().getDiscordFilter() != null && plugin.getSettings().getDiscordFilter().matcher(message.getContentDisplay()).find()) { - if (plugin.isDebug()) { - logger.log(Level.INFO, "Skipping message " + message.getId() + " with content, \"" + message.getContentDisplay() + "\" as it matched the filter!"); + if (!plugin.getSettings().getDiscordFilters().isEmpty()) { + for (final Pattern pattern : plugin.getSettings().getDiscordFilters()) { + if (pattern.matcher(message.getContentDisplay()).find()) { + if (plugin.isDebug()) { + logger.log(Level.INFO, "Skipping message " + message.getId() + " with content, \"" + message.getContentDisplay() + "\" as it matched the filter!"); + } + return; + } } - return; } final StringBuilder messageBuilder = new StringBuilder(message.getContentDisplay()); diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java index 6a668bdec..91cc5f464 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/util/ConsoleInjector.java @@ -15,6 +15,7 @@ import org.bukkit.Bukkit; import java.time.Instant; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.regex.Pattern; import static com.earth2me.essentials.I18n.tl; @@ -67,6 +68,14 @@ public class ConsoleInjector extends AbstractAppender { return; } + if (!jda.getSettings().getConsoleFilters().isEmpty()) { + for (final Pattern pattern : jda.getSettings().getConsoleFilters()) { + if (pattern.matcher(entry).find()) { + return; + } + } + } + final String loggerName = event.getLoggerName(); if (!loggerName.isEmpty() && !loggerName.contains(".")) { entry = "[" + event.getLoggerName() + "] " + entry; diff --git a/EssentialsDiscord/src/main/resources/config.yml b/EssentialsDiscord/src/main/resources/config.yml index f018d3128..7f998b673 100644 --- a/EssentialsDiscord/src/main/resources/config.yml +++ b/EssentialsDiscord/src/main/resources/config.yml @@ -100,6 +100,10 @@ console: # - debug # - trace log-level: info + # Blocks any console message from sending to Discord if it matches this regex pattern. + # This is useful if you want to ignore certain messages from the console. + # Can also be a list of regex patterns in addition to a single regex pattern. + console-filter: "" # Configure which Discord channels different messages will be sent to. # You can either use the names of the channels listed above or just the id of a channel.