support downloading multiple clipboards at once
This commit is contained in:
parent
79fe27ab3e
commit
7968cdc232
@ -0,0 +1,16 @@
|
|||||||
|
package com.boydti.fawe.object.io;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class NonClosableOutputStream extends AbstractDelegateOutputStream {
|
||||||
|
|
||||||
|
public NonClosableOutputStream(OutputStream os) {
|
||||||
|
super(os);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
}
|
@ -473,7 +473,7 @@ public class MainUtil {
|
|||||||
};
|
};
|
||||||
writeTask.value = nonClosable;
|
writeTask.value = nonClosable;
|
||||||
writeTask.run();
|
writeTask.run();
|
||||||
output.flush();
|
nonClosable.flush();
|
||||||
writer.append(CRLF).flush();
|
writer.append(CRLF).flush();
|
||||||
writer.append("--" + boundary + "--").append(CRLF).flush();
|
writer.append("--" + boundary + "--").append(CRLF).flush();
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,10 @@ import com.boydti.fawe.config.BBC;
|
|||||||
import com.boydti.fawe.config.Settings;
|
import com.boydti.fawe.config.Settings;
|
||||||
import com.boydti.fawe.object.FaweLimit;
|
import com.boydti.fawe.object.FaweLimit;
|
||||||
import com.boydti.fawe.object.FawePlayer;
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
|
import com.boydti.fawe.object.RunnableVal;
|
||||||
|
import com.boydti.fawe.object.clipboard.MultiClipboardHolder;
|
||||||
import com.boydti.fawe.object.clipboard.ReadOnlyClipboard;
|
import com.boydti.fawe.object.clipboard.ReadOnlyClipboard;
|
||||||
|
import com.boydti.fawe.object.clipboard.URIClipboardHolder;
|
||||||
import com.boydti.fawe.object.clipboard.WorldCutClipboard;
|
import com.boydti.fawe.object.clipboard.WorldCutClipboard;
|
||||||
import com.boydti.fawe.object.exception.FaweException;
|
import com.boydti.fawe.object.exception.FaweException;
|
||||||
import com.boydti.fawe.object.io.FastByteArrayOutputStream;
|
import com.boydti.fawe.object.io.FastByteArrayOutputStream;
|
||||||
@ -59,9 +62,17 @@ import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
|
|||||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||||
import com.sk89q.worldedit.util.command.binding.Switch;
|
import com.sk89q.worldedit.util.command.binding.Switch;
|
||||||
import com.sk89q.worldedit.util.command.parametric.Optional;
|
import com.sk89q.worldedit.util.command.parametric.Optional;
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
|
||||||
import static com.sk89q.minecraft.util.commands.Logging.LogMode.PLACEMENT;
|
import static com.sk89q.minecraft.util.commands.Logging.LogMode.PLACEMENT;
|
||||||
@ -270,44 +281,81 @@ public class ClipboardCommands extends MethodCommands {
|
|||||||
BBC.CLIPBOARD_INVALID_FORMAT.send(player, formatName);
|
BBC.CLIPBOARD_INVALID_FORMAT.send(player, formatName);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
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, formatName);
|
BBC.GENERATING_LINK.send(player, formatName);
|
||||||
|
ClipboardHolder holder = session.getClipboard();
|
||||||
|
|
||||||
URL url;
|
URL url;
|
||||||
switch (format) {
|
if (holder instanceof MultiClipboardHolder) {
|
||||||
case PNG:
|
MultiClipboardHolder multi = (MultiClipboardHolder) holder;
|
||||||
try {
|
Set<File> files = new HashSet<>();
|
||||||
FastByteArrayOutputStream baos = new FastByteArrayOutputStream(Short.MAX_VALUE);
|
Set<URI> invalid = new HashSet<>();
|
||||||
ClipboardWriter writer = format.getWriter(baos);
|
for (ClipboardHolder cur : multi.getHolders()) {
|
||||||
writer.write(target, null);
|
if (cur instanceof URIClipboardHolder) {
|
||||||
baos.flush();
|
URIClipboardHolder uriHolder = (URIClipboardHolder) cur;
|
||||||
url = ImgurUtility.uploadImage(baos.toByteArray());
|
URI uri = uriHolder.getUri();
|
||||||
} catch (IOException e) {
|
File file = new File(uri.getPath());
|
||||||
e.printStackTrace();
|
if (file.exists() && file.isFile()) {
|
||||||
|
files.add(file);
|
||||||
|
System.out.println("Valid " + file);
|
||||||
|
} else if (!uri.getPath().isEmpty()) {
|
||||||
|
System.out.println("Invalid " + uri);
|
||||||
|
invalid.add(uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
url = MainUtil.upload(null, null, "zip", new RunnableVal<OutputStream>() {
|
||||||
|
@Override
|
||||||
|
public void run(OutputStream out) {
|
||||||
|
try (ZipOutputStream zos = new ZipOutputStream(out)) {
|
||||||
|
for (File file : files) {
|
||||||
|
ZipEntry ze = new ZipEntry(file.getName());
|
||||||
|
zos.putNextEntry(ze);
|
||||||
|
Files.copy(file.toPath(), zos);
|
||||||
|
zos.closeEntry();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
switch (format) {
|
||||||
|
case PNG:
|
||||||
|
try {
|
||||||
|
FastByteArrayOutputStream baos = new FastByteArrayOutputStream(Short.MAX_VALUE);
|
||||||
|
ClipboardWriter writer = format.getWriter(baos);
|
||||||
|
writer.write(target, null);
|
||||||
|
baos.flush();
|
||||||
|
url = ImgurUtility.uploadImage(baos.toByteArray());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
url = null;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCHEMATIC:
|
||||||
|
if (Settings.IMP.WEB.URL.isEmpty()) {
|
||||||
|
BBC.SETTING_DISABLE.send(player, "web.url");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
url = FaweAPI.upload(target, format);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
url = null;
|
url = null;
|
||||||
}
|
break;
|
||||||
break;
|
}
|
||||||
case SCHEMATIC:
|
|
||||||
if (Settings.IMP.WEB.URL.isEmpty()) {
|
|
||||||
BBC.SETTING_DISABLE.send(player, "web.url");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
url = FaweAPI.upload(target, format);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
url = null;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (url == null) {
|
if (url == null) {
|
||||||
BBC.GENERATING_LINK_FAILED.send(player);
|
BBC.GENERATING_LINK_FAILED.send(player);
|
||||||
|
Loading…
Reference in New Issue
Block a user