Skip to content

Commit

Permalink
Add: Fabric and Quilt auto download
Browse files Browse the repository at this point in the history
  • Loading branch information
xfl03 committed Jan 31, 2023
1 parent cbac92a commit 43ed963
Show file tree
Hide file tree
Showing 14 changed files with 308 additions and 91 deletions.
13 changes: 13 additions & 0 deletions jmccc-cli/src/main/java/jmccc/cli/Main.java
Expand Up @@ -33,6 +33,7 @@ public static void main(String... args) throws Exception {
//Check special version
switch (version) {
case "latest":
case "stable":
case "release":
version = SimpleDownloader.getLatestRelease();
break;
Expand All @@ -45,6 +46,18 @@ public static void main(String... args) throws Exception {
case "liteloader":
version = ModLoaderDownloader.getLatestLiteLoader().getVersionName();
break;
case "fabric":
version = ModLoaderDownloader.getLatestFabric().getVersionName();
break;
case "fabric-snapshot":
version = ModLoaderDownloader.getLatestFabricSnapshot().getVersionName();
break;
case "quilt":
version = ModLoaderDownloader.getLatestQuilt().getVersionName();
break;
case "quilt-snapshot":
version = ModLoaderDownloader.getLatestQuiltSnapshot().getVersionName();
break;
}
System.out.println("Version: " + version);

Expand Down
Expand Up @@ -3,14 +3,14 @@
import org.to2mbn.jmccc.internal.org.json.JSONObject;
import org.to2mbn.jmccc.mcdownloader.download.combine.CombinedDownloadTask;
import org.to2mbn.jmccc.mcdownloader.download.tasks.MemoryDownloadTask;
import org.to2mbn.jmccc.mcdownloader.download.tasks.ResultProcessor;
import org.to2mbn.jmccc.mcdownloader.provider.DefaultLayoutProvider;
import org.to2mbn.jmccc.mcdownloader.provider.JsonDecoder;
import org.to2mbn.jmccc.mcdownloader.provider.fabric.FabricDownloadSource;
import org.to2mbn.jmccc.mcdownloader.provider.forge.ForgeDownloadSource;
import org.to2mbn.jmccc.mcdownloader.provider.liteloader.LiteloaderDownloadSource;
import org.to2mbn.jmccc.mcdownloader.provider.liteloader.LiteloaderVersion;

public class BmclApiProvider extends DefaultLayoutProvider implements ForgeDownloadSource, LiteloaderDownloadSource {
public class BmclApiProvider extends DefaultLayoutProvider implements ForgeDownloadSource, LiteloaderDownloadSource, FabricDownloadSource {

@Override
protected String getLibraryBaseURL() {
Expand Down Expand Up @@ -50,4 +50,9 @@ public CombinedDownloadTask<JSONObject> liteloaderSnapshotVersionJson(Liteloader
.andThen(installProfile -> installProfile.getJSONObject("versionInfo"))
.cacheable());
}

@Override
public String getFabricMetaBaseUrl() {
return "https://bmclapi2.bangbang93.com/fabric-meta/";
}
}
@@ -1,18 +1,34 @@
package jmccc.cli.download;

import org.to2mbn.jmccc.mcdownloader.provider.fabric.FabricVersion;
import org.to2mbn.jmccc.mcdownloader.provider.forge.ForgeVersion;
import org.to2mbn.jmccc.mcdownloader.provider.liteloader.LiteloaderVersion;

import java.util.concurrent.ExecutionException;

public class ModLoaderDownloader {
public static ForgeVersion getLatestForge() throws ExecutionException, InterruptedException {
return SimpleDownloader.downloader.download(SimpleDownloader.forgeProvider.forgeVersionList(), null)
.get().getLatest();
return SimpleDownloader.get(SimpleDownloader.forgeProvider.forgeVersionList()).getLatest();
}

public static LiteloaderVersion getLatestLiteLoader() throws ExecutionException, InterruptedException {
return SimpleDownloader.downloader.download(SimpleDownloader.liteloaderProvider.liteloaderVersionList(), null)
.get().getSnapshot("1.12.2");
return SimpleDownloader.get(SimpleDownloader.liteloaderProvider.liteloaderVersionList())
.getSnapshot("1.12.2");
}

public static FabricVersion getLatestFabric() throws ExecutionException, InterruptedException {
return SimpleDownloader.get(SimpleDownloader.fabricProvider.fabricVersionList()).getLatestRelease();
}

public static FabricVersion getLatestFabricSnapshot() throws ExecutionException, InterruptedException {
return SimpleDownloader.get(SimpleDownloader.fabricProvider.fabricVersionList()).getLatestSnapshot();
}

public static FabricVersion getLatestQuilt() throws ExecutionException, InterruptedException {
return SimpleDownloader.get(SimpleDownloader.quiltProvider.fabricVersionList()).getLatestRelease();
}

public static FabricVersion getLatestQuiltSnapshot() throws ExecutionException, InterruptedException {
return SimpleDownloader.get(SimpleDownloader.quiltProvider.fabricVersionList()).getLatestSnapshot();
}
}
Expand Up @@ -23,7 +23,9 @@ public void cancelled() {

@Override
public void updateProgress(long done, long total) {
System.out.printf("Progress: %d/%d\n", done, total);
if (Math.random() < 0.33) {
System.out.printf("Progress: %d/%d\n", done, total);
}
}

@Override
Expand Down
11 changes: 11 additions & 0 deletions jmccc-cli/src/main/java/jmccc/cli/download/SimpleDownloader.java
Expand Up @@ -2,9 +2,12 @@

import org.to2mbn.jmccc.mcdownloader.MinecraftDownloader;
import org.to2mbn.jmccc.mcdownloader.MinecraftDownloaderBuilder;
import org.to2mbn.jmccc.mcdownloader.download.combine.CombinedDownloadTask;
import org.to2mbn.jmccc.mcdownloader.provider.DownloadProviderChain;
import org.to2mbn.jmccc.mcdownloader.provider.fabric.FabricDownloadProvider;
import org.to2mbn.jmccc.mcdownloader.provider.forge.ForgeDownloadProvider;
import org.to2mbn.jmccc.mcdownloader.provider.liteloader.LiteloaderDownloadProvider;
import org.to2mbn.jmccc.mcdownloader.provider.quilt.QuiltDownloadProvider;
import org.to2mbn.jmccc.option.MinecraftDirectory;
import org.to2mbn.jmccc.version.Library;
import org.to2mbn.jmccc.version.Version;
Expand All @@ -15,12 +18,16 @@ public class SimpleDownloader {
public static BmclApiProvider bmclApiProvider = new BmclApiProvider();
public static ForgeDownloadProvider forgeProvider = new ForgeDownloadProvider(bmclApiProvider);
public static LiteloaderDownloadProvider liteloaderProvider = new LiteloaderDownloadProvider(bmclApiProvider);
public static FabricDownloadProvider fabricProvider = new FabricDownloadProvider();
public static FabricDownloadProvider quiltProvider = new QuiltDownloadProvider();

public static MinecraftDownloader downloader = MinecraftDownloaderBuilder.create()
.providerChain(DownloadProviderChain.create()
.baseProvider(bmclApiProvider)
.addProvider(forgeProvider)
.addProvider(liteloaderProvider)
.addProvider(fabricProvider)
.addProvider(quiltProvider)
)
.build();

Expand All @@ -39,4 +46,8 @@ public static Version download(MinecraftDirectory dir, String version) throws Ex
public static void downloadLibrary(MinecraftDirectory dir, Library lib) throws ExecutionException, InterruptedException {
downloader.download(downloader.getProvider().library(dir, lib), new SimpleCallback<>()).get();
}

public static <T> T get(CombinedDownloadTask<T> task) throws ExecutionException, InterruptedException {
return SimpleDownloader.downloader.download(task, new SimpleCallback<>()).get();
}
}
Expand Up @@ -21,6 +21,8 @@ public final class CacheNames {
// Liteloader caches
public static final String LITELOADER_VERSION_LIST = PREFIX_DYNAMIC + "liteloader.versionList";
public static final String LITELOADER_VERSION_JSON = PREFIX_DYNAMIC + "liteloader.versionJson";
// Fabric caches
public static final String FABRIC_VERSION_LIST = PREFIX_DYNAMIC + "fabric.versionList";

// Maven
public static final String M2_METADATA = PREFIX_DYNAMIC + "m2.metadata";
Expand Down
Expand Up @@ -42,7 +42,7 @@ public T completed() throws Exception {
ByteBuffer bb = ByteBuffer.wrap(buf);
int read;
while ((read = gzin.read(buf)) != -1) {
bb.position(0);
((java.nio.Buffer) bb).position(0);
bb.limit(read);
underlying.receiveData(bb);
}
Expand Down
@@ -0,0 +1,50 @@
package org.to2mbn.jmccc.mcdownloader.provider.fabric;

import org.to2mbn.jmccc.mcdownloader.download.cache.CacheNames;
import org.to2mbn.jmccc.mcdownloader.download.combine.CombinedDownloadTask;
import org.to2mbn.jmccc.mcdownloader.download.tasks.MemoryDownloadTask;
import org.to2mbn.jmccc.mcdownloader.provider.*;
import org.to2mbn.jmccc.option.MinecraftDirectory;

public class FabricDownloadProvider extends AbstractMinecraftDownloadProvider implements ExtendedDownloadProvider {
private MinecraftDownloadProvider upstreamProvider;
private FabricDownloadSource source;

public FabricDownloadProvider(FabricDownloadSource source) {
this.source = source;
}

public FabricDownloadProvider() {
this(new FabricDownloadSource.Default());
}

@Override
public void setUpstreamProvider(MinecraftDownloadProvider upstreamProvider) {
this.upstreamProvider = upstreamProvider;
}

public CombinedDownloadTask<FabricVersionList> fabricVersionList() {
return CombinedDownloadTask.single(new MemoryDownloadTask(source.getFabricVersionsUrl())
.andThen(new JsonDecoder())
.andThen(FabricVersionList::fromJson)
.cacheable()
.cachePool(CacheNames.FABRIC_VERSION_LIST));
}

@Override
public CombinedDownloadTask<String> gameVersionJson(MinecraftDirectory mcdir, String version) {
FabricVersion fabricVersion = FabricVersion.resolve(getLoaderName(), version);
if (fabricVersion == null) {
return null;
}
String url = source.getFabricProfileUrl(
fabricVersion.getMinecraftVersion(), fabricVersion.getFabricLoaderVersion());
return CombinedDownloadTask.single(new MemoryDownloadTask(url))
.andThen(new JsonDecoder())
.andThen(new VersionJsonInstaller(mcdir));
}

protected String getLoaderName() {
return "fabric";
}
}
@@ -0,0 +1,19 @@
package org.to2mbn.jmccc.mcdownloader.provider.fabric;

public interface FabricDownloadSource {
default String getFabricMetaBaseUrl() {
return "https://meta.fabricmc.net/v2/";
}

default String getFabricVersionsUrl() {
return getFabricMetaBaseUrl() + "versions";
}

default String getFabricProfileUrl(String minecraftVersion, String loaderVersion) {
return String.format("%sversions/loader/%s/%s/profile/json", getFabricMetaBaseUrl(),
minecraftVersion, loaderVersion);
}

class Default implements FabricDownloadSource {
}
}
@@ -0,0 +1,42 @@
package org.to2mbn.jmccc.mcdownloader.provider.fabric;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FabricVersion {
private final String minecraftVersion;
private final String fabricLoaderVersion;
private final String loaderName;

public FabricVersion(String minecraftVersion, String fabricLoaderVersion, String loaderName) {
this.minecraftVersion = minecraftVersion;
this.fabricLoaderVersion = fabricLoaderVersion;
this.loaderName = loaderName;
}

private static final Pattern PATTERN = Pattern.compile("^([\\w.\\-]+)-loader-([\\w.\\-]+)-([\\w.\\-]+)$");

public static FabricVersion resolve(String loaderName, String version) {
Matcher m = PATTERN.matcher(version);
if (m.matches()) {
//Check loader name
if (!loaderName.equals(m.group(1))) {
return null;
}
return new FabricVersion(m.group(3), m.group(2), m.group(1));
}
return null;
}

public String getVersionName() {
return loaderName + "-loader-" + fabricLoaderVersion + "-" + minecraftVersion;
}

public String getMinecraftVersion() {
return minecraftVersion;
}

public String getFabricLoaderVersion() {
return fabricLoaderVersion;
}
}
@@ -0,0 +1,63 @@
package org.to2mbn.jmccc.mcdownloader.provider.fabric;

import org.to2mbn.jmccc.internal.org.json.JSONArray;
import org.to2mbn.jmccc.internal.org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class FabricVersionList {
private final List<String> minecraftReleaseVersions;
private final List<String> minecraftSnapshotVersions;
private final List<String> fabricLoaderVersions;
private final String loaderName;

public FabricVersionList(List<String> minecraftReleaseVersions, List<String> minecraftSnapshotVersions, List<String> fabricLoaderVersions, String loaderName) {
this.minecraftReleaseVersions = minecraftReleaseVersions;
this.minecraftSnapshotVersions = minecraftSnapshotVersions;
this.fabricLoaderVersions = fabricLoaderVersions;
this.loaderName = loaderName;
}

public FabricVersion getLatest(String minecraftVersion) {
return new FabricVersion(minecraftVersion, fabricLoaderVersions.get(0), loaderName);
}

public FabricVersion getLatestRelease() {
return new FabricVersion(minecraftReleaseVersions.get(0), fabricLoaderVersions.get(0), loaderName);
}

public FabricVersion getLatestSnapshot() {
return new FabricVersion(minecraftSnapshotVersions.get(0), fabricLoaderVersions.get(0), loaderName);
}

public static FabricVersionList fromJson(JSONObject json) {
JSONArray game = json.getJSONArray("game");
List<String> minecraftReleaseVersions = new ArrayList<>();
List<String> minecraftSnapshotVersions = new ArrayList<>();
for (Object obj : game) {
JSONObject it = (JSONObject) obj;
(it.getBoolean("stable") ? minecraftReleaseVersions : minecraftSnapshotVersions)
.add(it.getString("version"));
}

JSONArray loader = json.getJSONArray("loader");
List<String> fabricLoaderVersions = new ArrayList<>();
String loaderName = "fabric";
for (Object obj : loader) {
JSONObject it = (JSONObject) obj;
if (it.getString("maven").contains("quilt")) {
loaderName = "quilt";
}
fabricLoaderVersions.add(it.getString("version"));
}

return new FabricVersionList(minecraftReleaseVersions, minecraftSnapshotVersions,
fabricLoaderVersions, loaderName);
}

@Override
public String toString() {
return "FabricVersionList{ Latest: " + fabricLoaderVersions.get(0) + " }";
}
}

0 comments on commit 43ed963

Please sign in to comment.