From 4c4e617bf5472babc8c2d4b74ad23b2a2fa219eb Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Mar 2025 17:50:00 +0100 Subject: [PATCH] quick-e2e: Implement PaperDownloadService and configuration management for server file downloads --- .gitignore | 4 +- tools/quick-e2e/build.gradle.kts | 4 +- .../main/java/de/oliver/quicke2e/Main.java | 14 +++++ .../oliver/quicke2e/config/Configuration.java | 12 ++++ .../oliver/quicke2e/paper/BuildsResponse.java | 11 ++++ .../quicke2e/paper/PaperDownloadService.java | 63 +++++++++++++++++++ 6 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 tools/quick-e2e/src/main/java/de/oliver/quicke2e/config/Configuration.java create mode 100644 tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/BuildsResponse.java create mode 100644 tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/PaperDownloadService.java diff --git a/.gitignore b/.gitignore index 7223073b..36f6c75b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ docs/output/ backend/src/main/resources/frontend backend/out logger/out -sdks/java-sdk/out \ No newline at end of file +sdks/java-sdk/out + +servers \ No newline at end of file diff --git a/tools/quick-e2e/build.gradle.kts b/tools/quick-e2e/build.gradle.kts index 4920448d..c48fc6db 100644 --- a/tools/quick-e2e/build.gradle.kts +++ b/tools/quick-e2e/build.gradle.kts @@ -8,7 +8,7 @@ group = "de.oliver" description = "Tool to setup a complete environment for testing" java { - toolchain.languageVersion.set(JavaLanguageVersion.of(21)) + toolchain.languageVersion.set(JavaLanguageVersion.of(23)) } repositories { @@ -42,7 +42,7 @@ tasks { // Set the release flag. This configures what version bytecode the compiler will emit, as well as what JDK APIs are usable. // See https://openjdk.java.net/jeps/247 for more information. - options.release.set(21) + options.release.set(23) } java { diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/Main.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/Main.java index 5e950383..cb9bfc87 100644 --- a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/Main.java +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/Main.java @@ -1,9 +1,23 @@ package de.oliver.quicke2e; +import de.oliver.quicke2e.config.Configuration; +import de.oliver.quicke2e.paper.PaperDownloadService; + public class Main { public static void main(String[] args) { + Configuration config = new Configuration( + "paper", + "1.21.4", + "latest", + new String[]{}, + true, + new String[]{"OliverHD"}, + "25565" + ); + PaperDownloadService paper = new PaperDownloadService(); + paper.downloadServerFile(config.type(), config.version(), config.build()); } } diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/config/Configuration.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/config/Configuration.java new file mode 100644 index 00000000..88ffb529 --- /dev/null +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/config/Configuration.java @@ -0,0 +1,12 @@ +package de.oliver.quicke2e.config; + +public record Configuration( + String type, + String version, + String build, + String[] plugins, + boolean eula, + String[] opPlayers, + String port +) { +} diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/BuildsResponse.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/BuildsResponse.java new file mode 100644 index 00000000..dc5aee8b --- /dev/null +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/BuildsResponse.java @@ -0,0 +1,11 @@ +package de.oliver.quicke2e.paper; + +import com.google.gson.annotations.SerializedName; + +public record BuildsResponse( + @SerializedName("project_id") String projectID, + @SerializedName("project_name") String projectName, + String version, + String[] builds +) { +} diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/PaperDownloadService.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/PaperDownloadService.java new file mode 100644 index 00000000..83cf9d52 --- /dev/null +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/paper/PaperDownloadService.java @@ -0,0 +1,63 @@ +package de.oliver.quicke2e.paper; + +import com.google.gson.Gson; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class PaperDownloadService { + + private static final Gson GSON = new Gson(); + private static final String BASE_URL = "https://api.papermc.io/v2"; + private static final String destination = "servers"; + + private final HttpClient client; + + public PaperDownloadService() { + this.client = HttpClient.newHttpClient(); + } + + public void downloadServerFile( + String project, + String version, + String build + ) { + Path folderPath = Paths.get(String.format("%s/%s_%s_%s/", destination, project, version, build)); + if (!folderPath.toFile().exists()) { + folderPath.toFile().mkdirs(); + } + + String buildNumber = build.equals("latest") ? getLatestBuildNumber(project, version) : build; + + Path filePath = Paths.get(String.format("%s/%s_%s_%s/%s-%s-%s.jar", destination, project, version, build, project, version, buildNumber)); + + HttpRequest req = HttpRequest.newBuilder() + .GET() + .uri(URI.create(String.format("%s/projects/%s/versions/%s/builds/%s/downloads/%s-%s-%s.jar", BASE_URL, project, version, buildNumber, project, version, buildNumber))) + .build(); + + client.sendAsync(req, HttpResponse.BodyHandlers.ofFile(filePath)) + .thenAccept(_ -> System.out.println("Downloaded server file to " + filePath)) + .join(); + } + + private String getLatestBuildNumber( + String project, + String version + ) { + HttpRequest req = HttpRequest.newBuilder() + .GET() + .uri(URI.create(String.format("%s/projects/%s/versions/%s", BASE_URL, project, version))) + .build(); + + HttpResponse resp = client.sendAsync(req, HttpResponse.BodyHandlers.ofString()).join(); + BuildsResponse builds = GSON.fromJson(resp.body(), BuildsResponse.class); + + return builds.builds()[builds.builds().length - 1]; + } + +}