diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java index 33d11327e..a0a677f25 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java @@ -22,7 +22,7 @@ import org.jackhuang.hmcl.download.fabric.FabricVersionList; import org.jackhuang.hmcl.download.forge.ForgeBMCLVersionList; import org.jackhuang.hmcl.download.game.GameVersionList; import org.jackhuang.hmcl.download.liteloader.LiteLoaderVersionList; -import org.jackhuang.hmcl.download.neoforge.NeoForgeBMCLVersionList; +import org.jackhuang.hmcl.download.neoforge.NeoForgeOfficialVersionList; import org.jackhuang.hmcl.download.optifine.OptiFineBMCLVersionList; import org.jackhuang.hmcl.download.quilt.QuiltAPIVersionList; import org.jackhuang.hmcl.download.quilt.QuiltVersionList; @@ -36,20 +36,21 @@ public class MojangDownloadProvider implements DownloadProvider { private final FabricVersionList fabric; private final FabricAPIVersionList fabricApi; private final ForgeBMCLVersionList forge; - private final NeoForgeBMCLVersionList neoforge; + private final NeoForgeOfficialVersionList neoforge; private final LiteLoaderVersionList liteLoader; private final OptiFineBMCLVersionList optifine; private final QuiltVersionList quilt; private final QuiltAPIVersionList quiltApi; public MojangDownloadProvider() { + // If there is no official download channel available, fallback to BMCLAPI. String apiRoot = "https://bmclapi2.bangbang93.com"; this.game = new GameVersionList(this); this.fabric = new FabricVersionList(this); this.fabricApi = new FabricAPIVersionList(this); this.forge = new ForgeBMCLVersionList(apiRoot); - this.neoforge = new NeoForgeBMCLVersionList(apiRoot); + this.neoforge = new NeoForgeOfficialVersionList(this); this.liteLoader = new LiteLoaderVersionList(this); this.optifine = new OptiFineBMCLVersionList(apiRoot); this.quilt = new QuiltVersionList(this); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java new file mode 100644 index 000000000..2515fb82d --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java @@ -0,0 +1,75 @@ +package org.jackhuang.hmcl.download.neoforge; + +import org.jackhuang.hmcl.download.DownloadProvider; +import org.jackhuang.hmcl.download.VersionList; +import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.io.HttpRequest; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static org.jackhuang.hmcl.util.Lang.wrap; + +public final class NeoForgeOfficialVersionList extends VersionList { + private final DownloadProvider downloadProvider; + + public NeoForgeOfficialVersionList(DownloadProvider downloadProvider) { + this.downloadProvider = downloadProvider; + } + + @Override + public boolean hasType() { + return false; + } + + private static final String OLD_URL = "https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge"; + + private static final String META_URL = "https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge"; + + @Override + public CompletableFuture refreshAsync() { + return CompletableFuture.supplyAsync(wrap(() -> new OfficialAPIResult[]{ + HttpRequest.GET(downloadProvider.injectURL(OLD_URL)).getJson(OfficialAPIResult.class), + HttpRequest.GET(downloadProvider.injectURL(META_URL)).getJson(OfficialAPIResult.class) + })).thenAccept(results -> { + lock.writeLock().lock(); + + try { + versions.clear(); + + for (String version : results[0].versions) { + versions.put("1.20.1", new NeoForgeRemoteVersion( + "1.20.1", StringUtils.removePrefix(version, "1.20.1-"), + Lang.immutableListOf( + downloadProvider.injectURL("https://maven.neoforged.net/releases/net/neoforged/forge/" + version + "/forge-" + version + "-installer.jar") + ) + )); + } + + for (String version : results[1].versions) { + String mcVersion = "1." + version.substring(0, version.indexOf('.', version.indexOf('.') + 1)); + versions.put(mcVersion, new NeoForgeRemoteVersion( + mcVersion, version, + Lang.immutableListOf( + downloadProvider.injectURL("https://maven.neoforged.net/releases/net/neoforged/neoforge/" + version + "/neoforge-" + version + "-installer.jar") + ) + )); + } + } finally { + lock.writeLock().unlock(); + } + }); + } + + private static final class OfficialAPIResult { + private final boolean isSnapshot; + + private final List versions; + + public OfficialAPIResult(boolean isSnapshot, List versions) { + this.isSnapshot = isSnapshot; + this.versions = versions; + } + } +}