From 52f643398c3f709efdfec8b5d4e50a4685c21eda Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 25 Aug 2025 17:30:22 -0400 Subject: [PATCH] Fetch versions from Leaf download api --- .../paper-patches/features/0001-Rebrand.patch | 11 +++-- .../leaf/version/LeafVersionFetcher.java | 46 +++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/leaf-server/paper-patches/features/0001-Rebrand.patch b/leaf-server/paper-patches/features/0001-Rebrand.patch index 4acc35b5..cc18eb38 100644 --- a/leaf-server/paper-patches/features/0001-Rebrand.patch +++ b/leaf-server/paper-patches/features/0001-Rebrand.patch @@ -220,7 +220,7 @@ index 94a9ed024d3859793618152ea559a168bbcbb5e2..e60008693e017bec1b4eb49c84be3898 -. +. diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -index d0554ed6631535815e5932930911e3fe1dee8710..4608f94a2cc98e397aed41fa5c65749bdbe92ce7 100644 +index d0554ed6631535815e5932930911e3fe1dee8710..07b4e19ea672b38b8127da30b4111e903274f944 100644 --- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java @@ -9,6 +9,7 @@ import com.google.gson.JsonObject; @@ -239,7 +239,7 @@ index d0554ed6631535815e5932930911e3fe1dee8710..4608f94a2cc98e397aed41fa5c65749b import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; -@@ -30,58 +32,34 @@ import org.slf4j.Logger; +@@ -30,60 +32,36 @@ import org.slf4j.Logger; import static net.kyori.adventure.text.Component.text; import static net.kyori.adventure.text.format.TextColor.color; @@ -312,12 +312,15 @@ index d0554ed6631535815e5932930911e3fe1dee8710..4608f94a2cc98e397aed41fa5c65749b - }; + @Override + protected int fetchDistanceFromSiteApi(int jenkinsBuild) { -+ return fetchDistanceFromSiteApi(ServerBuildInfo.buildInfo(), jenkinsBuild); ++ return fetchDistanceFromPaperApi(ServerBuildInfo.buildInfo(), jenkinsBuild); } + // Gale end - branding changes - version fetcher - private static int fetchDistanceFromSiteApi(final ServerBuildInfo build, final int jenkinsBuild) { +- private static int fetchDistanceFromSiteApi(final ServerBuildInfo build, final int jenkinsBuild) { ++ private static int fetchDistanceFromPaperApi(final ServerBuildInfo build, final int jenkinsBuild) { try { + try (final BufferedReader reader = Resources.asCharSource( + URI.create("https://api.papermc.io/v2/projects/paper/versions/" + build.minecraftVersionId()).toURL(), @@ -105,42 +83,4 @@ public class PaperVersionFetcher implements VersionFetcher { return DISTANCE_ERROR; } diff --git a/leaf-server/src/main/java/org/dreeam/leaf/version/LeafVersionFetcher.java b/leaf-server/src/main/java/org/dreeam/leaf/version/LeafVersionFetcher.java index 16748a24..1ef8fe73 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/version/LeafVersionFetcher.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/version/LeafVersionFetcher.java @@ -1,7 +1,20 @@ package org.dreeam.leaf.version; +import com.google.common.io.Resources; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import io.papermc.paper.ServerBuildInfo; import org.galemc.gale.version.AbstractPaperVersionFetcher; +import java.io.BufferedReader; +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.stream.StreamSupport; + public class LeafVersionFetcher extends AbstractPaperVersionFetcher { public LeafVersionFetcher() { @@ -13,4 +26,37 @@ public class LeafVersionFetcher extends AbstractPaperVersionFetcher { "Leaf" ); } + + @Override + protected boolean canFetchDistanceFromSiteApi() { + return true; + } + + @Override + protected int fetchDistanceFromSiteApi(int jenkinsBuild) { + return fetchDistanceFromLeafApi(ServerBuildInfo.buildInfo(), jenkinsBuild); + } + + private static int fetchDistanceFromLeafApi(final ServerBuildInfo build, final int jenkinsBuild) { + try { + try (final BufferedReader reader = Resources.asCharSource( + URI.create("https://api.leafmc.one/v2/projects/leaf/versions/" + build.minecraftVersionId()).toURL(), + StandardCharsets.UTF_8 + ).openBufferedStream()) { + final JsonObject json = new Gson().fromJson(reader, JsonObject.class); + final JsonArray builds = json.getAsJsonArray("builds"); + final int latest = StreamSupport.stream(builds.spliterator(), false) + .mapToInt(JsonElement::getAsInt) + .max() + .orElseThrow(); + return latest - jenkinsBuild; + } catch (final JsonSyntaxException ex) { + LOGGER.error("Error parsing json from Leaf's downloads API", ex); + return DISTANCE_ERROR; + } + } catch (final IOException e) { + LOGGER.error("Error while parsing version", e); + return DISTANCE_ERROR; + } + } }