From bfeaa76e3ed2df1527b6a781a0c573635f0d5898 Mon Sep 17 00:00:00 2001 From: cnaude Date: Sat, 28 Nov 2015 22:18:49 -0700 Subject: [PATCH] Log tailer enhancements. --- dependency-reduced-pom.xml | 18 +++++-- .../java/com/cnaude/purpleirc/LogTailer.java | 34 ++++++++++--- .../java/com/cnaude/purpleirc/PurpleBot.java | 49 ++++++++++++++----- .../java/com/cnaude/purpleirc/PurpleIRC.java | 2 +- .../com/cnaude/purpleirc/TemplateName.java | 2 + .../purpleirc/Utilities/ChatTokenizer.java | 6 +++ src/main/resources/SampleBot.yml | 1 + src/main/resources/config.yml | 2 + 8 files changed, 90 insertions(+), 24 deletions(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 98eef01..3273e90 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -141,16 +141,28 @@ 1.8.4 provided + + commons-io + commons-io + 2.4 + compile + com.google.guava guava - 17.0 + 18.0 + compile + + + com.cnaude.nplugins + ntheendagain + 0.6.10-SNAPSHOT compile com.cnaude.essentials essentials - 2.14 + 2.14.1.3 compile @@ -176,7 +188,7 @@ net.milkbowl.vault Vault - 1.5.3 + 1.5.6 compile diff --git a/src/main/java/com/cnaude/purpleirc/LogTailer.java b/src/main/java/com/cnaude/purpleirc/LogTailer.java index d2049a8..36bd0b9 100644 --- a/src/main/java/com/cnaude/purpleirc/LogTailer.java +++ b/src/main/java/com/cnaude/purpleirc/LogTailer.java @@ -20,6 +20,7 @@ import java.io.File; import org.apache.commons.io.input.Tailer; import org.apache.commons.io.input.TailerListener; import org.apache.commons.io.input.TailerListenerAdapter; +import org.pircbotx.Channel; /** * @@ -76,10 +77,31 @@ public class LogTailer { @Override public void handle(String line) { - if (ctcp) { - blockingCTCPMessage(target, line); + boolean okayToSend = false; + if (target.startsWith("#")) { + try { + for (Channel channel : ircBot.bot.getUserBot().getChannels()) { + if (channel.getName().equalsIgnoreCase(target)) { + okayToSend = true; + break; + } + } + } catch (Exception ex) { + plugin.logDebug(ex.getMessage()); + } } else { - blockingIRCMessage(target, line); + okayToSend = true; + } + if (okayToSend) { + String template = plugin.getMsgTemplate(ircBot.botNick, target, TemplateName.LOG_TAILER); + String message = plugin.tokenizer.logTailerTokenizer(file.getName(), line, template); + if (ctcp) { + blockingCTCPMessage(target, message); + } else { + blockingIRCMessage(target, message); + } + } else { + plugin.logDebug("[MyTailerListener] Can't send to " + target + " yet."); } } @@ -89,23 +111,19 @@ public class LogTailer { if (!ircBot.isConnected()) { return; } - plugin.logDebug("[blockingIRCMessage] About to send IRC message to " + target + ": " + message); ircBot.bot.sendIRC().message(target, message); - plugin.logDebug("[blockingIRCMessage] Message sent to " + target + ": " + message); } private void blockingCTCPMessage(final String target, final String message) { if (!ircBot.isConnected()) { return; } - plugin.logDebug("[blockingCTCPMessage] About to send IRC message to " + target + ": " + message); ircBot.bot.sendIRC().ctcpResponse(target, message); - plugin.logDebug("[blockingCTCPMessage] Message sent to " + target + ": " + message); } protected void stopTailer() { if (tailer != null) { - plugin.logInfo("Stoping tailer."); + plugin.logInfo("Stopping tailer."); tailer.stop(); } } diff --git a/src/main/java/com/cnaude/purpleirc/PurpleBot.java b/src/main/java/com/cnaude/purpleirc/PurpleBot.java index 30cb8e6..803ab01 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleBot.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleBot.java @@ -59,7 +59,6 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import me.botsko.prism.actionlibs.QueryParameters; import me.botsko.prism.events.BlockStateChange; -import org.apache.commons.io.input.Tailer; import org.bukkit.Achievement; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -189,9 +188,9 @@ public final class PurpleBot { public CaseInsensitiveMap linkRequests; public CaseInsensitiveMap> remotePlayers; public CaseInsensitiveMap> remoteServerInfo; - private LogTailer tailer; + private final List tailers; private boolean tailerEnabled; - private String tailerFile; + private final List tailerFiles; private String tailerRecipient; private boolean tailerCtcp; /** @@ -262,6 +261,8 @@ public final class PurpleBot { this.remotePlayers = new CaseInsensitiveMap<>(); this.remoteServerInfo = new CaseInsensitiveMap<>(); this.ircPrivateMsgMap = new CaseInsensitiveMap<>(); + this.tailers = new ArrayList<>(); + this.tailerFiles = new ArrayList<>(); config = new YamlConfiguration(); goodBot = loadConfig(); if (goodBot) { @@ -286,8 +287,10 @@ public final class PurpleBot { } public void buildBot(boolean reload) { - if (tailer != null) { - tailer.stopTailer(); + if (!tailers.isEmpty()) { + for (LogTailer tailer : tailers) { + tailer.stopTailer(); + } } Configuration.Builder configBuilder = new Configuration.Builder() .setName(botNick) @@ -368,14 +371,22 @@ public final class PurpleBot { plugin.logInfo("Auto-connect is disabled. To connect: /irc connect " + bot.getNick()); } plugin.logDebug("Max line length: " + configBuilder.getMaxLineLength()); - if (tailerEnabled && !tailerFile.isEmpty() && !tailerRecipient.isEmpty()) { - tailer = new LogTailer(this, plugin, tailerRecipient, tailerCtcp, tailerFile); + if (tailerEnabled && !tailerFiles.isEmpty() && !tailerRecipient.isEmpty()) { + for (String tailerFile : tailerFiles) { + LogTailer tailer = new LogTailer(this, plugin, tailerRecipient, tailerCtcp, tailerFile); + tailers.add(tailer); + } } } - protected void stopTailer() { - if (tailer != null) { - tailer.stopTailer(); + protected void stopTailers() { + if (!tailers.isEmpty()) { + for (LogTailer tailer : tailers) { + if (tailer != null) { + tailer.stopTailer(); + } + } + tailers.clear(); } } @@ -802,7 +813,21 @@ public final class PurpleBot { // load tailer settings tailerEnabled = config.getBoolean("file-tailer.enabled", false); - tailerFile = config.getString("file-tailer.file", "server.log"); + + String tailerFile = config.getString("file-tailer.file", "server.log"); + if (!tailerFiles.contains(tailerFile)) { + tailerFiles.add(tailerFile); + plugin.logDebug(" Tailer File => " + tailerFile); + } + for (String f : config.getStringList("file-tailer.extra_files")) { + if (!tailerFiles.contains(f)) { + tailerFiles.add(f); + } + plugin.logDebug(" Tailer File => " + f); + } + if (tailerFiles.isEmpty()) { + plugin.logInfo(" No command recipients defined."); + } tailerRecipient = config.getString("file-tailer.recipient", ""); tailerCtcp = config.getBoolean("file-tailer.ctcp", false); @@ -2826,7 +2851,7 @@ public final class PurpleBot { asyncIRCMessage(target, "No message specified."); } } - + /** * Send chat messages from IRC to player. * diff --git a/src/main/java/com/cnaude/purpleirc/PurpleIRC.java b/src/main/java/com/cnaude/purpleirc/PurpleIRC.java index 8a143c3..6202489 100644 --- a/src/main/java/com/cnaude/purpleirc/PurpleIRC.java +++ b/src/main/java/com/cnaude/purpleirc/PurpleIRC.java @@ -348,7 +348,7 @@ public class PurpleIRC extends JavaPlugin { logInfo("Disconnecting IRC bots."); for (PurpleBot ircBot : ircBots.values()) { commandQueue.cancel(); - ircBot.stopTailer(); + ircBot.stopTailers(); ircBot.saveConfig(getServer().getConsoleSender()); ircBot.quit(); } diff --git a/src/main/java/com/cnaude/purpleirc/TemplateName.java b/src/main/java/com/cnaude/purpleirc/TemplateName.java index fc27473..291d729 100644 --- a/src/main/java/com/cnaude/purpleirc/TemplateName.java +++ b/src/main/java/com/cnaude/purpleirc/TemplateName.java @@ -146,5 +146,7 @@ public class TemplateName { public final static String NTHE_END_AGAIN_HARD = "ntheendagain-hard"; public final static String NTHE_END_AGAIN_SOFT = "ntheendagain-soft"; public final static String NTHE_END_AGAIN_CRYSTAL = "ntheendagain-crystal"; + + public final static String LOG_TAILER = "log-tailer"; } diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java b/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java index b29ff1e..c2638cb 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/ChatTokenizer.java @@ -884,4 +884,10 @@ public class ChatTokenizer { .replace("%TARGET%", targetPlayer.getName()) .replace("%MESSAGE%", message); } + + public String logTailerTokenizer(String file, String line, String template) { + return plugin.colorConverter.ircColorsToGame(template + .replace("%FILE%", file) + .replace("%LINE%", line)); + } } diff --git a/src/main/resources/SampleBot.yml b/src/main/resources/SampleBot.yml index 746acda..c63c251 100644 --- a/src/main/resources/SampleBot.yml +++ b/src/main/resources/SampleBot.yml @@ -70,6 +70,7 @@ command-notify: file-tailer: enabled: false file: 'server.log' + extra_files: [] recipient: '#minecraft-test' ctcp: false # Messaging flood control (game and IRC) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bbf7650..aa65c95 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -233,6 +233,8 @@ message-format: # Flood control game-flood-warning: '&3Message not sent to IRC due to spamming. &rCooldown: %COOLDOWN%s' irc-flood-warning: '&3Message not sent to game due to spamming. &rCooldown: %COOLDOWN%s' + # Log tailer format + log-tailer: '[LOG: %FILE%] %LINE%' # Format for the @list command in IRC list-format: '[&9Minecraft&r] &2Online &r(%COUNT%/%MAX%): %PLAYERS%' list-separator: ', '