From 6b72cd8e217cf5dbf07e91d640ed0b5f08f32471 Mon Sep 17 00:00:00 2001 From: mcmonkey4eva Date: Wed, 24 Aug 2016 17:13:04 -0700 Subject: [PATCH] Reinstate filecopy command, better and smarter than ever --- .../java/net/aufdemrand/denizen/Denizen.java | 5 - .../commands/BukkitCommandRegistry.java | 26 +++++ .../commands/core/FileCopyCommand.java | 105 ++++++++++++++++++ .../denizen/utilities/Utilities.java | 7 +- 4 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/scripts/commands/core/FileCopyCommand.java diff --git a/src/main/java/net/aufdemrand/denizen/Denizen.java b/src/main/java/net/aufdemrand/denizen/Denizen.java index 5b100cf3de..a889447c76 100644 --- a/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -1609,11 +1609,6 @@ public Thread getMainThread() { public boolean allowedToWebget() { return Settings.allowWebget(); } - - @Override - public boolean allowedToFilecopy() { - return Settings.allowFilecopy(); - } } diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java index 1954992a91..35a6d6b75e 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/BukkitCommandRegistry.java @@ -1505,6 +1505,32 @@ public void registerCoreMembers() { "FLY", "fly (cancel) [|...] (controller:) (origin:) (destinations:|...) (speed:<#.#>) (rotationthreshold:<#.#>)", 1); + // <--[command] + // @Name FileCopy + // @Syntax filecopy [origin:] [destination:] (overwrite) + // @Required 2 + // @Stable stable + // @Short Copies a file from one location to another. + // @Author mcmonkey + // @Group core + // + // @Description + // TODO: Document Command Details + // The starting directory is server/plugins/Denizen. + // + // @Tags + // returns whether the copy succeeded (if not, either an error or occurred, or there is an existing file in the destination.) + // + // @Usage + // Use to copy a custom YAML data file to a backup folder, overwriting any old backup of it that exists. + // - filecopy o:data/custom.yml d:data/backup/ overwrite save:copy + // - narrate "Copy success<&co> " + // + // --> + registerCoreMember(FileCopyCommand.class, + "filecopy", "filecopy [origin:] [destination:] (overwrite)", 2); + + // <--[command] // @Name Follow // @Syntax follow (followers:|...) (stop) (lead:<#.#>) (max:<#.#>) (speed:<#.#>) (target:) (allow_wander) diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/FileCopyCommand.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/FileCopyCommand.java new file mode 100644 index 0000000000..6b0a726b9e --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/FileCopyCommand.java @@ -0,0 +1,105 @@ +package net.aufdemrand.denizen.scripts.commands.core; + +import net.aufdemrand.denizen.Settings; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.Utilities; +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.exceptions.CommandExecutionException; +import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; +import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.objects.aH; +import net.aufdemrand.denizencore.scripts.ScriptEntry; +import net.aufdemrand.denizencore.scripts.commands.AbstractCommand; +import org.apache.commons.io.FileUtils; + +import java.io.File; + +public class FileCopyCommand extends AbstractCommand { + + @Override + public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { + + + for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) { + + if (!scriptEntry.hasObject("origin") + && arg.matchesPrefix("origin", "o")) { + scriptEntry.addObject("origin", arg.asElement()); + } + + else if (!scriptEntry.hasObject("destination") + && arg.matchesPrefix("destination", "d")) { + scriptEntry.addObject("destination", arg.asElement()); + } + + else if (!scriptEntry.hasObject("overwrite") + && arg.matches("overwrite")) { + scriptEntry.addObject("overwrite", new Element("true")); + } + + else { + arg.reportUnhandled(); + } + } + + if (!scriptEntry.hasObject("origin")) { + throw new InvalidArgumentsException("Must have a valid origin!"); + } + + if (!scriptEntry.hasObject("destination")) { + throw new InvalidArgumentsException("Must have a valid destination!"); + } + + scriptEntry.defaultObject("overwrite", new Element("false")); + } + + @Override + public void execute(final ScriptEntry scriptEntry) throws CommandExecutionException { + Element origin = scriptEntry.getElement("origin"); + Element destination = scriptEntry.getElement("destination"); + Element overwrite = scriptEntry.getElement("overwrite"); + + dB.report(scriptEntry, getName(), origin.debug() + destination.debug() + overwrite.debug()); + + if (!Settings.allowFilecopy()) { + dB.echoError(scriptEntry.getResidingQueue(), "File copy disabled by server administrator."); + scriptEntry.addObject("success", new Element("false")); + return; + } + + File o = new File(DenizenAPI.getCurrentInstance().getDataFolder(), origin.asString()); + File d = new File(DenizenAPI.getCurrentInstance().getDataFolder(), destination.asString()); + boolean ow = overwrite.asBoolean(); + boolean dexists = d.exists(); + boolean disdir = d.isDirectory(); + + if (!o.exists()) { + dB.echoError(scriptEntry.getResidingQueue(), "File copy failed, origin does not exist!"); + scriptEntry.addObject("success", new Element("false")); + return; + } + if (!Utilities.isSafeFile(d)) { + dB.echoError(scriptEntry.getResidingQueue(), "Can't copy files to there!"); + scriptEntry.addObject("success", new Element("false")); + return; + } + + if (dexists && !disdir && !ow) { + dB.echoDebug(scriptEntry, "File copy ignored, destination file already exists!"); + scriptEntry.addObject("success", new Element("false")); + return; + } + try { + if (dexists && !disdir) { + d.delete(); + } + FileUtils.copyFile(o, d); + scriptEntry.addObject("success", new Element("true")); + } + catch (Exception e) { + dB.echoError(scriptEntry.getResidingQueue(), e); + scriptEntry.addObject("success", new Element("false")); + return; + } + } +} diff --git a/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java b/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java index ece16b462b..5a39f8f114 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java @@ -6,7 +6,7 @@ import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.tags.BukkitTagContext; import net.aufdemrand.denizen.utilities.blocks.SafeBlock; -import net.aufdemrand.denizen.utilities.debugging.dB; +import net.aufdemrand.denizencore.utilities.debugging.dB; import net.aufdemrand.denizencore.tags.TagManager; import net.aufdemrand.denizencore.utilities.CoreUtilities; import org.bukkit.Bukkit; @@ -33,7 +33,10 @@ public class Utilities { public static boolean isSafeFile(File f) { try { - String lown = CoreUtilities.toLowerCase(f.getCanonicalPath()); + String lown = CoreUtilities.toLowerCase(f.getCanonicalPath()).replace('\\', '/'); + if (dB.verbose) { + dB.log("Checking file : " + lown); + } if (lown.contains("denizen/config.yml")) { return false; }