Inceptum/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/Importer.java

84 lines
3.6 KiB
Java
Raw Normal View History

2022-09-19 21:26:23 +02:00
package io.gitlab.jfronny.inceptum.launcher.system.importer;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
2022-09-19 21:26:23 +02:00
import io.gitlab.jfronny.commons.io.JFiles;
2022-11-02 00:38:04 +01:00
import io.gitlab.jfronny.commons.throwable.ThrowingFunction;
2022-09-19 21:26:23 +02:00
import io.gitlab.jfronny.inceptum.common.MetaHolder;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.api.FabricMetaApi;
import io.gitlab.jfronny.inceptum.launcher.api.McApi;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
2022-10-27 20:54:55 +02:00
import io.gitlab.jfronny.inceptum.launcher.system.instance.*;
import io.gitlab.jfronny.inceptum.launcher.system.setup.Steps;
import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessState;
2022-09-19 21:26:23 +02:00
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public abstract class Importer<T> {
private final String name;
private final String manifestFile;
2022-11-02 00:38:04 +01:00
private final ThrowingFunction<Path, T, IOException> manifestClass;
2022-09-19 21:26:23 +02:00
2022-11-02 00:38:04 +01:00
public Importer(String name, String manifestFile, ThrowingFunction<Path, T, IOException> manifestClass) {
2022-09-19 21:26:23 +02:00
this.name = name;
this.manifestFile = manifestFile;
this.manifestClass = manifestClass;
}
public boolean canImport(Path root) {
return Files.exists(root.resolve(manifestFile));
}
protected abstract IntermediaryManifest validateManifest(T manifest, Path sourceRoot) throws IOException;
2022-09-19 21:26:23 +02:00
protected abstract void downloadMods(T manifest, Path instanceDir, ProcessState state) throws IOException;
private String createVersionString(String gameVersion, @Nullable String fabricVersion) throws IOException {
if (McApi.getVersions().versions.stream().filter(v -> v.id.equals(gameVersion)).findFirst().isEmpty) {
2022-09-19 21:26:23 +02:00
throw new IOException("Invalid minecraft version: " + gameVersion);
}
if (fabricVersion == null) {
return gameVersion;
} else {
FabricMetaApi.getLoaderVersion(gameVersion, fabricVersion);
2022-10-28 14:56:44 +02:00
return GameVersionParser.createVersionWithFabric(gameVersion, fabricVersion);
2022-09-19 21:26:23 +02:00
}
}
public Path importPack(Path sourceRoot, ProcessState state) throws IOException {
state.incrementStep("Generating skeleton");
2022-11-02 00:38:04 +01:00
T manifest = manifestClass.apply(sourceRoot.resolve(manifestFile));
2022-09-19 21:26:23 +02:00
IntermediaryManifest man = validateManifest(manifest, sourceRoot);
String name = man.name;
2022-09-19 21:26:23 +02:00
if (name == null || !Utils.VALID_FILENAME.matcher(name).matches()) name = "New Pack";
name = InstanceNameTool.getNextValid(name);
final Path iDir = MetaHolder.INSTANCE_DIR.resolve(name).toAbsolutePath().normalize();
Instance.setSetupLock(iDir, true);
2022-09-19 21:26:23 +02:00
InstanceMeta meta = new InstanceMeta();
meta.version = createVersionString(man.gameVersion, man.fabricVersion);
GC_InstanceMeta.write(meta, iDir.resolve(InstanceList.INSTANCE_CONFIG_NAME));
2022-09-19 21:26:23 +02:00
state.incrementStep("Downloading mods");
downloadMods(manifest, iDir, state);
state.incrementStep("Adding overrides");
if (man.overridesPath() != null) {
Path overridesPath = sourceRoot.resolve(man.overridesPath);
2022-09-19 21:26:23 +02:00
JFiles.listTo(overridesPath, path -> {
JFiles.copyRecursive(path, iDir.resolve(path.fileName.toString()));
2022-09-19 21:26:23 +02:00
});
}
Instance.setSetupLock(iDir, false);
Steps.reDownload(InstanceList.read(iDir), state);
2022-09-19 21:26:23 +02:00
return iDir;
}
public String getName() {
return name;
}
}