Inceptum/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/MdsMod.java

137 lines
4.3 KiB
Java

package io.gitlab.jfronny.inceptum.launcher.system.mds;
import io.gitlab.jfronny.commons.io.JFiles;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.*;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
import org.jetbrains.annotations.Nullable;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Set;
import java.util.stream.Collectors;
public class MdsMod extends Mod {
private final ProtoInstance instance;
private final Path imodPath;
private final Path jarPath;
private final boolean managedJar;
private final ModMeta meta;
private final @Nullable FabricModJson fmj;
MdsMod(ProtoInstance instance, Path imodPath, Path jarPath, boolean managedJar, ModMeta meta, @Nullable FabricModJson fmj) {
this.instance = instance;
this.imodPath = imodPath;
this.jarPath = jarPath;
this.managedJar = managedJar;
this.meta = meta;
this.fmj = fmj;
}
@Override
public String getName() {
String fileName = imodPath.getFileName().toString();
if (fmj == null) return fileName;
String name = fmj.name == null ? fmj.id == null ? fileName : fmj.id : fmj.name;
if (fmj.version != null) name += ' ' + fmj.version;
return name;
}
@Override
public String[] getDescription() {
if (fmj != null && fmj.description != null) return fmj.description.split("\n");
else return new String[] {"No description is available", "You may need to wait for its metadata to be scanned"};
}
@Override
public boolean needsInject() {
return managedJar;
}
@Override
public Path getJarPath() {
return jarPath;
}
@Override
public Path getMetadataPath() {
return imodPath;
}
@Override
public void delete() throws IOException {
Files.delete(imodPath);
if (!managedJar) Files.delete(jarPath);
if (meta != null) {
for (Mod dependency : getDependencies()) dependency.removeDependent(this);
for (Mod dependent : getDependents()) dependent.removeDependency(this);
}
}
@Override
public Path update(ModSource update) throws IOException {
ModManager.DownloadMeta download = ModManager.download(update, imodPath, instance.mds);
Files.delete(imodPath);
download.write();
for (String dependency : meta.dependencies) {
if (!download.meta().dependencies.contains(dependency)) {
instance.mds.get(instance.modsDir.resolve(dependency)).removeDependent(this);
}
}
instance.mds.invalidate(this);
return download.metaFile();
}
@Override
public Set<Mod> getDependencies() {
return meta.dependencies.stream()
.map(instance.modsDir::resolve)
.map(instance.mds::get)
.collect(Collectors.toUnmodifiableSet());
}
@Override
public Set<Mod> getDependents() {
return meta.dependents.stream()
.map(instance.modsDir::resolve)
.map(instance.mds::get)
.collect(Collectors.toUnmodifiableSet());
}
@Override
public void removeDependency(Mod dependency) throws IOException {
meta.dependencies.remove(meta.dependencies.stream()
.filter(s -> dependency.equals(instance.mds.get(instance.modsDir.resolve(s))))
.findFirst()
.orElseThrow(FileNotFoundException::new));
write();
}
@Override
public void removeDependent(Mod dependent) throws IOException {
meta.dependents.remove(meta.dependents.stream()
.filter(s -> dependent.equals(instance.mds.get(instance.modsDir.resolve(s))))
.findFirst()
.orElseThrow(FileNotFoundException::new));
write();
if (!meta.explicit && meta.dependents.isEmpty()) delete();
}
@Override
public ModMeta getMetadata() {
return meta;
}
@Override
public boolean isEnabled() {
return ModPath.isEnabled(imodPath);
}
private void write() throws IOException {
JFiles.writeObject(imodPath, meta);
}
}