From 8c592d150684d38f1060344647c85d1c530d7096 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Sat, 4 Mar 2017 21:33:45 +1100 Subject: [PATCH] Assets --- .../main/java/com/boydti/fawe/FaweAPI.java | 15 +--- .../java/com/boydti/fawe/config/Settings.java | 13 +++- .../java/com/boydti/fawe/util/MainUtil.java | 23 ++++-- .../worldedit/command/ClipboardCommands.java | 37 +++++++++ .../extent/clipboard/io/ClipboardFormat.java | 76 ++++++++++++++++++- .../util/command/SimpleDispatcher.java | 3 +- 6 files changed, 142 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/com/boydti/fawe/FaweAPI.java b/core/src/main/java/com/boydti/fawe/FaweAPI.java index bba0ab74..7c0cb1d1 100644 --- a/core/src/main/java/com/boydti/fawe/FaweAPI.java +++ b/core/src/main/java/com/boydti/fawe/FaweAPI.java @@ -141,20 +141,7 @@ public class FaweAPI { * @return The download URL or null */ public static URL upload(final Clipboard clipboard, final ClipboardFormat format) { - return MainUtil.upload(null, "clipboard", format.getExtension(), new RunnableVal() { - @Override - public void run(OutputStream value) { - try { - try (PGZIPOutputStream gzip = new PGZIPOutputStream(value)) { - try (ClipboardWriter writer = format.getWriter(gzip)) { - writer.write(clipboard, null); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }); + return format.uploadAnonymous(clipboard); } /** diff --git a/core/src/main/java/com/boydti/fawe/config/Settings.java b/core/src/main/java/com/boydti/fawe/config/Settings.java index 24681852..b386d9f6 100644 --- a/core/src/main/java/com/boydti/fawe/config/Settings.java +++ b/core/src/main/java/com/boydti/fawe/config/Settings.java @@ -272,8 +272,19 @@ public class Settings extends Config { } public static class WEB { - @Comment("I am already hosting a web interface for you here") + @Comment({ + "The web interface for clipboards", + " - All schematics are anonymous and private", + " - Downloads can be deleted by the user", + " - Supports clipboard uploads, downloads and saves", + }) public String URL = "http://empcraft.com/fawe/"; + @Comment({ + "The web interface for assets", + " - All schematics are organized and public", + " - Assets can be searched, selected and downloaded", + }) + public String ASSETS = "http://empcraft.com/assetpack/"; } public static class EXTENT { diff --git a/core/src/main/java/com/boydti/fawe/util/MainUtil.java b/core/src/main/java/com/boydti/fawe/util/MainUtil.java index 68fe1877..acd46a8c 100644 --- a/core/src/main/java/com/boydti/fawe/util/MainUtil.java +++ b/core/src/main/java/com/boydti/fawe/util/MainUtil.java @@ -322,23 +322,26 @@ public class MainUtil { } public static URL upload(UUID uuid, String file, String extension, final RunnableVal writeTask) { + return upload(Settings.IMP.WEB.URL, uuid != null, uuid != null ? uuid.toString() : (String) null, file, extension, writeTask); + } + + public static URL upload(String urlStr, boolean save, String uuid, String file, String extension, final RunnableVal writeTask) { if (writeTask == null) { Fawe.debug("&cWrite task cannot be null"); return null; } - final String filename; + String filename = (file == null ? "plot" : file) + (extension != null ? "." + extension : ""); + uuid = uuid == null ? UUID.randomUUID().toString() : uuid; final String website; - if (uuid == null) { - uuid = UUID.randomUUID(); - website = Settings.IMP.WEB.URL + "upload.php?" + uuid; - filename = "plot." + extension; + if (!save) { + website = urlStr + "upload.php?" + uuid; + } else { - website = Settings.IMP.WEB.URL + "save.php?" + uuid; - filename = file + '.' + extension; + website = urlStr + "save.php?" + uuid; } final URL url; try { - url = new URL(Settings.IMP.WEB.URL + "?key=" + uuid + "&type=" + extension); + url = new URL(urlStr + "?key=" + uuid + "&type=" + "" + extension); String boundary = Long.toHexString(System.currentTimeMillis()); URLConnection con = new URL(website).openConnection(); con.setDoOutput(true); @@ -366,6 +369,10 @@ public class MainUtil { writer.append("--" + boundary + "--").append(CRLF).flush(); } int responseCode = ((HttpURLConnection) con).getResponseCode(); + java.util.Scanner scanner = new java.util.Scanner(con.getInputStream()).useDelimiter("\\A"); + String content = scanner.next().trim(); + scanner.close(); + Fawe.debug(content); if (responseCode == 200) { return url; } diff --git a/core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java b/core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java index e6ea7e2b..abbc253b 100644 --- a/core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java +++ b/core/src/main/java/com/sk89q/worldedit/command/ClipboardCommands.java @@ -312,6 +312,43 @@ public class ClipboardCommands { } } + @Command( + aliases = { "asset", "createasset", "makeasset" }, + usage = "[category]", + desc = "Create an asset", + help = "Saves your clipboard to the asset web interface", + min = 1, + max = 1 + ) + @CommandPermissions({ "worldedit.clipboard.asset"}) + public void asset(final Player player, final LocalSession session, String category) throws CommandException, WorldEditException { + final ClipboardFormat format = ClipboardFormat.SCHEMATIC; + ClipboardHolder holder = session.getClipboard(); + Clipboard clipboard = holder.getClipboard(); + final Transform transform = holder.getTransform(); + final Clipboard target; + // If we have a transform, bake it into the copy + if (!transform.isIdentity()) { + final FlattenedClipboardTransform result = FlattenedClipboardTransform.transform(clipboard, transform, holder.getWorldData()); + target = new BlockArrayClipboard(result.getTransformedRegion(), player.getUniqueId()); + target.setOrigin(clipboard.getOrigin()); + Operations.completeLegacy(result.copyTo(target)); + } else { + target = clipboard; + } + BBC.GENERATING_LINK.send(player, format.name()); + if (Settings.IMP.WEB.ASSETS.isEmpty()) { + BBC.SETTING_DISABLE.send(player, "web.assets"); + return; + } + URL url = format.uploadPublic(target, category.replaceAll("[/|\\\\]", "."), player.getName()); + if (url == null) { + BBC.GENERATING_LINK_FAILED.send(player); + } else { + BBC.DOWNLOAD_LINK.send(player, Settings.IMP.WEB.ASSETS); + } + } + @Command( aliases = { "/paste" }, usage = "", diff --git a/core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java b/core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java index 85b6dc7f..9ea160ff 100644 --- a/core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java +++ b/core/src/main/java/com/sk89q/worldedit/extent/clipboard/io/ClipboardFormat.java @@ -19,9 +19,13 @@ package com.sk89q.worldedit.extent.clipboard.io; +import com.boydti.fawe.config.Settings; +import com.boydti.fawe.jnbt.NBTStreamer; import com.boydti.fawe.object.FaweOutputStream; +import com.boydti.fawe.object.RunnableVal; import com.boydti.fawe.object.clipboard.AbstractClipboardFormat; import com.boydti.fawe.object.clipboard.DiskOptimizedClipboard; +import com.boydti.fawe.object.clipboard.FaweClipboard; import com.boydti.fawe.object.clipboard.IClipboardFormat; import com.boydti.fawe.object.io.PGZIPOutputStream; import com.boydti.fawe.object.io.ResettableFileInputStream; @@ -31,11 +35,24 @@ import com.boydti.fawe.object.schematic.Schematic; import com.boydti.fawe.object.schematic.StructureFormat; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.ReflectionUtils; +import com.google.gson.Gson; import com.sk89q.jnbt.NBTConstants; import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; -import java.io.*; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; import java.util.EnumSet; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -244,6 +261,63 @@ public enum ClipboardFormat { this.format = format; } + public URL uploadPublic(final Clipboard clipboard, String category, String user) { + // summary + // blocks + HashMap map = new HashMap(); + Vector dimensions = clipboard.getDimensions(); + map.put("width", dimensions.getX()); + map.put("height", dimensions.getY()); + map.put("length", dimensions.getZ()); + map.put("creator", user); + if (clipboard instanceof BlockArrayClipboard) { + FaweClipboard fc = ((BlockArrayClipboard) clipboard).IMP; + final int[] ids = new int[4096]; + fc.streamIds(new NBTStreamer.ByteReader() { + @Override + public void run(int index, int byteValue) { + ids[byteValue]++; + } + }); + Map blocks = new HashMap(); + for (int i = 0; i < ids.length; i++) { + if (ids[i] != 0) { + blocks.put(i, ids[i]); + } + } + map.put("blocks", blocks); + } + Gson gson = new Gson(); + String json = gson.toJson(map); + return MainUtil.upload(Settings.IMP.WEB.ASSETS, false, json, category, null, new RunnableVal() { + @Override + public void run(OutputStream value) { + write(value, clipboard); + } + }); + } + + private void write(OutputStream value, Clipboard clipboard) { + try { + try (PGZIPOutputStream gzip = new PGZIPOutputStream(value)) { + try (ClipboardWriter writer = format.getWriter(gzip)) { + writer.write(clipboard, null); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public URL uploadAnonymous(final Clipboard clipboard) { + return MainUtil.upload(null, null, format.getExtension(), new RunnableVal() { + @Override + public void run(OutputStream value) { + write(value, clipboard); + } + }); + } + public IClipboardFormat getFormat() { return format; } diff --git a/core/src/main/java/com/sk89q/worldedit/util/command/SimpleDispatcher.java b/core/src/main/java/com/sk89q/worldedit/util/command/SimpleDispatcher.java index 07bca48a..21e14b00 100644 --- a/core/src/main/java/com/sk89q/worldedit/util/command/SimpleDispatcher.java +++ b/core/src/main/java/com/sk89q/worldedit/util/command/SimpleDispatcher.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.util.command; +import com.boydti.fawe.Fawe; import com.boydti.fawe.util.StringMan; import com.google.common.base.Joiner; import com.sk89q.minecraft.util.commands.CommandContext; @@ -62,7 +63,7 @@ public class SimpleDispatcher implements Dispatcher { for (String a : alias) { String lower = a.toLowerCase(); if (commands.containsKey(lower)) { - System.out.println("Replacing commands is currently undefined behavior: " + StringMan.getString(alias)); + Fawe.debug("Replacing commands is currently undefined behavior: " + StringMan.getString(alias)); return; } }