Inceptum/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/FabricMetaApi.java

79 lines
4.0 KiB
Java

package io.gitlab.jfronny.inceptum.launcher.api;
import io.gitlab.jfronny.gson.reflect.TypeToken;
import io.gitlab.jfronny.inceptum.common.Net;
import io.gitlab.jfronny.inceptum.common.api.MavenApi;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.*;
import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.*;
public class FabricMetaApi {
private static final Type fabricLoaderVersionListType = new TypeToken<List<FabricVersionLoaderInfo>>() {}.getType();
private static final String META_URL = "https://meta.fabricmc.net/";
public static List<FabricVersionLoaderInfo> getLoaderVersions(VersionsListInfo version) {
try {
return Net.downloadObject(META_URL + "v2/versions/loader/" + version.id, fabricLoaderVersionListType);
} catch (IOException e) {
throw new RuntimeException("Could not get fabric loader versions", e);
}
}
public static FabricVersionLoaderInfo getLoaderVersion(String gameVersion, String fabricVersion) throws IOException {
return Net.downloadObject(META_URL + "v2/versions/loader/" + gameVersion + "/" + fabricVersion, FabricVersionLoaderInfo.WithMeta.class);
}
public static VersionInfo addFabric(VersionInfo version, String fabricVersion, FabricVersionInfoType type) throws IOException {
VersionInfo result = version.clone();
FabricVersionLoaderInfo ver = getLoaderVersion(version.id, fabricVersion);
if (!(ver instanceof FabricVersionLoaderInfo.WithMeta verWithMeta))
throw new IOException("Doesn't hold metadata");
FabricVersionLoaderInfo.WithMeta.LauncherMeta meta = verWithMeta.launcherMeta;
if (meta.version != 1) throw new IOException("Unsupported fabric launcherMeta version: " + meta.version);
result.mainClass = type == FabricVersionInfoType.Server ? meta.mainClass.server : meta.mainClass.client;
List<VersionInfo.Library> libs = new ArrayList<>(version.libraries);
for (FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library : meta.libraries.common)
libs.add(convertLib(library));
if (type == FabricVersionInfoType.Client || type == FabricVersionInfoType.Both) {
for (FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library : meta.libraries.client)
libs.add(convertLib(library));
}
if (type == FabricVersionInfoType.Server || type == FabricVersionInfoType.Both) {
for (FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library : meta.libraries.server)
libs.add(convertLib(library));
}
var floader = new FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library();
floader.name = "net.fabricmc:fabric-loader:" + fabricVersion;
floader.url = "https://maven.fabricmc.net/";
libs.add(convertLib(floader));
floader.name = ver.intermediary.maven;
libs.add(convertLib(floader));
result.libraries = List.copyOf(libs);
result.id = GameVersionParser.floaderPrefix + fabricVersion + "-" + version.id;
return result;
}
private static VersionInfo.Library convertLib(FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library) {
VersionInfo.Library res = new VersionInfo.Library();
res.name = library.name;
res.rules = new Rules(true);
res.natives = new HashMap<>();
res.downloads = new VersionInfo.Library.Downloads();
res.downloads.classifiers = null;
res.downloads.artifact = new VersionInfo.Library.Downloads.Artifact();
res.downloads.artifact.path = MavenApi.mavenNotationToJarPath(library.name);
res.downloads.artifact.size = -1;
res.downloads.artifact.sha1 = null;
res.downloads.artifact.url = library.url + res.downloads.artifact.path;
return res;
}
public enum FabricVersionInfoType {
Client, Server, Both
}
}