From c11e2ba23406b308142acec2a07c89d63960df61 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Mon, 6 Oct 2014 13:06:01 +0200 Subject: [PATCH] Add url based macro utility command. Also tweak TimeUnit a bit. --- .../massivecraft/massivecore/MassiveCore.java | 7 + .../massivecore/MassiveCoreMConf.java | 2 + .../massivecore/MassiveCorePerm.java | 1 + .../cmd/massivecore/CmdMassiveCore.java | 2 + .../cmd/massivecore/CmdMassiveCoreCmdurl.java | 126 ++++++++++++++++++ .../massivecore/store/SenderEntity.java | 15 +++ .../massivecore/util/TimeUnit.java | 34 +++-- .../massivecore/util/WebUtil.java | 53 ++++++++ src/main/resources/plugin.yml | 2 + 9 files changed, 230 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCoreCmdurl.java diff --git a/src/main/java/com/massivecraft/massivecore/MassiveCore.java b/src/main/java/com/massivecraft/massivecore/MassiveCore.java index 7d1e2b19..6ac9a0f1 100644 --- a/src/main/java/com/massivecraft/massivecore/MassiveCore.java +++ b/src/main/java/com/massivecraft/massivecore/MassiveCore.java @@ -20,6 +20,7 @@ import com.massivecraft.massivecore.adapter.PlayerInventoryAdapter; import com.massivecraft.massivecore.adapter.UUIDAdapter; import com.massivecraft.massivecore.cmd.massivecore.CmdMassiveCore; import com.massivecraft.massivecore.cmd.massivecore.CmdMassiveCoreBuffer; +import com.massivecraft.massivecore.cmd.massivecore.CmdMassiveCoreCmdurl; import com.massivecraft.massivecore.cmd.massivecore.CmdMassiveCoreStore; import com.massivecraft.massivecore.cmd.massivecore.CmdMassiveCoreUsys; import com.massivecraft.massivecore.event.EventMassiveCoreUuidUpdate; @@ -105,6 +106,9 @@ public class MassiveCore extends MassivePlugin private CmdMassiveCoreBuffer outerCmdMassiveCoreBuffer; public CmdMassiveCoreBuffer getOuterCmdMassiveCoreBuffer() { return this.outerCmdMassiveCoreBuffer; } + private CmdMassiveCoreCmdurl outerCmdMassiveCoreCmdurl; + public CmdMassiveCoreCmdurl getOuterCmdMassiveCoreCmdurl() { return this.outerCmdMassiveCoreCmdurl; } + // Runnables // TODO: Make this one a singleton private Runnable collTickTask = new Runnable() @@ -186,6 +190,9 @@ public class MassiveCore extends MassivePlugin this.outerCmdMassiveCoreBuffer = new CmdMassiveCoreBuffer() { public List getAliases() { return MassiveCoreMConf.get().aliasesOuterMassiveCoreBuffer; } }; this.outerCmdMassiveCoreBuffer.register(); + this.outerCmdMassiveCoreCmdurl = new CmdMassiveCoreCmdurl() { public List getAliases() { return MassiveCoreMConf.get().aliasesOuterMassiveCoreCmdurl; } }; + this.outerCmdMassiveCoreCmdurl.register(); + // Integration this.integrate( IntegrationVault.get() diff --git a/src/main/java/com/massivecraft/massivecore/MassiveCoreMConf.java b/src/main/java/com/massivecraft/massivecore/MassiveCoreMConf.java index 5f0cf10c..70c9b4c9 100644 --- a/src/main/java/com/massivecraft/massivecore/MassiveCoreMConf.java +++ b/src/main/java/com/massivecraft/massivecore/MassiveCoreMConf.java @@ -32,6 +32,8 @@ public class MassiveCoreMConf extends Entity public List aliasesOuterMassiveCoreBuffer = MUtil.list("buffer"); + public List aliasesOuterMassiveCoreCmdurl = MUtil.list("cmdurl"); + public boolean usingRecipientChatEvent = true; public Map permissionDeniedFormats = MUtil.map( diff --git a/src/main/java/com/massivecraft/massivecore/MassiveCorePerm.java b/src/main/java/com/massivecraft/massivecore/MassiveCorePerm.java index 29e3e8cb..721dbdd0 100644 --- a/src/main/java/com/massivecraft/massivecore/MassiveCorePerm.java +++ b/src/main/java/com/massivecraft/massivecore/MassiveCorePerm.java @@ -40,6 +40,7 @@ public enum MassiveCorePerm BUFFER_SET("buffer.set"), BUFFER_ADD("buffer.add"), BUFFER_WHITESPACE("buffer.whitespace"), + CMDURL("cmdurl"), NOTPDELAY("notpdelay"), VARIABLE_BOOK("variable.book"), VARIABLE_BUFFER("variable.buffer"), diff --git a/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCore.java b/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCore.java index 3eb76b07..42cf59ba 100644 --- a/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCore.java +++ b/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCore.java @@ -18,6 +18,7 @@ public class CmdMassiveCore extends MassiveCommand public CmdMassiveCoreTest cmdMassiveCoreTest = new CmdMassiveCoreTest(); public CmdMassiveCoreHearsound cmdMassiveCoreHearsound = new CmdMassiveCoreHearsound(); public CmdMassiveCoreBuffer cmdMassiveCoreBuffer = new CmdMassiveCoreBuffer(); + public CmdMassiveCoreCmdurl cmdMassiveCoreCmdurl = new CmdMassiveCoreCmdurl(); public VersionCommand cmdMassiveCoreVersion = new VersionCommand(MassiveCore.get(), MassiveCorePerm.VERSION.node, "v", "version"); // -------------------------------------------- // @@ -33,6 +34,7 @@ public class CmdMassiveCore extends MassiveCommand this.addSubCommand(this.cmdMassiveCoreTest); this.addSubCommand(this.cmdMassiveCoreHearsound); this.addSubCommand(this.cmdMassiveCoreBuffer); + this.addSubCommand(this.cmdMassiveCoreCmdurl); this.addSubCommand(this.cmdMassiveCoreVersion); // Requirements diff --git a/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCoreCmdurl.java b/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCoreCmdurl.java new file mode 100644 index 00000000..86fa2834 --- /dev/null +++ b/src/main/java/com/massivecraft/massivecore/cmd/massivecore/CmdMassiveCoreCmdurl.java @@ -0,0 +1,126 @@ +package com.massivecraft.massivecore.cmd.massivecore; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.MassiveCorePerm; +import com.massivecraft.massivecore.cmd.MassiveCommand; +import com.massivecraft.massivecore.cmd.req.ReqHasPerm; +import com.massivecraft.massivecore.cmd.req.ReqIsPlayer; +import com.massivecraft.massivecore.mixin.Mixin; +import com.massivecraft.massivecore.util.WebUtil; + +public class CmdMassiveCoreCmdurl extends MassiveCommand +{ + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public CmdMassiveCoreCmdurl() + { + // Aliases + this.addAliases("cmdurl"); + + // Args + this.addRequiredArg("url"); + + // Requirements + this.addRequirements(ReqHasPerm.get(MassiveCorePerm.CMDURL.node)); + this.addRequirements(ReqIsPlayer.get()); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public void perform() + { + // Args + String urlString = this.arg(0); + + final URL url; + try + { + url = new URL(urlString); + } + catch (MalformedURLException e) + { + msg("Malformed URL: %s", e.getMessage()); + return; + } + + // Apply + final Player commander = me; + msg("Loading %s ...", urlString); + async(new Runnable() + { + @Override + public void run() + { + try + { + final List lines = WebUtil.getUrlLines(url, 5000); + sync(new Runnable() + { + @Override + public void run() + { + Mixin.msgOne(commander, "... %d lines loaded. Now executing ...", lines.size()); + for (int i = 0; i <= lines.size() - 1; i++) + { + String line = lines.get(i); + line = line.trim(); + if (line.length() == 0 || line.startsWith("#")) + { + Mixin.msgOne(commander, "#%d: %s", i, line); + // Ignore the line + } + else + { + Mixin.msgOne(commander, "#%d: %s", i, line); + // Run the line + commander.chat(line); + } + } + } + }); + return; + } + catch (final Exception e) + { + sync(new Runnable() + { + @Override + public void run() + { + Mixin.msgOne(commander, "%s: %s", e.getClass().getSimpleName(), e.getMessage()); + } + }); + return; + } + } + }); + } + + // -------------------------------------------- // + // ASYNC/SYNC SHORTHANDS + // -------------------------------------------- // + + public static void sync(Runnable runnable) + { + Bukkit.getScheduler().runTask(MassiveCore.get(), runnable); + } + + public static void async(Runnable runnable) + { + Bukkit.getScheduler().runTaskAsynchronously(MassiveCore.get(), runnable); + } + +} diff --git a/src/main/java/com/massivecraft/massivecore/store/SenderEntity.java b/src/main/java/com/massivecraft/massivecore/store/SenderEntity.java index 43e5ea8c..e725428f 100644 --- a/src/main/java/com/massivecraft/massivecore/store/SenderEntity.java +++ b/src/main/java/com/massivecraft/massivecore/store/SenderEntity.java @@ -93,6 +93,21 @@ public abstract class SenderEntity> extends Entity return Mixin.isOffline(this.getId()); } + public Long getLastPlayed() + { + return Mixin.getLastPlayed(this.getId()); + } + + public Long getFirstPlayed() + { + return Mixin.getFirstPlayed(this.getId()); + } + + public boolean hasPlayedBefore() + { + return Mixin.hasPlayedBefore(this.getId()); + } + // DISPLAY NAME @Deprecated diff --git a/src/main/java/com/massivecraft/massivecore/util/TimeUnit.java b/src/main/java/com/massivecraft/massivecore/util/TimeUnit.java index d42ecc22..3e374d50 100644 --- a/src/main/java/com/massivecraft/massivecore/util/TimeUnit.java +++ b/src/main/java/com/massivecraft/massivecore/util/TimeUnit.java @@ -36,25 +36,35 @@ public class TimeUnit implements Comparable private static final TreeSet all = new TreeSet(); public static TreeSet getAll() { return new TreeSet(all); } + + public static TreeSet getAllBut(TimeUnit... timeUnits) + { + TreeSet ret = new TreeSet(all); + for (TimeUnit timeUnit : timeUnits) + { + ret.remove(timeUnit); + } + return ret; + } + public static TreeSet getAllButMillis() { - TreeSet ret = new TreeSet(all); - ret.remove(MILLISECOND); - return ret; + return getAllBut(MILLISECOND); } + public static TreeSet getAllButMillisAndSeconds() { - TreeSet ret = new TreeSet(all); - ret.remove(MILLISECOND); - ret.remove(SECOND); - return ret; + return getAllBut(MILLISECOND, SECOND); } + public static TreeSet getAllButMillisSecondsAndMinutes() { - TreeSet ret = new TreeSet(all); - ret.remove(MILLISECOND); - ret.remove(SECOND); - ret.remove(MINUTE); + return getAllBut(MILLISECOND, SECOND, MINUTE); + } + + public static TreeSet getSpecific(TimeUnit... timeUnits) + { + TreeSet ret = new TreeSet(Arrays.asList(timeUnits)); return ret; } @@ -62,7 +72,7 @@ public class TimeUnit implements Comparable { if (timeUnitString == null) return null; String timeUnitStringLowerCase = timeUnitString.toLowerCase(); - for(TimeUnit timeUnit : all) + for (TimeUnit timeUnit : all) { for (String alias : timeUnit.aliases) { diff --git a/src/main/java/com/massivecraft/massivecore/util/WebUtil.java b/src/main/java/com/massivecraft/massivecore/util/WebUtil.java index 1c70f45b..853d147d 100644 --- a/src/main/java/com/massivecraft/massivecore/util/WebUtil.java +++ b/src/main/java/com/massivecraft/massivecore/util/WebUtil.java @@ -1,14 +1,23 @@ package com.massivecraft.massivecore.util; +import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class WebUtil { + // -------------------------------------------- // + // ASYNC GET TOUCH + // -------------------------------------------- // + private static final ExecutorService executor = Executors.newSingleThreadExecutor(); public static void asyncGetTouch(String url) @@ -44,4 +53,48 @@ public class WebUtil } }); } + + // -------------------------------------------- // + // GET URL LINES + // -------------------------------------------- // + + // This one should be run async since it's very slow. + public static List getUrlLines(URL url, int timeoutMillis) throws IOException + { + HttpURLConnection uc = null; + InputStream is = null; + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + uc = (HttpURLConnection) url.openConnection(); + uc.setConnectTimeout(timeoutMillis); + uc.setRequestMethod("GET"); + uc.addRequestProperty("User-Agent", "Mozilla/4.76"); + uc.connect(); + + is = uc.getInputStream(); + isr = new InputStreamReader(is, "UTF-8"); + br = new BufferedReader(isr); + + List lines = new ArrayList(); + String line = null; + while ( (line = br.readLine()) != null ) + { + lines.add(line); + } + + return lines; + } + finally + { + // Closing BufferedReader does close InputStreamReader does close InputStream. + try { br.close(); } catch (Exception ignored) {} + // However documentation suggested we must disconnect the HttpURLConnection manually. + try { uc.disconnect(); } catch (Exception ignored) {} + } + } + + } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 912def14..ef8e3090 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -40,6 +40,7 @@ permissions: massivecore.buffer.set: {description: set buffer, default: false} massivecore.buffer.add: {description: add to buffer, default: false} massivecore.buffer.whitespace: {description: add whitespace to buffer, default: false} + massivecore.cmdurl: {description: run all lines of url content, default: false} # misc massivecore.notpdelay: {description: teleport without delay, default: false} massivecore.variable.book: {description: replace ***book*** with content of book in your hand, default: false} @@ -80,6 +81,7 @@ permissions: massivecore.buffer.set: true massivecore.buffer.add: true massivecore.buffer.whitespace: true + massivecore.cmdurl: true massivecore.notpdelay: true massivecore.variable.book: true massivecore.variable.buffer: true