From 72b6031ebc1ab5d49bea21d7a6816c0af41bc6b8 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Mar 2025 18:47:00 +0100 Subject: [PATCH] quick-e2e: Add OPsService to manage player OPs and integrate Mojang API for UUID retrieval --- tools/quick-e2e/http/mojang-api.http | 5 ++ .../main/java/de/oliver/quicke2e/Main.java | 4 ++ .../steps/ops/MojangUuidResponse.java | 7 ++ .../oliver/quicke2e/steps/ops/OPConfig.java | 9 +++ .../oliver/quicke2e/steps/ops/OPsService.java | 64 +++++++++++++++++++ 5 files changed, 89 insertions(+) create mode 100644 tools/quick-e2e/http/mojang-api.http create mode 100644 tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/MojangUuidResponse.java create mode 100644 tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPConfig.java create mode 100644 tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPsService.java diff --git a/tools/quick-e2e/http/mojang-api.http b/tools/quick-e2e/http/mojang-api.http new file mode 100644 index 00000000..5dc81d81 --- /dev/null +++ b/tools/quick-e2e/http/mojang-api.http @@ -0,0 +1,5 @@ +### Query player's UUID +GET https://api.mojang.com/users/profiles/minecraft/OliverHD + +### Query player's UUID 2 +GET https://api.minecraftservices.com/minecraft/profile/lookup/name/OliverHD \ No newline at end of file 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 1499c20f..4d9c281f 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 @@ -3,6 +3,7 @@ package de.oliver.quicke2e; import de.oliver.quicke2e.config.Configuration; import de.oliver.quicke2e.config.Context; import de.oliver.quicke2e.steps.eula.EulaService; +import de.oliver.quicke2e.steps.ops.OPsService; import de.oliver.quicke2e.steps.paper.PaperDownloadService; import de.oliver.quicke2e.steps.startScript.StartScriptService; import de.oliver.quicke2e.steps.startServer.StartServerService; @@ -30,6 +31,9 @@ public class Main { eula.setEulaToTrue(String.format("%s/eula.txt", context.serverEnvPath().toString())); } + OPsService ops = new OPsService(); + ops.makePlayersOP(context); + StartScriptService startScript = new StartScriptService(); startScript.writeStartScript(context); diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/MojangUuidResponse.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/MojangUuidResponse.java new file mode 100644 index 00000000..3f103cd8 --- /dev/null +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/MojangUuidResponse.java @@ -0,0 +1,7 @@ +package de.oliver.quicke2e.steps.ops; + +public record MojangUuidResponse( + String name, + String id +) { +} diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPConfig.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPConfig.java new file mode 100644 index 00000000..472be1c0 --- /dev/null +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPConfig.java @@ -0,0 +1,9 @@ +package de.oliver.quicke2e.steps.ops; + +public record OPConfig( + String uuid, + String name, + int level, + boolean bypassesPlayerLimit +) { +} diff --git a/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPsService.java b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPsService.java new file mode 100644 index 00000000..3e43824a --- /dev/null +++ b/tools/quick-e2e/src/main/java/de/oliver/quicke2e/steps/ops/OPsService.java @@ -0,0 +1,64 @@ +package de.oliver.quicke2e.steps.ops; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import de.oliver.quicke2e.config.Context; + +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.file.Files; +import java.nio.file.Path; + +public class OPsService { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private final HttpClient client; + + public OPsService() { + this.client = HttpClient.newHttpClient(); + } + + public void makePlayersOP(Context context) { + OPConfig[] opConfig = new OPConfig[context.configuration().opPlayers().length]; + for (int i = 0; i < context.configuration().opPlayers().length; i++) { + String username = context.configuration().opPlayers()[i]; + String uuid = getUUID(username); + opConfig[i] = new OPConfig( + uuid, + username, + 4, + true + ); + } + + String json = GSON.toJson(opConfig); + + Path opsFilePath = context.serverEnvPath().resolve("ops.json"); + try { + Files.writeString(opsFilePath, json); + } catch (java.io.IOException e) { + e.printStackTrace(); + } + } + + private String getUUID(String username) { + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(java.net.URI.create(String.format("https://api.mojang.com/users/profiles/minecraft/%s", username))) + .build(); + + HttpResponse resp = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).join(); + MojangUuidResponse mojangUuidResponse = GSON.fromJson(resp.body(), MojangUuidResponse.class); + + return transformUUID(mojangUuidResponse.id()); + } + + private String transformUUID(String hexUUID) { + return hexUUID.replaceFirst( + "([0-9a-fA-F]{8})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]{12})", + "$1-$2-$3-$4-$5" + ); + } + +}