diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/Directory.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/Directory.java index 5703c1e..f81e089 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/Directory.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/Directory.java @@ -17,10 +17,8 @@ package com.mattmalec.pterodactyl4j.client.entities; import com.mattmalec.pterodactyl4j.PteroAction; -import com.mattmalec.pterodactyl4j.client.managers.CompressAction; -import com.mattmalec.pterodactyl4j.client.managers.DeleteAction; -import com.mattmalec.pterodactyl4j.client.managers.RenameAction; -import com.mattmalec.pterodactyl4j.client.managers.UploadFileAction; +import com.mattmalec.pterodactyl4j.client.managers.*; + import java.util.List; import java.util.Optional; @@ -67,5 +65,5 @@ default Optional getDirectoryByName(String name) { CompressAction compress(); - PteroAction decompress(File compressedFile); + DecompressAction decompress(File compressedFile); } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/File.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/File.java index b9234d9..2b011b4 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/File.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/File.java @@ -17,6 +17,7 @@ package com.mattmalec.pterodactyl4j.client.entities; import com.mattmalec.pterodactyl4j.PteroAction; +import com.mattmalec.pterodactyl4j.client.managers.DecompressAction; public interface File extends GenericFile { @@ -28,5 +29,5 @@ public interface File extends GenericFile { PteroAction copy(); - PteroAction decompress(); + DecompressAction decompress(); } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/CompressActionImpl.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/CompressActionImpl.java index 0c49e8b..e1ab6d4 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/CompressActionImpl.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/CompressActionImpl.java @@ -17,6 +17,7 @@ package com.mattmalec.pterodactyl4j.client.entities.impl; import com.mattmalec.pterodactyl4j.client.entities.ClientServer; +import com.mattmalec.pterodactyl4j.client.entities.Directory; import com.mattmalec.pterodactyl4j.client.entities.File; import com.mattmalec.pterodactyl4j.client.entities.GenericFile; import com.mattmalec.pterodactyl4j.client.managers.CompressAction; @@ -24,6 +25,7 @@ import com.mattmalec.pterodactyl4j.requests.Route; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import okhttp3.RequestBody; @@ -32,6 +34,7 @@ public class CompressActionImpl extends PteroActionImpl implements CompressAction { private final List files; + private Directory rootDirectory; public CompressActionImpl(ClientServer server, PteroClientImpl impl) { super( @@ -39,6 +42,7 @@ public CompressActionImpl(ClientServer server, PteroClientImpl impl) { Route.Files.COMPRESS_FILES.compile(server.getIdentifier()), (response, request) -> new FileImpl(response.getObject(), "/", server)); this.files = new ArrayList<>(); + setHandler((response, request) -> new FileImpl(response.getObject(), (rootDirectory == null ? "/" : rootDirectory.getPath()), server)); } @Override @@ -47,6 +51,12 @@ public CompressAction addFile(GenericFile file) { return this; } + @Override + public CompressAction addFiles(Collection files) { + this.files.addAll(files); + return this; + } + @Override public CompressAction addFiles(GenericFile file, GenericFile... files) { this.files.add(file); @@ -56,6 +66,12 @@ public CompressAction addFiles(GenericFile file, GenericFile... files) { return this; } + @Override + public CompressAction setRoot(Directory rootDirectory) { + this.rootDirectory = rootDirectory; + return this; + } + @Override public CompressAction clearFiles() { files.clear(); diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DecompressActionImpl.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DecompressActionImpl.java index e562371..aef638a 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DecompressActionImpl.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DecompressActionImpl.java @@ -17,27 +17,64 @@ package com.mattmalec.pterodactyl4j.client.entities.impl; import com.mattmalec.pterodactyl4j.client.entities.ClientServer; +import com.mattmalec.pterodactyl4j.client.entities.Directory; import com.mattmalec.pterodactyl4j.client.entities.File; +import com.mattmalec.pterodactyl4j.client.managers.DecompressAction; +import com.mattmalec.pterodactyl4j.exceptions.IllegalActionException; import com.mattmalec.pterodactyl4j.requests.PteroActionImpl; import com.mattmalec.pterodactyl4j.requests.Route; import com.mattmalec.pterodactyl4j.utils.Checks; import okhttp3.RequestBody; import org.json.JSONObject; -public class DecompressActionImpl extends PteroActionImpl { +public class DecompressActionImpl extends PteroActionImpl implements DecompressAction { private final File compressedFile; + private Directory rootDirectory; + public DecompressActionImpl(ClientServer server, File compressedFile, PteroClientImpl impl) { super(impl.getP4J(), Route.Files.DECOMPRESS_FILE.compile(server.getIdentifier())); this.compressedFile = compressedFile; } + @Override + public DecompressAction setRoot(Directory rootDirectory) { + this.rootDirectory = rootDirectory; + return this; + } + @Override protected RequestBody finalizeData() { Checks.notNull(compressedFile, "Compressed File"); - JSONObject json = new JSONObject().put("file", compressedFile.getPath()).put("root", "/"); + if(rootDirectory == null) { + String filePath = compressedFile.getPath(); + + if(filePath.endsWith("/")) { + filePath = filePath.substring(0, filePath.length() - 1); + } + + int lastSlashIndex = filePath.lastIndexOf('/'); + String parentDir; + + if(lastSlashIndex == -1) { + parentDir = "/"; + filePath = compressedFile.getPath(); + } else { + parentDir = filePath.substring(0, lastSlashIndex); + filePath = filePath.substring(lastSlashIndex + 1); + } + + JSONObject json = new JSONObject().put("root", parentDir).put("file", filePath); + return getRequestBody(json); + } + String rootPath = rootDirectory.getPath() + "/"; + String filePath = compressedFile.getPath(); + if(!filePath.startsWith(rootPath)) { + throw new IllegalActionException("compressed file isn't within the given root directory"); + } + JSONObject json = new JSONObject().put("root", rootDirectory.getPath()).put("file", filePath.substring(rootPath.length())); return getRequestBody(json); } } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DirectoryImpl.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DirectoryImpl.java index 2e85d25..1ef3fdf 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DirectoryImpl.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/DirectoryImpl.java @@ -21,10 +21,8 @@ import com.mattmalec.pterodactyl4j.client.entities.Directory; import com.mattmalec.pterodactyl4j.client.entities.File; import com.mattmalec.pterodactyl4j.client.entities.GenericFile; -import com.mattmalec.pterodactyl4j.client.managers.CompressAction; -import com.mattmalec.pterodactyl4j.client.managers.DeleteAction; -import com.mattmalec.pterodactyl4j.client.managers.RenameAction; -import com.mattmalec.pterodactyl4j.client.managers.UploadFileAction; +import com.mattmalec.pterodactyl4j.client.managers.*; + import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collections; @@ -78,7 +76,7 @@ public CompressAction compress() { } @Override - public PteroAction decompress(File compressedFile) { + public DecompressAction decompress(File compressedFile) { return server.getFileManager().decompress(compressedFile); } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileImpl.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileImpl.java index 3b15048..358a3ea 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileImpl.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileImpl.java @@ -20,6 +20,7 @@ import com.mattmalec.pterodactyl4j.client.entities.ClientServer; import com.mattmalec.pterodactyl4j.client.entities.DownloadableFile; import com.mattmalec.pterodactyl4j.client.entities.File; +import com.mattmalec.pterodactyl4j.client.managers.DecompressAction; import com.mattmalec.pterodactyl4j.client.managers.FileManager; import org.json.JSONObject; @@ -53,7 +54,7 @@ public PteroAction copy() { } @Override - public PteroAction decompress() { + public DecompressAction decompress() { return fileManager.decompress(this); } } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileManagerImpl.java b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileManagerImpl.java index 2808ef2..793e97f 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileManagerImpl.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/entities/impl/FileManagerImpl.java @@ -64,7 +64,7 @@ public CompressAction compress() { } @Override - public PteroAction decompress(File compressedFile) { + public DecompressAction decompress(File compressedFile) { return new DecompressActionImpl(server, compressedFile, impl); } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/managers/CompressAction.java b/src/main/java/com/mattmalec/pterodactyl4j/client/managers/CompressAction.java index 6f71206..aef5d39 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/managers/CompressAction.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/managers/CompressAction.java @@ -17,14 +17,20 @@ package com.mattmalec.pterodactyl4j.client.managers; import com.mattmalec.pterodactyl4j.PteroAction; +import com.mattmalec.pterodactyl4j.client.entities.Directory; import com.mattmalec.pterodactyl4j.client.entities.File; import com.mattmalec.pterodactyl4j.client.entities.GenericFile; +import java.util.Collection; public interface CompressAction extends PteroAction { CompressAction addFile(GenericFile file); + CompressAction addFiles(Collection files); + CompressAction addFiles(GenericFile file, GenericFile... files); + CompressAction setRoot(Directory rootDirectory); + CompressAction clearFiles(); } diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/managers/DecompressAction.java b/src/main/java/com/mattmalec/pterodactyl4j/client/managers/DecompressAction.java new file mode 100644 index 0000000..310285e --- /dev/null +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/managers/DecompressAction.java @@ -0,0 +1,8 @@ +package com.mattmalec.pterodactyl4j.client.managers; + +import com.mattmalec.pterodactyl4j.PteroAction; +import com.mattmalec.pterodactyl4j.client.entities.Directory; + +public interface DecompressAction extends PteroAction { + DecompressAction setRoot(Directory rootDirectory); +} diff --git a/src/main/java/com/mattmalec/pterodactyl4j/client/managers/FileManager.java b/src/main/java/com/mattmalec/pterodactyl4j/client/managers/FileManager.java index 305af55..d0af51d 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/client/managers/FileManager.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/client/managers/FileManager.java @@ -33,7 +33,7 @@ public interface FileManager { CompressAction compress(); - PteroAction decompress(File compressedFile); + DecompressAction decompress(File compressedFile); DeleteAction delete(); diff --git a/src/main/java/com/mattmalec/pterodactyl4j/requests/PteroActionImpl.java b/src/main/java/com/mattmalec/pterodactyl4j/requests/PteroActionImpl.java index 98d69a2..30df379 100644 --- a/src/main/java/com/mattmalec/pterodactyl4j/requests/PteroActionImpl.java +++ b/src/main/java/com/mattmalec/pterodactyl4j/requests/PteroActionImpl.java @@ -37,7 +37,7 @@ public class PteroActionImpl implements PteroAction { private final Route.CompiledRoute route; private final RequestBody data; private long deadline = 0; - private final BiFunction, T> handler; + private BiFunction, T> handler; public static DeferredPteroAction onExecute(P4J api, Supplier supplier) { return new DeferredPteroAction<>(api, supplier); @@ -136,6 +136,10 @@ public void handleResponse(Response response, Request request) { else request.setOnFailure(response); } + public void setHandler(BiFunction, T> handler) { + this.handler = handler; + } + public void handleSuccess(Response response, Request request) { if (response.isEmpty() || handler == null) request.onSuccess(null); else request.onSuccess(handler.apply(response, request));