mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2026-01-06 15:52:03 +00:00
BETA2
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package net.momirealms.craftengine.core.pack.host;
|
||||
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
@@ -10,4 +12,8 @@ public interface ResourcePackHost {
|
||||
CompletableFuture<List<ResourcePackDownloadData>> requestResourcePackDownloadLink(UUID player);
|
||||
|
||||
CompletableFuture<Void> upload(Path resourcePackPath);
|
||||
|
||||
boolean canUpload();
|
||||
|
||||
Key type();
|
||||
}
|
||||
|
||||
@@ -6,11 +6,9 @@ import com.google.gson.reflect.TypeToken;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.util.GsonHelper;
|
||||
import net.momirealms.craftengine.core.util.HashUtils;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
import net.momirealms.craftengine.core.util.Pair;
|
||||
import net.momirealms.craftengine.core.util.*;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.IOException;
|
||||
@@ -26,8 +24,6 @@ import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.time.Duration;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -40,8 +36,7 @@ public class AlistHost implements ResourcePackHost {
|
||||
private final String filePassword;
|
||||
private final String otpCode;
|
||||
private final Duration jwtTokenExpiration;
|
||||
private final String filePath;
|
||||
private final boolean disabledUpload;
|
||||
private final String uploadPath;
|
||||
private final ProxySelector proxy;
|
||||
private Pair<String, Date> jwtToken;
|
||||
private String cachedSha1;
|
||||
@@ -52,8 +47,7 @@ public class AlistHost implements ResourcePackHost {
|
||||
String filePassword,
|
||||
String otpCode,
|
||||
Duration jwtTokenExpiration,
|
||||
String filePath,
|
||||
boolean disabledUpload,
|
||||
String uploadPath,
|
||||
ProxySelector proxy) {
|
||||
this.apiUrl = apiUrl;
|
||||
this.userName = userName;
|
||||
@@ -61,12 +55,21 @@ public class AlistHost implements ResourcePackHost {
|
||||
this.filePassword = filePassword;
|
||||
this.otpCode = otpCode;
|
||||
this.jwtTokenExpiration = jwtTokenExpiration;
|
||||
this.filePath = filePath;
|
||||
this.disabledUpload = disabledUpload;
|
||||
this.uploadPath = uploadPath;
|
||||
this.proxy = proxy;
|
||||
this.readCacheFromDisk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.ALIST;
|
||||
}
|
||||
|
||||
private void readCacheFromDisk() {
|
||||
Path cachePath = CraftEngine.instance().dataFolderPath().resolve("alist.cache");
|
||||
if (!Files.exists(cachePath)) return;
|
||||
@@ -129,18 +132,13 @@ public class AlistHost implements ResourcePackHost {
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> upload(Path resourcePackPath) {
|
||||
if (this.disabledUpload) {
|
||||
this.cachedSha1 = "";
|
||||
saveCacheToDisk();
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
CompletableFuture<Void> future = new CompletableFuture<>();
|
||||
CraftEngine.instance().scheduler().executeAsync(() -> {
|
||||
try (HttpClient client = HttpClient.newBuilder().proxy(this.proxy).build()) {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(URI.create(this.apiUrl + "/api/fs/put"))
|
||||
.header("Authorization", getOrRefreshJwtToken())
|
||||
.header("File-Path", URLEncoder.encode(this.filePath, StandardCharsets.UTF_8)
|
||||
.header("File-Path", URLEncoder.encode(this.uploadPath, StandardCharsets.UTF_8)
|
||||
.replace("/", "%2F"))
|
||||
.header("overwrite", "true")
|
||||
.header("password", this.filePassword)
|
||||
@@ -225,7 +223,7 @@ public class AlistHost implements ResourcePackHost {
|
||||
}
|
||||
|
||||
private HttpRequest.BodyPublisher getRequestResourcePackDownloadLinkPost() {
|
||||
String body = "{\"path\":\"" + this.filePath + "\",\"password\":\"" + this.filePassword + "\"}";
|
||||
String body = "{\"path\":\"" + this.uploadPath + "\",\"password\":\"" + this.filePassword + "\"}";
|
||||
return HttpRequest.BodyPublishers.ofString(body);
|
||||
}
|
||||
|
||||
@@ -241,32 +239,6 @@ public class AlistHost implements ResourcePackHost {
|
||||
boolean isDir = dataObj.getAsJsonPrimitive("is_dir").getAsBoolean();
|
||||
if (!isDir) {
|
||||
String url = dataObj.getAsJsonPrimitive("raw_url").getAsString();
|
||||
if ((this.cachedSha1 == null || this.cachedSha1.isEmpty()) && this.disabledUpload) {
|
||||
try (HttpClient client = HttpClient.newBuilder().proxy(this.proxy).build()) {
|
||||
HttpRequest request = HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.GET()
|
||||
.build();
|
||||
HttpResponse<InputStream> responseHash = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
|
||||
try (InputStream inputStream = responseHash.body()) {
|
||||
MessageDigest md = MessageDigest.getInstance("SHA-1");
|
||||
byte[] buffer = new byte[8192];
|
||||
int len;
|
||||
while ((len = inputStream.read(buffer)) != -1) {
|
||||
md.update(buffer, 0, len);
|
||||
}
|
||||
byte[] digest = md.digest();
|
||||
this.cachedSha1 = HexFormat.of().formatHex(digest);
|
||||
saveCacheToDisk();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
future.completeExceptionally(new RuntimeException("Failed to calculate SHA-1 hash algorithm", e));
|
||||
return;
|
||||
}
|
||||
} catch (IOException | InterruptedException e) {
|
||||
future.completeExceptionally(new RuntimeException("Failed to retrieve remote resource pack for hashing", e));
|
||||
return;
|
||||
}
|
||||
}
|
||||
UUID uuid = UUID.nameUUIDFromBytes(Objects.requireNonNull(this.cachedSha1).getBytes(StandardCharsets.UTF_8));
|
||||
future.complete(List.of(new ResourcePackDownloadData(url, uuid, this.cachedSha1)));
|
||||
return;
|
||||
@@ -297,13 +269,12 @@ public class AlistHost implements ResourcePackHost {
|
||||
String filePassword = (String) arguments.getOrDefault("file-password", "");
|
||||
String otpCode = (String) arguments.get("otp-code");
|
||||
Duration jwtTokenExpiration = Duration.ofHours((int) arguments.getOrDefault("jwt-token-expiration", 48));
|
||||
String filePath = (String) arguments.get("file-path");
|
||||
if (filePath == null || filePath.isEmpty()) {
|
||||
throw new IllegalArgumentException("'file-path' cannot be empty for Alist host");
|
||||
String uploadPath = (String) arguments.get("upload-path");
|
||||
if (uploadPath == null || uploadPath.isEmpty()) {
|
||||
throw new IllegalArgumentException("'upload-path' cannot be empty for Alist host");
|
||||
}
|
||||
boolean disabledUpload = (boolean) arguments.getOrDefault("disabled-upload", false);
|
||||
ProxySelector proxy = MiscUtils.getProxySelector(arguments.get("proxy"));
|
||||
return new AlistHost(apiUrl, userName, password, filePassword, otpCode, jwtTokenExpiration, filePath, disabledUpload, proxy);
|
||||
return new AlistHost(apiUrl, userName, password, filePassword, otpCode, jwtTokenExpiration, uploadPath, proxy);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,9 +6,11 @@ import com.google.gson.reflect.TypeToken;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.util.GsonHelper;
|
||||
import net.momirealms.craftengine.core.util.HashUtils;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -89,6 +91,16 @@ public class DropboxHost implements ResourcePackHost {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.DROPBOX;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<List<ResourcePackDownloadData>> requestResourcePackDownloadLink(UUID player) {
|
||||
if (this.url == null) return CompletableFuture.completedFuture(Collections.emptyList());
|
||||
|
||||
@@ -3,6 +3,8 @@ package net.momirealms.craftengine.core.pack.host.impl;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
@@ -28,6 +30,16 @@ public class ExternalHost implements ResourcePackHost {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.EXTERNAL;
|
||||
}
|
||||
|
||||
public static class Factory implements ResourcePackHostFactory {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -4,8 +4,10 @@ import com.google.gson.reflect.TypeToken;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.util.GsonHelper;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -41,6 +43,16 @@ public class LobFileHost implements ResourcePackHost {
|
||||
this.readCacheFromDisk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.LOBFILE;
|
||||
}
|
||||
|
||||
public void readCacheFromDisk() {
|
||||
Path cachePath = CraftEngine.instance().dataFolderPath().resolve("lobfile.cache");
|
||||
if (!Files.exists(cachePath)) return;
|
||||
|
||||
@@ -3,6 +3,8 @@ package net.momirealms.craftengine.core.pack.host.impl;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
@@ -24,6 +26,16 @@ public class NoneHost implements ResourcePackHost {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.NONE;
|
||||
}
|
||||
|
||||
public static class Factory implements ResourcePackHostFactory {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5,11 +5,9 @@ import com.google.gson.reflect.TypeToken;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.util.GsonHelper;
|
||||
import net.momirealms.craftengine.core.util.HashUtils;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
import net.momirealms.craftengine.core.util.Tuple;
|
||||
import net.momirealms.craftengine.core.util.*;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
@@ -51,6 +49,16 @@ public class OneDriveHost implements ResourcePackHost {
|
||||
readCacheFromDisk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.ONEDRIVE;
|
||||
}
|
||||
|
||||
public void readCacheFromDisk() {
|
||||
Path cachePath = CraftEngine.instance().dataFolderPath().resolve("onedrive.cache");
|
||||
if (!Files.exists(cachePath)) return;
|
||||
|
||||
@@ -3,8 +3,10 @@ package net.momirealms.craftengine.core.pack.host.impl;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.util.HashUtils;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
|
||||
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
|
||||
@@ -63,6 +65,16 @@ public class S3Host implements ResourcePackHost {
|
||||
this.validity = validity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.S3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<List<ResourcePackDownloadData>> requestResourcePackDownloadLink(UUID player) {
|
||||
return this.s3AsyncClient.headObject(HeadObjectRequest.builder()
|
||||
|
||||
@@ -3,8 +3,10 @@ package net.momirealms.craftengine.core.pack.host.impl;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHost;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHostFactory;
|
||||
import net.momirealms.craftengine.core.pack.host.ResourcePackHosts;
|
||||
import net.momirealms.craftengine.core.plugin.CraftEngine;
|
||||
import net.momirealms.craftengine.core.plugin.config.Config;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
|
||||
import java.nio.file.Path;
|
||||
@@ -42,6 +44,16 @@ public class SelfHost implements ResourcePackHost {
|
||||
return future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canUpload() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return ResourcePackHosts.SELF;
|
||||
}
|
||||
|
||||
public static class Factory implements ResourcePackHostFactory {
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,4 +26,6 @@ public interface MessageConstants {
|
||||
TranslatableComponent.Builder COMMAND_RESOURCE_DISABLE_SUCCESS = Component.translatable().key("command.resource.disable.success");
|
||||
TranslatableComponent.Builder COMMAND_RESOURCE_DISABLE_FAILURE = Component.translatable().key("command.resource.disable.failure.unknown");
|
||||
TranslatableComponent.Builder COMMAND_RESOURCE_LIST = Component.translatable().key("command.resource.list");
|
||||
TranslatableComponent.Builder COMMAND_UPLOAD_FAILURE_NOT_SUPPORTED = Component.translatable().key("command.upload.failure.not_supported");
|
||||
TranslatableComponent.Builder COMMAND_UPLOAD_ON_PROGRESS = Component.translatable().key("command.upload.on_progress");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user