From 3f90ebb5135cc5104bc6aabba27b578c56d52f20 Mon Sep 17 00:00:00 2001 From: mcmonkey4eva Date: Wed, 22 Jul 2015 15:40:15 -0700 Subject: [PATCH] add redirect_logging as a core feature --- .../aufdemrand/denizencore/DenizenCore.java | 3 + .../denizencore/DenizenImplementation.java | 8 ++- .../scripts/commands/CommandRegistry.java | 3 +- .../denizencore/tags/core/UtilTags.java | 31 +++++++++ .../utilities/debugging/LogInterceptor.java | 67 +++++++++++++++++++ 5 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizencore/utilities/debugging/LogInterceptor.java diff --git a/src/main/java/net/aufdemrand/denizencore/DenizenCore.java b/src/main/java/net/aufdemrand/denizencore/DenizenCore.java index 811750d2..48eb42cf 100644 --- a/src/main/java/net/aufdemrand/denizencore/DenizenCore.java +++ b/src/main/java/net/aufdemrand/denizencore/DenizenCore.java @@ -5,6 +5,7 @@ import net.aufdemrand.denizencore.scripts.ScriptHelper; import net.aufdemrand.denizencore.scripts.commands.CommandRegistry; import net.aufdemrand.denizencore.scripts.queues.ScriptEngine; +import net.aufdemrand.denizencore.utilities.debugging.LogInterceptor; import net.aufdemrand.denizencore.utilities.debugging.dB; import net.aufdemrand.denizencore.utilities.scheduling.Schedulable; @@ -36,6 +37,8 @@ public static ScriptEngine getScriptEngine() { return scriptEngine; } + public static LogInterceptor logInterceptor = new LogInterceptor(); + static { String version = "UNKNOWN"; try { diff --git a/src/main/java/net/aufdemrand/denizencore/DenizenImplementation.java b/src/main/java/net/aufdemrand/denizencore/DenizenImplementation.java index 27a6e318..c1d13a83 100644 --- a/src/main/java/net/aufdemrand/denizencore/DenizenImplementation.java +++ b/src/main/java/net/aufdemrand/denizencore/DenizenImplementation.java @@ -131,7 +131,11 @@ public interface DenizenImplementation { public abstract String getLastEntryFromFlag(String flag); - public TagContext getTagContext(ScriptEntry entry); + public abstract TagContext getTagContext(ScriptEntry entry); - public int getTagTimeout(); + public abstract int getTagTimeout(); + + public abstract boolean allowConsoleRedirection(); + + public abstract String cleanseLogString(String str); } diff --git a/src/main/java/net/aufdemrand/denizencore/scripts/commands/CommandRegistry.java b/src/main/java/net/aufdemrand/denizencore/scripts/commands/CommandRegistry.java index e1a1f2de..5fd55f81 100644 --- a/src/main/java/net/aufdemrand/denizencore/scripts/commands/CommandRegistry.java +++ b/src/main/java/net/aufdemrand/denizencore/scripts/commands/CommandRegistry.java @@ -10,6 +10,7 @@ import java.util.Map; public abstract class CommandRegistry implements dRegistry { + public CommandRegistry() { } @@ -19,7 +20,7 @@ public CommandRegistry() { @Override public boolean register(String commandName, RegistrationableInstance commandInstance) { this.instances.put(CoreUtilities.toLowerCase(commandName), (AbstractCommand) commandInstance); - this.classes.put(((AbstractCommand) commandInstance).getClass(), commandName.toUpperCase()); + this.classes.put(((AbstractCommand) commandInstance).getClass(), CoreUtilities.toLowerCase(commandName)); return true; } diff --git a/src/main/java/net/aufdemrand/denizencore/tags/core/UtilTags.java b/src/main/java/net/aufdemrand/denizencore/tags/core/UtilTags.java index 0f31aa6f..27efa3e6 100644 --- a/src/main/java/net/aufdemrand/denizencore/tags/core/UtilTags.java +++ b/src/main/java/net/aufdemrand/denizencore/tags/core/UtilTags.java @@ -1,7 +1,9 @@ package net.aufdemrand.denizencore.tags.core; +import net.aufdemrand.denizencore.DenizenCore; import net.aufdemrand.denizencore.objects.Duration; import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.objects.Mechanism; import net.aufdemrand.denizencore.objects.aH; import net.aufdemrand.denizencore.scripts.queues.ScriptQueue; import net.aufdemrand.denizencore.tags.Attribute; @@ -301,4 +303,33 @@ else if (attribute.startsWith("format") } } } + + + public static void adjustSystem(Mechanism mechanism) { + Element value = mechanism.getValue(); + + // <--[mechanism] + // @object server + // @name redirect_logging + // @input Element(Boolean) + // @description + // Tells the server to redirect logging to a world event or not. + // Note that this redirects *all console output* not just Denizen output. + // Note: don't enable /denizen debug -e while this is active. + // @tags + // None + // --> + if (mechanism.matches("redirect_logging") && mechanism.hasValue()) { + if (!DenizenCore.getImplementation().allowConsoleRedirection()) { + dB.echoError("Console redirection disabled by administrator."); + return; + } + if (mechanism.getValue().asBoolean()) { + DenizenCore.logInterceptor.redirectOutput(); + } + else { + DenizenCore.logInterceptor.standardOutput(); + } + } + } } diff --git a/src/main/java/net/aufdemrand/denizencore/utilities/debugging/LogInterceptor.java b/src/main/java/net/aufdemrand/denizencore/utilities/debugging/LogInterceptor.java new file mode 100644 index 00000000..43f7b7f8 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizencore/utilities/debugging/LogInterceptor.java @@ -0,0 +1,67 @@ +package net.aufdemrand.denizencore.utilities.debugging; + +import net.aufdemrand.denizencore.DenizenCore; +import net.aufdemrand.denizencore.events.OldEventManager; +import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.objects.dObject; + +import java.io.PrintStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + * Intercepts system.out operations for the sake of blocking messages at request. + * Disabled by default in config.yml + */ +public class LogInterceptor extends PrintStream { + boolean redirected = false; + public PrintStream standardOut; + + public LogInterceptor() { + super(System.out, true); + } + + // <--[event] + // @Events + // console output + // + // @Warning Disable debug on this event or you'll get an infinite loop! + // + // @Triggers when any message is printed to console. (Requires <@link mechanism system.redirect_logging> be set true.) + // @Context + // returns the messsage that is being printed to console. + // + // @Determine + // "CANCELLED" to disable the output. + // + // --> + @Override + public void print(String s) { + HashMap context = new HashMap(); + context.put("message", new Element(DenizenCore.getImplementation().cleanseLogString(s))); + List Determinations = OldEventManager.doEvents(Arrays.asList("console output"), // TODO: ScriptEvent + DenizenCore.getImplementation().getEmptyScriptEntryData(), context); + for (String str : Determinations) { + if (str.equalsIgnoreCase("cancelled")) { + return; + } + } + super.print(s); + } + + public void redirectOutput() { + if (redirected) { + return; + } + standardOut = System.out; + System.setOut(this); + } + + public void standardOutput() { + if (!redirected) { + return; + } + System.setOut(standardOut); + } +}