Remove manifold and add JPMS in every project except wrapper, launchwrapper and launcher-gtk
ci/woodpecker/push/docs Pipeline was successful Details
ci/woodpecker/push/woodpecker Pipeline failed Details

This commit is contained in:
Johannes Frohnmeyer 2023-05-05 18:49:56 +02:00
parent 50e9db1fcc
commit 441a9b26b2
Signed by: Johannes
GPG Key ID: E76429612C2929F4
99 changed files with 840 additions and 738 deletions

View File

@ -13,8 +13,6 @@ allprojects {
val jfCommonsVersion by extra("1.3-SNAPSHOT")
val gsonCompileVersion by extra("1.3-SNAPSHOT")
val jbAnnotationsVersion by extra("24.0.1")
// launcher
val jlhttpVersion by extra("2.6")
// launcher-imgui
val lwjglVersion by extra("3.3.2")
val imguiVersion by extra("1.86.10")

View File

@ -3,6 +3,8 @@ plugins {
id("jf.manifold")
}
project.extra["manifoldVersion"] = "2023.1.7"
dependencies {
val jfCommonsVersion: String by rootProject.extra

View File

@ -5,7 +5,6 @@ plugins {
id("inceptum.library")
id("jf.codegen")
id("inceptum.gson-compile")
id("inceptum.manifold")
}
dependencies {

View File

@ -6,29 +6,29 @@ import io.gitlab.jfronny.gson.stream.JsonWriter;
public class GsonPreset {
public static class Config {
public static void configure(JsonReader reader) {
reader.isSerializeSpecialFloatingPointValues = true;
reader.isLenient = true;
reader.setSerializeSpecialFloatingPointValues(true);
reader.setLenient(true);
}
public static void configure(JsonWriter writer) {
writer.serializeNulls = true;
writer.isSerializeSpecialFloatingPointValues = true;
writer.isLenient = true;
writer.indent = " ";
writer.omitQuotes = true;
writer.setSerializeNulls(true);
writer.setSerializeSpecialFloatingPointValues(true);
writer.setLenient(true);
writer.setIndent(" ");
writer.setOmitQuotes(true);
}
}
public static class Api {
public static void configure(JsonReader reader) {
reader.isSerializeSpecialFloatingPointValues = true;
reader.isLenient = true;
reader.setSerializeSpecialFloatingPointValues(true);
reader.setLenient(true);
}
public static void configure(JsonWriter writer) {
writer.serializeNulls = false;
writer.isSerializeSpecialFloatingPointValues = true;
writer.isLenient = false;
writer.setSerializeNulls(false);
writer.setSerializeSpecialFloatingPointValues(true);
writer.setLenient(false);
}
}
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.common;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.common.InceptumConfig.GC_InceptumConfig;
import io.gitlab.jfronny.inceptum.common.GC_InceptumConfig;
import io.gitlab.jfronny.gson.compile.annotations.GComment;
import io.gitlab.jfronny.gson.compile.annotations.GSerializable;
import io.gitlab.jfronny.inceptum.common.model.inceptum.UpdateChannel;
@ -29,8 +29,8 @@ public class InceptumConfig {
public static String authorName = "Inceptum";
public static void load() throws IOException {
if (!Files.exists(MetaHolder.CONFIG_PATH.parent))
Files.createDirectories(MetaHolder.CONFIG_PATH.parent);
if (!Files.exists(MetaHolder.CONFIG_PATH.getParent()))
Files.createDirectories(MetaHolder.CONFIG_PATH.getParent());
if (!Files.exists(MetaHolder.CONFIG_PATH)) {
Path gLaunch2 = MetaHolder.BASE_PATH.resolve("glaunch2.json");
Path json = MetaHolder.BASE_PATH.resolve("inceptum.json");

View File

@ -9,7 +9,7 @@ import java.io.IOException;
public class InceptumEnvironmentInitializer {
public static void initialize() throws IOException {
Logger.registerFactory(InceptumEnvironmentInitializer::defaultFactory);
HttpUtils.userAgent = "jfmods/inceptum/" + BuildMetadata.VERSION;
HttpUtils.setUserAgent("jfmods/inceptum/" + BuildMetadata.VERSION);
InceptumConfig.load();
}

View File

@ -65,11 +65,11 @@ public class Net {
if (url.startsWith("/")) res.append(url);
else res.append("/").append(url);
int i = 0;
for (Map.Entry<String, String> entry : params) {
for (Map.Entry<String, String> entry : params.entrySet()) {
res.append(i++ == 0 ? '?' : '&')
.append(URLEncoder.encode(entry.key, StandardCharsets.UTF_8))
.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8))
.append('=')
.append(URLEncoder.encode(entry.value, StandardCharsets.UTF_8));
.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
}
return res.toString();
}
@ -83,12 +83,12 @@ public class Net {
}
public static void downloadFile(String url, Path path) throws IOException, URISyntaxException {
if (!Files.exists(path.parent)) Files.createDirectories(path.parent);
if (!Files.exists(path.getParent())) Files.createDirectories(path.getParent());
Files.write(path, downloadData(url));
}
public static void downloadFile(String url, String sha1, Path path) throws IOException, URISyntaxException {
if (!Files.exists(path.parent)) Files.createDirectories(path.parent);
if (!Files.exists(path.getParent())) Files.createDirectories(path.getParent());
Files.write(path, downloadData(url, sha1));
}
}

View File

@ -30,10 +30,10 @@ public class ObjectCache {
public <T, TEx extends Throwable> T get(String key, ThrowingSupplier<String, ? extends TEx> download, ThrowingFunction<String, T, ? extends TEx> builder) throws IOException, TEx {
if (!container.containsKey(key)) {
Path cd = cacheDir.resolve(key);
if (Files.exists(cd)) container[key] = builder.apply(Files.readString(cd));
else container[key] = builder.apply(download.get());
if (Files.exists(cd)) container.put(key, builder.apply(Files.readString(cd)));
else container.put(key, builder.apply(download.get()));
}
//noinspection unchecked
return (T) container[key];
return (T) container.get(key);
}
}

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.inceptum.common;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.common.model.inceptum.UpdateMetadata.GC_UpdateMetadata;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.common.model.inceptum.WrapperConfig.GC_WrapperConfig;
import io.gitlab.jfronny.inceptum.common.model.inceptum.GC_UpdateMetadata;
import io.gitlab.jfronny.inceptum.common.model.inceptum.GC_WrapperConfig;
import io.gitlab.jfronny.commons.OSUtils;
import io.gitlab.jfronny.inceptum.common.api.MavenApi;
import io.gitlab.jfronny.inceptum.common.model.inceptum.*;
@ -16,6 +16,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Updater {
@ -32,38 +33,38 @@ public class Updater {
}
public static void update(UpdateMetadata source, boolean relaunch) throws IOException, URISyntaxException {
Utils.LOGGER.info("Downloading version " + source.version);
Utils.LOGGER.info("Downloading version " + source.version());
WrapperConfig config = new WrapperConfig(
new LinkedHashSet<>(),
new LinkedHashSet<>(source.repositories),
new LinkedHashSet<>(source.repositories()),
new HashMap<>()
);
source.natives.forEach((k, v) -> config.natives[k] = new LinkedHashSet<>(v));
source.natives().forEach((k, v) -> config.natives().put(k, new LinkedHashSet<>(v)));
DependencyNode node = downloadLibrary(source.repositories, "io.gitlab.jfronny.inceptum:launcher-dist:" + source.version, config.libraries);
DependencyNode node = downloadLibrary(source.repositories(), "io.gitlab.jfronny.inceptum:launcher-dist:" + source.version(), config.libraries());
Utils.LOGGER.info("Downloaded Dependencies:\n" + node);
List<String> currentLibraries = new LinkedList<>(config.libraries);
if (source.natives.containsKey(Utils.currentFlavor)) {
List<String> currentLibraries = new LinkedList<>(config.libraries());
if (source.natives().containsKey(Utils.getCurrentFlavor())) {
Set<String> natives = new LinkedHashSet<>();
for (String lib : source.natives[Utils.currentFlavor]) {
downloadLibrary(source.repositories, lib, natives);
for (String lib : source.natives().get(Utils.getCurrentFlavor())) {
downloadLibrary(source.repositories(), lib, natives);
}
currentLibraries.addAll(natives);
config.natives[Utils.currentFlavor] = natives;
config.natives().put(Utils.getCurrentFlavor(), natives);
}
GC_WrapperConfig.write(config, MetaHolder.WRAPPER_CONFIG_PATH);
if (relaunch) {
Runtime.runtime.addShutdownHook(new Thread(() -> {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
new ProcessBuilder(OSUtils.jvmBinary,
new ProcessBuilder(OSUtils.getJvmBinary(),
"-cp",
buildClasspath(currentLibraries.stream())
.map(Path::toString)
.join(File.pathSeparatorChar)
.collect(Collectors.joining(String.valueOf(File.pathSeparatorChar)))
).inheritIO().start();
} catch (IOException e) {
Utils.LOGGER.error("Could not relaunch", e);
@ -73,31 +74,31 @@ public class Updater {
}
public static List<Path> getLaunchClasspath(WrapperConfig wrapperConfig) throws IOException, URISyntaxException {
Set<String> natives = wrapperConfig.natives[Utils.currentFlavor];
Set<String> natives = wrapperConfig.natives().get(Utils.getCurrentFlavor());
if (natives == null) natives = new LinkedHashSet<>();
Set<String> libs = wrapperConfig.libraries;
Set<String> libs = wrapperConfig.libraries();
if (libs == null) libs = new LinkedHashSet<>();
boolean configChanged = false;
for (String lib : libs) {
Path p = ArtifactMeta.parse(lib).localPath;
Path p = ArtifactMeta.parse(lib).getLocalPath();
if (!Files.exists(p)) {
configChanged = true;
downloadLibrary(wrapperConfig.repositories, lib, libs);
downloadLibrary(wrapperConfig.repositories(), lib, libs);
}
}
for (String lib : natives) {
Path p = ArtifactMeta.parse(lib).localPath;
Path p = ArtifactMeta.parse(lib).getLocalPath();
if (!Files.exists(p)) {
configChanged = true;
downloadLibrary(wrapperConfig.repositories, lib, natives);
downloadLibrary(wrapperConfig.repositories(), lib, natives);
}
}
if (configChanged) GC_WrapperConfig.write(wrapperConfig, MetaHolder.WRAPPER_CONFIG_PATH);
return buildClasspath(libs.stream().concat(natives.stream())).toList();
return buildClasspath(Stream.concat(libs.stream(), natives.stream())).toList();
}
private static Stream<Path> buildClasspath(Stream<String> libraries) {
@ -106,7 +107,7 @@ public class Updater {
private static DependencyNode downloadLibrary(Set<String> repositories, final String artifact, Set<String> libraries) throws IOException, URISyntaxException {
List<FileNotFoundException> suppressed = new LinkedList<>();
for (String repository : Stream.of(PROJECT_MAVEN).concat(repositories.stream())) {
for (String repository : Stream.concat(Stream.of(PROJECT_MAVEN), repositories.stream()).toList()) {
ArtifactMeta meta;
try {
meta = MavenApi.getMetadata(repository, artifact);
@ -122,12 +123,12 @@ public class Updater {
suppressed.add(notFound);
continue;
} catch (IOException | URISyntaxException | XMLStreamException | SAXException e) {
throw new IOException("Could not download artifact " + meta.mavenNotation + " from " + repository, e);
throw new IOException("Could not download artifact " + meta.getMavenNotation() + " from " + repository, e);
}
Set<DependencyNode> dependencies = new LinkedHashSet<>();
if (pom.dependencies != null) {
for (MavenDependency dependency : pom.dependencies) {
String mvnName = dependency.groupId + ":" + dependency.artifactId + ":" + dependency.version;
if (pom.dependencies() != null) {
for (MavenDependency dependency : pom.dependencies()) {
String mvnName = dependency.groupId() + ":" + dependency.artifactId() + ":" + dependency.version();
dependencies.add(downloadLibrary(repositories, mvnName, libraries));
}
}
@ -156,12 +157,12 @@ public class Updater {
case Stable -> stable;
};
if (checkEnv) {
if (info.jvm > Runtime.version().feature()) throw new UpdateCheckException("A newer JVM is required to use the latest inceptum version. Please update!", "Outdated Java");
if (info.wrapperVersion != BuildMetadata.WRAPPER_VERSION) throw new UpdateCheckException("A different version of the Inceptum Wrapper is required for this update!", "Mismatched Wrapper");
if (info.jvm() > Runtime.version().feature()) throw new UpdateCheckException("A newer JVM is required to use the latest inceptum version. Please update!", "Outdated Java");
if (info.wrapperVersion() != BuildMetadata.WRAPPER_VERSION) throw new UpdateCheckException("A different version of the Inceptum Wrapper is required for this update!", "Mismatched Wrapper");
}
if (versionCompare) {
Utils.LOGGER.info("Latest version is " + info.version + ", current is " + BuildMetadata.VERSION);
if (BuildMetadata.BUILD_TIME >= info.buildTime) {
Utils.LOGGER.info("Latest version is " + info.version() + ", current is " + BuildMetadata.VERSION);
if (BuildMetadata.BUILD_TIME >= info.buildTime()) {
Utils.LOGGER.info("Up-to-date");
return null;
}
@ -177,7 +178,7 @@ public class Updater {
return switch (channel) {
case CI -> ARTIFACTS_URL;
case Stable -> STABLE_URL;
} + "/Inceptum-" + Utils.currentFlavor + ".jar";
} + "/Inceptum-" + Utils.getCurrentFlavor() + ".jar";
}
public static class UpdateCheckException extends Exception {

View File

@ -13,6 +13,7 @@ import java.nio.file.FileSystem;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class Utils {
public static final int CACHE_SIZE = 128;
@ -24,9 +25,9 @@ public class Utils {
public static void openWebBrowser(URI uri) {
try {
if (OSUtils.TYPE == OSUtils.Type.LINUX && OSUtils.executablePathContains("xdg-open")) {
Runtime.runtime.exec(new String[]{"xdg-open", uri.toString()});
} else if (Desktop.isDesktopSupported && Desktop.desktop.isSupported(Desktop.Action.BROWSE)) {
Desktop.desktop.browse(uri);
Runtime.getRuntime().exec(new String[]{"xdg-open", uri.toString()});
} else if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
Desktop.getDesktop().browse(uri);
}
} catch (Exception e) {
Utils.LOGGER.error("Error opening web browser!", e);
@ -36,9 +37,9 @@ public class Utils {
public static void openFile(File file) {
try {
if (OSUtils.TYPE == OSUtils.Type.LINUX && OSUtils.executablePathContains("xdg-open")) {
Runtime.runtime.exec(new String[]{"xdg-open", file.absoluteFile.toString()});
} else if (Desktop.isDesktopSupported && Desktop.desktop.isSupported(Desktop.Action.BROWSE)) {
Desktop.desktop.open(file);
Runtime.getRuntime().exec(new String[]{"xdg-open", file.getAbsoluteFile().toString()});
} else if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
Desktop.getDesktop().open(file);
}
} catch (Exception e) {
Utils.LOGGER.error("Error opening file!", e);
@ -67,8 +68,8 @@ public class Utils {
return Arrays.stream(segments)
.map(s -> s.startsWith(separator) ? s.substring(separator.length()) : s)
.map(s -> s.endsWith(separator) ? s.substring(0, s.length() - separator.length()) : s)
.filter(s -> !s.isEmpty)
.join(separator);
.filter(s -> !s.isEmpty())
.collect(Collectors.joining(separator));
}
public static String getCurrentFlavor() {

View File

@ -5,8 +5,7 @@ import io.gitlab.jfronny.inceptum.common.Net;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.common.model.maven.*;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
@ -30,16 +29,16 @@ public class MavenApi {
}
public static Path downloadLibrary(String repo, ArtifactMeta meta) throws IOException, URISyntaxException {
Path res = meta.localPath;
Path res = meta.getLocalPath();
Net.downloadFile(Utils.join("/", repo, meta.getJarPath(true)), res);
return res;
}
public static Pom getPom(String repo, ArtifactMeta meta) throws IOException, SAXException, URISyntaxException, XMLStreamException {
try (InputStream is = HttpUtils.get(Utils.join("/", repo, meta.pomPath)).sendInputStream()) {
try (InputStream is = HttpUtils.get(Utils.join("/", repo, meta.getPomPath())).sendInputStream()) {
Document doc = FACTORY.parse(is);
doc.documentElement.normalize();
if (!"project".equals(doc.documentElement.nodeName)) throw new IOException("Illegal document name");
doc.getDocumentElement().normalize();
if (!"project".equals(doc.getDocumentElement().getNodeName())) throw new IOException("Illegal document name");
String modelVersion = null;
String groupId = null;
String artifactId = null;
@ -47,46 +46,46 @@ public class MavenApi {
String packaging = null;
List<MavenDependency> dependencies = null;
String classifier = null;
for (Node node : doc.documentElement.childNodes) {
switch (node.nodeName) {
case "modelVersion" -> modelVersion = node.textContent;
for (Node node : children(doc.getDocumentElement())) {
switch (node.getNodeName()) {
case "modelVersion" -> modelVersion = node.getTextContent();
case "parent" -> {
// Dirty hack to get slf4j working: simply assume the groupId and version of the parent is also the groupId of this
if (groupId == null) {
for (Node child : node.childNodes) {
switch (child.nodeName) {
for (Node child : children(node)) {
switch (child.getNodeName()) {
case "groupId" -> {
if (groupId == null) {
groupId = child.textContent;
groupId = child.getTextContent();
}
}
case "version" -> {
if (version == null) {
version = child.textContent;
version = child.getTextContent();
}
}
}
}
}
}
case "groupId" -> groupId = node.textContent;
case "groupId" -> groupId = node.getTextContent();
case "artifactId" -> {
artifactId = node.textContent;
artifactId = node.getTextContent();
}
case "version" -> {
version = node.textContent;
version = node.getTextContent();
}
case "packaging" -> packaging = node.textContent;
case "packaging" -> packaging = node.getTextContent();
case "dependencies" -> {
dependencies = new LinkedList<>();
for (Node dep : node.childNodes) {
for (Node dep : children(node)) {
MavenDependency resolved = parseDependency(dep);
if (resolved != null) {
dependencies.add(resolved);
}
}
}
case "classifier" -> classifier = node.textContent;
case "classifier" -> classifier = node.getTextContent();
default -> {}
}
}
@ -103,17 +102,17 @@ public class MavenApi {
String artifactId = null;
String version = null;
String scope = null;
for (Node node : doc.childNodes) {
switch (node.nodeName) {
case "groupId" -> groupId = node.textContent;
case "artifactId" -> artifactId = node.textContent;
case "version" -> version = node.textContent;
for (Node node : children(doc)) {
switch (node.getNodeName()) {
case "groupId" -> groupId = node.getTextContent();
case "artifactId" -> artifactId = node.getTextContent();
case "version" -> version = node.getTextContent();
case "scope" -> {
scope = node.textContent;
scope = node.getTextContent();
if (!RUNTIME_SCOPES.contains(scope)) return null;
}
case "optional" -> {
if (node.textContent.equals("true")) return null;
if (node.getTextContent().equals("true")) return null;
}
}
}
@ -133,28 +132,28 @@ public class MavenApi {
public static ArtifactMeta getMetadata(String repo, String artifact) throws IOException, SAXException, URISyntaxException {
ArtifactMeta sourceMeta = ArtifactMeta.parse(artifact);
try (InputStream is = HttpUtils.get(Utils.join("/", repo, sourceMeta.metadataPath)).sendInputStream()) {
try (InputStream is = HttpUtils.get(Utils.join("/", repo, sourceMeta.getMetadataPath())).sendInputStream()) {
Document doc = FACTORY.parse(is);
doc.documentElement.normalize();
if (!"metadata".equals(doc.documentElement.nodeName)) throw new IOException("Illegal document name");
doc.getDocumentElement().normalize();
if (!"metadata".equals(doc.getDocumentElement().getNodeName())) throw new IOException("Illegal document name");
String groupId = null;
String artifactId = null;
String version = null;
String snapshotVersion = null;
for (Node node : doc.documentElement.childNodes) {
switch (node.nodeName) {
case "groupId" -> groupId = node.textContent;
case "artifactId" -> artifactId = node.textContent;
case "version" -> version = node.textContent;
for (Node node : children(doc.getDocumentElement())) {
switch (node.getNodeName()) {
case "groupId" -> groupId = node.getTextContent();
case "artifactId" -> artifactId = node.getTextContent();
case "version" -> version = node.getTextContent();
case "versioning" -> {
for (Node node1 : node.childNodes) {
if (node1.nodeName.equals("snapshot")) {
for (Node node1 : children(node)) {
if (node1.getNodeName().equals("snapshot")) {
String timestamp = null;
String buildNumber = null;
for (Node node2 : node1.childNodes) {
switch (node2.nodeName) {
case "timestamp" -> timestamp = node2.textContent;
case "buildNumber" -> buildNumber = node2.textContent;
for (Node node2 : children(node1)) {
switch (node2.getNodeName()) {
case "timestamp" -> timestamp = node2.getTextContent();
case "buildNumber" -> buildNumber = node2.getTextContent();
default -> {}
}
}
@ -170,7 +169,34 @@ public class MavenApi {
if (groupId == null) throw new IOException("Pom lacks groupId");
if (artifactId == null) throw new IOException("Pom lacks artifactId");
if (version == null) throw new IOException("Pom lacks version");
return new ArtifactMeta(groupId, artifactId, version, sourceMeta.classifier, snapshotVersion);
return new ArtifactMeta(groupId, artifactId, version, sourceMeta.classifier(), snapshotVersion);
}
}
private static Iterable<Node> children(Node node) {
return () -> new Iterator<Node>() {
NodeList children = node.getChildNodes();
int index = 0;
@Override
public boolean hasNext() {
while (index < children.getLength() && isWhitespace(children.item(index))) {
index++;
}
return index < children.getLength();
}
@Override
public Node next() {
if (!hasNext()) throw new NoSuchElementException();
return children.item(index++);
}
};
}
private static boolean isWhitespace(Node node) {
if (node.getNodeType() == Node.TEXT_NODE && node.getTextContent().isBlank()) return true;
if (node.getNodeType() == Node.COMMENT_NODE) return true;
return false;
}
}

View File

@ -0,0 +1,15 @@
module io.gitlab.jfronny.inceptum.common {
exports io.gitlab.jfronny.inceptum.common;
exports io.gitlab.jfronny.inceptum.common.api;
exports io.gitlab.jfronny.inceptum.common.model.inceptum;
exports io.gitlab.jfronny.inceptum.common.model.maven;
requires transitive java.desktop;
requires java.xml;
requires transitive io.gitlab.jfronny.commons;
requires transitive io.gitlab.jfronny.commons.gson;
requires transitive io.gitlab.jfronny.gson;
requires transitive io.gitlab.jfronny.gson.compile.core;
requires static org.jetbrains.annotations;
requires static io.gitlab.jfronny.gson.compile.annotations;
}

View File

@ -1,6 +1,5 @@
plugins {
id("inceptum.application")
id("inceptum.manifold")
}
application {

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.cli;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.common.MetaHolder;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
@ -34,17 +34,17 @@ public abstract class BaseInstanceCommand extends Command {
return;
}
Instance instance;
Path normalPath = Path.of(args[0]);
Path normalPath = Path.of(args.get(0));
if (Files.exists(normalPath.resolve(Instance.CONFIG_NAME))) {
instance = new Instance(normalPath, GC_InstanceMeta.read(normalPath.resolve(Instance.CONFIG_NAME)));
} else {
Path instancePath = MetaHolder.INSTANCE_DIR.resolve(args[0]).normalize();
Path instancePath = MetaHolder.INSTANCE_DIR.resolve(args.get(0)).normalize();
if (!instancePath.startsWith(MetaHolder.INSTANCE_DIR)) {
Utils.LOGGER.error("Specified instance path doesn't exist");
return;
}
if (!Files.exists(instancePath)) {
Utils.LOGGER.error("Invalid instance: \"" + args[0] + "\"");
Utils.LOGGER.error("Invalid instance: \"" + args.get(0) + "\"");
return;
}
try {

View File

@ -22,7 +22,7 @@ public class CliMain {
public static final Command COMMANDS_ROOT = new Command("Root command", "<command>", List.of(), KNOWN_COMMANDS) {
@Override
protected void invoke(CommandArgs args) {
throw new RuntimeException("Could not find command: " + args[0]);
throw new RuntimeException("Could not find command: " + args.get(0));
}
@Override

View File

@ -24,7 +24,7 @@ public abstract class Command {
}
public String getName() {
return aliases[0];
return aliases.get(0);
}
public boolean enableLog() {
@ -36,22 +36,22 @@ public abstract class Command {
public CommandResolution resolve(CommandArgs args) {
if (args.length != 0) {
for (Command command : subCommands) {
if (command.isAlias(args[0])) {
if (command.isAlias(args.get(0))) {
CommandResolution resolution = command.resolve(args.subArgs());
if (!aliases.isEmpty) resolution.resolvePath.add(0, aliases[0]);
if (!aliases.isEmpty()) resolution.resolvePath().add(0, aliases.get(0));
return resolution;
}
}
}
return new CommandResolution(this, args, aliases.isEmpty
return new CommandResolution(this, args, aliases.isEmpty()
? new ArrayList<>()
: new ArrayList<>(List.of(aliases[0])));
: new ArrayList<>(List.of(aliases.get(0))));
}
public void buildHelp(HelpBuilder builder) {
builder.writeCommand(aliases, help, usage);
for (Command command : subCommands) {
command.buildHelp(aliases.isEmpty ? builder : builder.beginSubcommand(aliases[0]));
command.buildHelp(aliases.isEmpty() ? builder : builder.beginSubcommand(aliases.get(0)));
}
}
}

View File

@ -16,11 +16,11 @@ public class CommandArgs implements Iterable<String> {
}
public String last() {
return args[args.size() - 1];
return args.get(args.size() - 1);
}
public String get(int index) {
return args[index];
return args.get(index);
}
public List<String> after(String param) {

View File

@ -31,11 +31,11 @@ public class HelpBuilder {
}
public void writeCommand(List<String> aliases, String help, String usage) {
if (aliases.isEmpty) return;
if (aliases.isEmpty()) return;
String indent = " ".repeat(level * 2);
builder.append('\n').append(indent).append("- ");
for (int i = 0, aliasesSize = aliases.size(); i < aliasesSize; i++) {
String alias = aliases[i];
String alias = aliases.get(i);
builder.append(alias);
if (i < aliasesSize - 1)
builder.append(", ");
@ -46,7 +46,7 @@ public class HelpBuilder {
for (String s : upper) {
usagePrefix.append(" ").append(s);
}
usagePrefix.append(" ").append(aliases[0]).append(" ");
usagePrefix.append(" ").append(aliases.get(0)).append(" ");
builder.append("\n ")
.append(indent)
.append("Usage: ")

View File

@ -25,8 +25,8 @@ public class ExportCommand extends BaseInstanceCommand {
protected void invoke(CommandArgs args, Instance instance) throws Exception {
if (args.length == 0) throw new IllegalAccessException("You must specify a target path");
if (args.length > 2) throw new IllegalAccessException("Too many arguments");
if (args.length > 1) instance.meta.instanceVersion = args[1];
Exporters.CURSE_FORGE.generate(new ProcessState(), instance, Paths.get(args[0]));
if (args.length > 1) instance.meta().instanceVersion = args.get(1);
Exporters.CURSE_FORGE.generate(new ProcessState(), instance, Paths.get(args.get(0)));
}
private static class MultiMCExportCommand extends BaseInstanceCommand {
@ -38,7 +38,7 @@ public class ExportCommand extends BaseInstanceCommand {
protected void invoke(CommandArgs args, Instance instance) throws Exception {
if (args.length == 0) throw new IllegalAccessException("You must specify a target path");
if (args.length != 1) throw new IllegalAccessException("Too many arguments");
Exporters.MULTI_MC.generate(new ProcessState(), instance, Paths.get(args[0]));
Exporters.MULTI_MC.generate(new ProcessState(), instance, Paths.get(args.get(0)));
}
}
@ -51,8 +51,8 @@ public class ExportCommand extends BaseInstanceCommand {
protected void invoke(CommandArgs args, Instance instance) throws Exception {
if (args.length == 0) throw new IllegalAccessException("You must specify a target path");
if (args.length > 2) throw new IllegalAccessException("Too many arguments");
if (args.length > 1) instance.meta.instanceVersion = args[1];
Exporters.MODRINTH.generate(new ProcessState(), instance, Paths.get(args[0]));
if (args.length > 1) instance.meta().instanceVersion = args.get(1);
Exporters.MODRINTH.generate(new ProcessState(), instance, Paths.get(args.get(0)));
}
}
}

View File

@ -19,16 +19,16 @@ public class HelpCommand extends Command {
CliMain.COMMANDS_ROOT.buildHelp(help);
} else {
CommandResolution resolution = CliMain.COMMANDS_ROOT.resolve(args);
if (resolution.resolvePath.isEmpty) {
if (resolution.resolvePath().isEmpty()) {
System.err.println("Could not find command matching your input");
invoke(new CommandArgs(List.of()));
return;
}
printHeader();
System.out.println("\nFound matching: \"" + String.join(" ", resolution.resolvePath) + "\"");
resolution.command.buildHelp(help);
System.out.println("\nFound matching: \"" + String.join(" ", resolution.resolvePath()) + "\"");
resolution.command().buildHelp(help);
}
System.out.println(help.result);
System.out.println(help.getResult());
}
private static void printHeader() {

View File

@ -19,7 +19,7 @@ public class ImportCommand extends Command {
if (args.length == 0) throw new IllegalAccessException("You must specify a pack file");
if (args.length != 1) throw new IllegalAccessException("Too many arguments");
ProcessState state = new ProcessState();
String name = Importers.importPack(Paths.get(args[0]), state).path().fileName.toString();
String name = Importers.importPack(Paths.get(args.get(0)), state).path().getFileName().toString();
System.out.println(OutputColors.GREEN_BOLD + "Imported as " + name + OutputColors.RESET);
}
}

View File

@ -21,7 +21,7 @@ public class JvmStateCommand extends Command {
System.out.println("Classloader " + loader + ":");
if (loader instanceof URLClassLoader uc)
System.out.println("\t" + Arrays.toString(uc.uRLs));
System.out.println("\t" + Arrays.toString(uc.getURLs()));
else
System.out.println("\t(cannot display components as not a URLClassLoader)");

View File

@ -46,15 +46,15 @@ public class LaunchCommand extends BaseInstanceCommand {
return;
}
if (args.length > 1) {
InstanceMeta meta = instance.meta;
InstanceMeta meta = instance.meta();
if (meta.arguments == null) meta.arguments = new InstanceMeta.Arguments(new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
else meta.arguments = new InstanceMeta.Arguments(
meta.arguments.jvm == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.jvm),
meta.arguments.client == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.client),
meta.arguments.server == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.server)
meta.arguments.jvm() == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.jvm()),
meta.arguments.client() == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.client()),
meta.arguments.server() == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.server())
);
meta.arguments.client.addAll(args.after(0));
meta.arguments.server.addAll(args.after(0));
meta.arguments.client().addAll(args.after(0));
meta.arguments.server().addAll(args.after(0));
}
Steps.reDownload(instance, Steps.createProcessState());
if (server) {

View File

@ -21,13 +21,13 @@ public class ListCommand extends Command {
@Override
protected void invoke(CommandArgs args) throws IOException {
List<Path> paths = JFiles.list(MetaHolder.INSTANCE_DIR);
if (paths.isEmpty) System.out.println("No instances are currently present");
if (paths.isEmpty()) System.out.println("No instances are currently present");
for (Path path : paths) {
if (!Files.exists(path.resolve(Instance.CONFIG_NAME))) {
System.out.println("- Invalid instance: " + path + " (no instance metadata)");
continue;
}
System.out.println("- \"" + path.fileName.toString() + "\"");
System.out.println("- \"" + path.getFileName().toString() + "\"");
Instance instance;
try {
instance = InstanceList.read(path);
@ -39,13 +39,13 @@ public class ListCommand extends Command {
System.out.println(" Status: Setting up");
continue;
}
System.out.println(" Status: " + (instance.isRunningLocked ? "Running" : "Stopped"));
System.out.println(" Version: " + instance.gameVersion);
if (instance.isFabric) System.out.println(" Fabric Loader: " + instance.loaderVersion);
if (instance.meta.java != null) System.out.println(" Custom Java: " + instance.meta.java);
if (instance.meta.minMem != null || instance.meta().maxMem != null)
System.out.println(" Memory:" + (instance.meta.minMem != null ? " Minimum: " + instance.meta.minMem : "")
+ (instance.meta.maxMem != null ? " Maximum: " + instance.meta.maxMem : ""));
System.out.println(" Status: " + (instance.isRunningLocked() ? "Running" : "Stopped"));
System.out.println(" Version: " + instance.getGameVersion());
if (instance.isFabric()) System.out.println(" Fabric Loader: " + instance.getLoaderVersion());
if (instance.meta().java != null) System.out.println(" Custom Java: " + instance.meta().java);
if (instance.meta().minMem != null || instance.meta().maxMem != null)
System.out.println(" Memory:" + (instance.meta().minMem != null ? " Minimum: " + instance.meta().minMem : "")
+ (instance.meta().maxMem != null ? " Maximum: " + instance.meta().maxMem : ""));
}
}
}

View File

@ -46,26 +46,26 @@ public class ModCommand extends Command {
@Override
protected void invoke(CommandArgs args, Instance instance) throws IOException {
if (!instance.isFabric) {
if (!instance.isFabric()) {
System.err.println("This is not a fabric instance");
return;
}
System.out.println("Scanning installed mods, this might take a while");
instance.mds.runOnce((path, mod) -> {
boolean hasSources = !mod.metadata.sources.isEmpty;
boolean updatable = hasSources && mod.metadata.sources.values().stream().anyMatch(Optional::isPresent);
instance.mds().runOnce((path, mod) -> {
boolean hasSources = !mod.getMetadata().sources().isEmpty();
boolean updatable = hasSources && mod.getMetadata().sources().values().stream().anyMatch(Optional::isPresent);
if (filterUpdatable && !updatable) return;
System.out.println("- " + path.fileName.toString());
System.out.println(" " + mod.name);
for (String s : mod.description) {
System.out.println("- " + path.getFileName().toString());
System.out.println(" " + mod.getName());
for (String s : mod.getDescription()) {
System.out.println(" " + s);
}
if (hasSources) {
System.out.println(" Sources:");
for (var entry : mod.metadata.sources) {
System.out.println(" - " + entry.key.name + " (" + entry.key.version + ")");
System.out.println(" Local: " + entry.key.jarPath.toString());
if (entry.value.isPresent) System.out.println(" Updatable to: " + entry.value.get().version);
for (var entry : mod.getMetadata().sources().entrySet()) {
System.out.println(" - " + entry.getKey().getName() + " (" + entry.getKey().getVersion() + ")");
System.out.println(" Local: " + entry.getKey().getJarPath().toString());
if (entry.getValue().isPresent()) System.out.println(" Updatable to: " + entry.getValue().get().getVersion());
}
}
});
@ -98,22 +98,22 @@ public class ModCommand extends Command {
}
Set<Path> mods = new HashSet<>();
for (String arg : args) {
Path p = instance.modsDir.resolve(arg);
if (!Files.exists(p)) p = instance.modsDir.resolve(arg + ".imod");
Path p = instance.getModsDir().resolve(arg);
if (!Files.exists(p)) p = instance.getModsDir().resolve(arg + ".imod");
if (!Files.exists(p)) {
Utils.LOGGER.error("Nonexistant mod file: " + instance.modsDir.resolve(arg));
Utils.LOGGER.error("Nonexistant mod file: " + instance.getModsDir().resolve(arg));
return;
}
mods.add(p);
}
ModsDirScanner mds = instance.mds;
if (!ignoreDependencies && !mds.isComplete) {
ModsDirScanner mds = instance.mds();
if (!ignoreDependencies && !mds.isComplete()) {
Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while");
mds.runOnce((path, mod) -> System.out.println("Scanned " + path));
}
for (Path mod : mods) {
try {
mds[mod].delete();
mds.get(mod).delete();
} catch (IOException e) {
Utils.LOGGER.error("Could not delete " + mod, e);
return;
@ -155,23 +155,23 @@ public class ModCommand extends Command {
if (args.length == 0) {
throw new IllegalArgumentException("You must specify mods to remove");
}
Set<Path> mods = pathSupplier.apply(args, instance.path);
ModsDirScanner mds = instance.mds;
if (!mds.isComplete) {
Set<Path> mods = pathSupplier.apply(args, instance.path());
ModsDirScanner mds = instance.mds();
if (!mds.isComplete()) {
Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while");
mds.runOnce((path, mod) -> System.out.println("Scanned " + path));
}
for (Path mod : mods) {
try {
Mod md = mds[mod];
Mod md = mds.get(mod);
md.delete();
md.metadata.sources.values().stream()
md.getMetadata().sources().values().stream()
.filter(Optional::isPresent)
.map(Optional::get)
.findFirst()
.ifPresentOrElse(update -> {
try {
Utils.LOGGER.info("Updating " + mod + " to " + update.version);
Utils.LOGGER.info("Updating " + mod + " to " + update.getVersion());
md.update(update);
Utils.LOGGER.info("Update completed");
} catch (IOException e) {

View File

@ -0,0 +1,6 @@
module io.gitlab.jfronny.inceptum.launcher.cli {
exports io.gitlab.jfronny.inceptum.cli;
requires transitive io.gitlab.jfronny.inceptum.launcher;
requires static org.jetbrains.annotations;
}

View File

@ -1,6 +1,6 @@
plugins {
id("inceptum.application-standalone")
id("org.beryx.runtime") version "1.13.0"
id("org.beryx.jlink") version "2.26.0"
}
application {
@ -50,14 +50,18 @@ val verifyFlavorConfiguration by tasks.registering {
}
}
tasks.runtime { dependsOn(verifyFlavorConfiguration) }
tasks.runtimeZip { dependsOn(verifyFlavorConfiguration) }
tasks.suggestModules { dependsOn(verifyFlavorConfiguration) }
tasks.prepareMergedJarsDir { dependsOn(verifyFlavorConfiguration) }
tasks.createMergedModule { dependsOn(verifyFlavorConfiguration) }
tasks.createDelegatingModules { dependsOn(verifyFlavorConfiguration) }
tasks.prepareModulesDir { dependsOn(verifyFlavorConfiguration) }
tasks.jlink { dependsOn(verifyFlavorConfiguration) }
tasks.jlinkZip { dependsOn(verifyFlavorConfiguration) }
tasks.suggestMergedModuleInfo { dependsOn(verifyFlavorConfiguration) }
tasks.jpackageImage { dependsOn(verifyFlavorConfiguration) }
tasks.jpackage { dependsOn(verifyFlavorConfiguration) }
if (crosscompile) System.setProperty("badass.runtime.jpackage.home", "/root/jpackage-win")
runtime {
if (crosscompile) System.setProperty("badass.jlink.jpackage.home", "/root/jpackage-win")
jlink {
if (crosscompile) javaHome.set("/root/jpackage-win")
addOptions(
"--strip-debug",
@ -66,6 +70,9 @@ runtime {
"--no-man-pages",
"--verbose"
)
launcher {
name = application.applicationName
}
if (crosscompile) targetPlatform("win", "/root/java")
jpackage {
imageName = application.applicationName

View File

@ -0,0 +1,4 @@
module io.gitlab.jfronny.inceptum.launcher.dist {
requires io.gitlab.jfronny.inceptum.launcher.imgui;
requires io.gitlab.jfronny.inceptum.launcher.cli;
}

View File

@ -1,6 +1,5 @@
plugins {
id("inceptum.application")
id("inceptum.manifold")
}
application {

View File

@ -65,7 +65,7 @@ public class GuiMain {
AccountManager.loadAccounts();
Utils.LOGGER.info("Initializing UI");
try {
InstanceList.forEach(instance -> instance.mds.start());
InstanceList.forEach(instance -> instance.mds().start());
} catch (IOException e) {
Utils.LOGGER.error("Could not initialize MDS", e);
}
@ -149,7 +149,7 @@ public class GuiMain {
GLFW.glfwGetWindowSize(handle, pWidth, pHeight);
final GLFWVidMode vidmode = Objects.requireNonNull(GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor()));
GLFW.glfwSetWindowPos(handle, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight[0]) / 2);
GLFW.glfwSetWindowPos(handle, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2);
}
GLFW.glfwMakeContextCurrent(handle);
@ -186,7 +186,7 @@ public class GuiMain {
io.addConfigFlags(ImGuiConfigFlags.ViewportsEnable);
io.setConfigViewportsNoAutoMerge(true);
try (InputStream is = LauncherEnv.class.getClassLoader().getResourceAsStream("font.ttf")) {
io.fontDefault = io.fonts.addFontFromMemoryTTF(Objects.requireNonNull(is).readAllBytes(), 16f);
io.setFontDefault(io.getFonts().addFontFromMemoryTTF(Objects.requireNonNull(is).readAllBytes(), 16f));
} catch (IOException e) {
Utils.LOGGER.error("Could not load font", e);
}
@ -206,24 +206,24 @@ public class GuiMain {
if (WINDOWS.isEmpty()) exit();
else {
for (Window window : WINDOWS.toArray(new Window[0])) {
if (window.isNew) window.preFirstDraw();
String title = window.name + "##" + System.identityHashCode(window);
if (window.isCloseable) {
if (ImGui.begin(title, window.openState, window.flags)) {
if (window.isNew()) window.preFirstDraw();
String title = window.getName() + "##" + System.identityHashCode(window);
if (window.isCloseable()) {
if (ImGui.begin(title, window.getOpenState(), window.getFlags())) {
window.draw();
}
} else {
if (ImGui.begin(title, window.flags)) {
if (ImGui.begin(title, window.getFlags())) {
window.draw();
}
}
ImGui.end();
if (!window.openState.get() && !window.isClosed) window.close();
if (!window.getOpenState().get() && !window.isClosed()) window.close();
}
}
//end frame
ImGui.render();
imGuiGl3.renderDrawData(ImGui.drawData);
imGuiGl3.renderDrawData(ImGui.getDrawData());
if (ImGui.getIO().hasConfigFlags(ImGuiConfigFlags.ViewportsEnable)) {
final long backupWindowPtr = GLFW.glfwGetCurrentContext();

View File

@ -33,22 +33,22 @@ public class InstanceManageControls {
private FabricVersionLoaderInfo selectedFabric;
public InstanceManageControls(@Nullable Instance instance) {
selected = getVersions(false)[0];
selected = getVersions(false).get(0);
if (instance != null) {
for (VersionsListInfo ver : getVersions(true)) {
if (ver.id.equals(instance.gameVersion))
if (ver.id.equals(instance.getGameVersion()))
selected = ver;
}
}
version.set(getVersions(snapshots.get()).indexOf(selected));
name.set(instance == null ? InstanceNameTool.getDefaultName(selected.id, fabric.get()) : instance.name);
fabric.set(instance == null || instance.isFabric);
name.set(instance == null ? InstanceNameTool.getDefaultName(selected.id, fabric.get()) : instance.getName());
fabric.set(instance == null || instance.isFabric());
List<FabricVersionLoaderInfo> versions = FabricMetaApi.getLoaderVersions(selected);
for (int i = 0, fabricLoaderInfoSize = versions.size(); i < fabricLoaderInfoSize; i++) {
FabricVersionLoaderInfo version = versions[i];
if (instance != null && instance.isFabric
? version.loader.version.equals(instance.loaderVersion)
: version.loader.stable) {
FabricVersionLoaderInfo version = versions.get(i);
if (instance != null && instance.isFabric()
? version.loader.version().equals(instance.getLoaderVersion())
: version.loader.stable()) {
selectedFabric = version;
fabricVersion.set(i);
break;
@ -73,7 +73,7 @@ public class InstanceManageControls {
InceptumConfig.snapshots = snapshots.get();
InceptumConfig.saveConfig();
//fix version index
int i = getVersions(InceptumConfig.snapshots).indexOf(getVersions(prev)[version.get()]);
int i = getVersions(InceptumConfig.snapshots).indexOf(getVersions(prev).get(version.get()));
if (i == -1) version.set(0);
else version.set(i);
}
@ -83,13 +83,13 @@ public class InstanceManageControls {
List<VersionsListInfo> vil = getVersions(InceptumConfig.snapshots);
String originalStr = null;
try {
originalStr = versionInfo.id;
originalStr = getVersionInfo().id;
} catch (Throwable e) {
Utils.LOGGER.error("Could not get version string", e);
}
if (ImGui.combo("Version", version, vil.stream().map(info -> info.id).toArray(String[]::new))) {
VersionsListInfo prev = selected;
selected = vil[version.get()];
selected = vil.get(version.get());
exchangeNameIfDefault(prev.id, fabric.get());
}
List<FabricVersionLoaderInfo> versions = FabricMetaApi.getLoaderVersions(selected);
@ -102,14 +102,14 @@ public class InstanceManageControls {
}
if (fabric.get()) {
ImGui.sameLine();
if (ImGui.combo("Loader", fabricVersion, versions.stream().map(info -> info.loader.version).toArray(String[]::new))) {
if (ImGui.combo("Loader", fabricVersion, versions.stream().map(info -> info.loader.version()).toArray(String[]::new))) {
selectedFabric = versions.get(fabricVersion.get());
}
}
}
try {
if (originalStr != null && !originalStr.equals(getVersionInfo().id))
modifiedVersion.accept(versionInfo.id);
modifiedVersion.accept(getVersionInfo().id);
} catch (IOException e) {
Utils.LOGGER.error("Could not compare version string", e);
}
@ -128,10 +128,10 @@ public class InstanceManageControls {
}
public VersionInfo getVersionInfo() throws IOException {
return VERSION_INFO_CACHE.get(Tuple.of(selected.id, fabric.get() ? selectedFabric.loader.version : ""), () -> {
return VERSION_INFO_CACHE.get(Tuple.of(selected.id, fabric.get() ? selectedFabric.loader.version() : ""), () -> {
VersionInfo vi = McApi.getVersionInfo(selected);
if (fabric.get())
vi = FabricMetaApi.addFabric(vi, selectedFabric.loader.version, FabricMetaApi.FabricVersionInfoType.Both);
vi = FabricMetaApi.addFabric(vi, selectedFabric.loader.version(), FabricMetaApi.FabricVersionInfoType.Both);
return vi;
});
}
@ -141,7 +141,7 @@ public class InstanceManageControls {
}
private List<VersionsListInfo> getVersions(boolean snapshots) {
ArrayList<VersionsListInfo> res = new ArrayList<>(VERSIONS.versions);
ArrayList<VersionsListInfo> res = new ArrayList<>(VERSIONS.versions());
res.removeIf(info -> !snapshots && !info.type.equals("release"));
return res;
}

View File

@ -15,26 +15,26 @@ import java.nio.file.Files;
public class InstanceView {
public static void draw() throws IOException {
if (InstanceList.isEmpty) {
if (InstanceList.isEmpty()) {
ImGui.text("You have not yet created an instance");
ImGui.text("Use File->New Instance to do so");
return;
}
if (ImGui.beginTable("Instances", 2, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
for (Instance instance : InstanceList.ordered()) {
if (instance.isSetupLocked) {
if (instance.isSetupLocked()) {
ImGui.tableNextColumn();
ImGui.text("Setting up");
ImGui.tableNextColumn();
ImGui.text("This instance is currently being set up");
continue;
}
if (!Files.exists(instance.path.resolve(Instance.CONFIG_NAME))) {
if (!Files.exists(instance.path().resolve(Instance.CONFIG_NAME))) {
Utils.LOGGER.error("Invalid instance (doesn't contain " + Instance.CONFIG_NAME + "): " + instance);
continue;
}
ImGui.tableNextColumn();
boolean runDisabled = instance.isRunningLocked;
boolean runDisabled = instance.isRunningLocked();
if (runDisabled) ImGui.beginDisabled();
if (ImGui.button(instance.toString())) {
try {
@ -46,7 +46,7 @@ public class InstanceView {
}
if (runDisabled) ImGui.endDisabled();
ImGui.tableNextColumn();
if (ImGui.button("Edit##" + instance.id)) {
if (ImGui.button("Edit##" + instance.id())) {
try {
GuiMain.open(new InstanceEditWindow(instance));
} catch (IOException e) {

View File

@ -12,7 +12,7 @@ public abstract class Tab {
protected abstract void renderInner();
public void render() {
if (isVisible && ImGui.beginTabItem(name)) {
if (isVisible() && ImGui.beginTabItem(name)) {
renderInner();
ImGui.endTabItem();
}

View File

@ -27,7 +27,7 @@ public class AddModWindow extends Window {
private List<CurseforgeMod> cf = null;
public AddModWindow(Instance instance) {
super(instance.name + " - Add Mods");
super(instance.getName() + " - Add Mods");
this.instance = instance;
}
@ -35,10 +35,10 @@ public class AddModWindow extends Window {
String query = this.query.get();
new Thread(() -> {
try {
ModrinthSearchResult ms = ModrinthApi.search(query, mrPage, instance.gameVersion, ModrinthProjectType.mod);
ModrinthSearchResult ms = ModrinthApi.search(query, mrPage, instance.getGameVersion(), ModrinthProjectType.mod);
if (!this.query.get().equals(query)) return;
mr = ms;
List<CurseforgeMod> cs = CurseforgeApi.search(instance.gameVersion, query, cfPage, "Popularity");
List<CurseforgeMod> cs = CurseforgeApi.search(instance.getGameVersion(), query, cfPage, "Popularity");
if (!this.query.get().equals(query)) return;
cf = cs;
} catch (IOException e) {
@ -57,7 +57,7 @@ public class AddModWindow extends Window {
if (ImGui.beginTabBar("ModsSelect")) {
if (ImGui.beginTabItem("Modrinth")) {
if (mr != null) {
boolean hasNext = (mr.offset + mr.hits.size() < mr.total_hits);
boolean hasNext = (mr.offset() + mr.hits().size() < mr.total_hits());
if (mrPage > 0) {
if (ImGui.button("Previous Page")) {
mrPage--;
@ -71,21 +71,21 @@ public class AddModWindow extends Window {
reSearch();
}
}
if (mr != null && ImGui.beginTable("mods" + instance.id, 3, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
for (ModrinthSearchResult.ModResult mod : mr.hits) {
String modId = (mod.slug != null ? mod.slug : mod.project_id);
if (mr != null && ImGui.beginTable("mods" + instance.id(), 3, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
for (ModrinthSearchResult.ModResult mod : mr.hits()) {
String modId = (mod.slug() != null ? mod.slug() : mod.project_id());
final String idPrefix = "local-";
String projectId = mod.project_id.startsWith(idPrefix) ? mod.project_id.substring(idPrefix.length()) : mod.project_id;
String projectId = mod.project_id().startsWith(idPrefix) ? mod.project_id().substring(idPrefix.length()) : mod.project_id();
//TODO detail view
ImGui.tableNextColumn();
ImGui.text(mod.title);
ImGui.text(mod.title());
ImGui.tableNextColumn();
ImGui.text(mod.description);
ImGui.text(mod.description());
ImGui.tableNextColumn();
boolean alreadyPresent = false;
for (Mod mdsMod : instance.mods) {
alreadyPresent = mdsMod.metadata.sources.keySet().stream()
.anyMatch(s -> s instanceof ModrinthModSource ms && ms.modId.equals(projectId));
for (Mod mdsMod : instance.getMods()) {
alreadyPresent = mdsMod.getMetadata().sources().keySet().stream()
.anyMatch(s -> s instanceof ModrinthModSource ms && ms.getModId().equals(projectId));
if (alreadyPresent)
break;
}
@ -97,12 +97,12 @@ public class AddModWindow extends Window {
ModrinthVersion beta = null;
ModrinthVersion latest = null;
for (ModrinthVersion version : ModrinthApi.getVersions(projectId)) {
if (version.game_versions.contains(instance.gameVersion) && version.loaders.contains("fabric")) {
if (version.game_versions().contains(instance.getGameVersion()) && version.loaders().contains("fabric")) {
latest = version;
if (version.version_type == ModrinthVersion.VersionType.beta || version.version_type == ModrinthVersion.VersionType.release) {
if (version.version_type() == ModrinthVersion.VersionType.beta || version.version_type() == ModrinthVersion.VersionType.release) {
beta = version;
}
if (version.version_type == ModrinthVersion.VersionType.release) {
if (version.version_type() == ModrinthVersion.VersionType.release) {
stable = version;
}
}
@ -115,7 +115,7 @@ public class AddModWindow extends Window {
ModrinthVersion finalLatest = latest;
new Thread(() -> {
try {
ModManager.download(new ModrinthModSource(finalLatest.id), instance.modsDir.resolve((mod.slug == null ? projectId : mod.slug) + ModPath.EXT_IMOD), instance.mds).write();
ModManager.download(new ModrinthModSource(finalLatest.id()), instance.getModsDir().resolve((mod.slug() == null ? projectId : mod.slug()) + ModPath.EXT_IMOD), instance.mds()).write();
} catch (IOException e) {
LauncherEnv.showError("Could not download mod", e);
}
@ -148,28 +148,28 @@ public class AddModWindow extends Window {
reSearch();
}
}
if (cf != null && ImGui.beginTable("curseforge" + instance.id, 3, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
if (cf != null && ImGui.beginTable("curseforge" + instance.id(), 3, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
for (CurseforgeMod mod : cf) {
//TODO detail view
ImGui.tableNextColumn();
ImGui.text(mod.name);
ImGui.text(mod.name());
ImGui.tableNextColumn();
ImGui.text(mod.summary);
ImGui.text(mod.summary());
ImGui.tableNextColumn();
boolean alreadyPresent = false;
for (Mod mdsMod : instance.mds.mods) {
alreadyPresent = mdsMod.metadata.sources.keySet().stream()
.anyMatch(s -> s instanceof CurseforgeModSource ms && ms.projectId == mod.id);
for (Mod mdsMod : instance.mds().getMods()) {
alreadyPresent = mdsMod.getMetadata().sources().keySet().stream()
.anyMatch(s -> s instanceof CurseforgeModSource ms && ms.getProjectId() == mod.id());
if (alreadyPresent)
break;
}
if (alreadyPresent) {
ImGui.text("Installed");
} else {
if (ImGui.button("Add##" + mod.id)) {
if (ImGui.button("Add##" + mod.id())) {
CurseforgeMod.LatestFileIndex latest = null;
for (CurseforgeMod.LatestFileIndex file : mod.latestFilesIndexes) {
if (file.gameVersion.equals(instance.gameVersion)) {
for (CurseforgeMod.LatestFileIndex file : mod.latestFilesIndexes()) {
if (file.gameVersion().equals(instance.getGameVersion())) {
if (latest == null) latest = file;
}
}
@ -179,7 +179,7 @@ public class AddModWindow extends Window {
CurseforgeMod.LatestFileIndex finalLatest = latest;
new Thread(() -> {
try {
ModManager.download(new CurseforgeModSource(mod.id, finalLatest.fileId), instance.modsDir.resolve((mod.slug == null ? mod.id : mod.slug) + ModPath.EXT_IMOD), instance.mds).write();
ModManager.download(new CurseforgeModSource(mod.id(), finalLatest.fileId()), instance.getModsDir().resolve((mod.slug() == null ? mod.id() : mod.slug()) + ModPath.EXT_IMOD), instance.mds()).write();
} catch (IOException e) {
LauncherEnv.showError("Could not download mod", e);
}
@ -188,8 +188,8 @@ public class AddModWindow extends Window {
}
}
ImGui.sameLine();
if (ImGui.button("Web##" + mod.id)) {
Utils.openWebBrowser(new URI(mod.links.websiteUrl));
if (ImGui.button("Web##" + mod.id())) {
Utils.openWebBrowser(new URI(mod.links().websiteUrl()));
}
}
ImGui.endTable();

View File

@ -43,15 +43,15 @@ public class GuiUtil {
pState.updateStep("Starting install process");
GuiMain.open(new ProcessStateWatcherWindow("Creating Instance", "Could not create instance", pState, () -> {
for (Step step : Steps.STEPS) {
if (state.isCancelled) {
if (state.isCancelled()) {
try {
JFiles.deleteRecursive(MetaHolder.INSTANCE_DIR.resolve(state.name));
JFiles.deleteRecursive(MetaHolder.INSTANCE_DIR.resolve(state.name()));
} catch (IOException e) {
Utils.LOGGER.error("Could not delete instance dir", e);
}
return;
}
pState.incrementStep(step.name);
pState.incrementStep(step.getName());
step.execute(state);
}
LauncherEnv.showInfo("The instance was successfully created. You can now launch it using the main menu", "Successfully installed");

View File

@ -49,11 +49,11 @@ public class MainWindow extends Window {
}
if (ImGui.beginMenu("Account")) {
if (ImGui.menuItem("New")) GuiMain.open(new MicrosoftLoginWindow());
AuthInfo selected = AccountManager.selectedAccount;
List<MicrosoftAccount> accounts = AccountManager.accounts;
AuthInfo selected = AccountManager.getSelectedAccount();
List<MicrosoftAccount> accounts = AccountManager.getAccounts();
int accountsSize = accounts.size();
for (int i = 0; i < accountsSize; i++) {
MicrosoftAccount account = accounts[i];
MicrosoftAccount account = accounts.get(i);
if (selected.equals(account)) accountIndex.set(i);
if (ImGui.radioButton(account.minecraftUsername, accountIndex, i)) {
AccountManager.switchAccount(account);

View File

@ -32,7 +32,7 @@ public class NewInstanceWindow extends Window {
imc.nameBox("OK", name -> {
try {
GuiUtil.createInstance(new SetupStepInfo(imc.getVersionInfo(),
imc.loaderInfo,
imc.getLoaderInfo(),
name,
Steps.createProcessState()));
} catch (IOException e) {
@ -53,9 +53,9 @@ public class NewInstanceWindow extends Window {
ProcessState state = new ProcessState(Importers.MAX_STEPS * packs.size(), "Initializing");
GuiMain.open(new ProcessStateWatcherWindow("Importing", "Could not import packs", state, () -> {
for (Path pack : packs) {
if (state.isCancelled) return;
if (state.isCancelled()) return;
Path imported = Importers.importPack(pack, state).path();
if (!state.isCancelled) LauncherEnv.showInfo(pack.fileName + " has been successfully imported as " + imported.fileName, "Imported pack");
if (!state.isCancelled()) LauncherEnv.showInfo(pack.getFileName() + " has been successfully imported as " + imported.getFileName(), "Imported pack");
}
}));
}

View File

@ -32,8 +32,8 @@ public class ProcessStateWatcherWindow extends Window {
@Override
public void draw() {
ImGui.progressBar(state.progress);
ImGui.textUnformatted(state.currentStep);
ImGui.progressBar(state.getProgress());
ImGui.textUnformatted(state.getCurrentStep());
if (ImGui.button("Cancel")) {
state.cancel();
close();

View File

@ -19,19 +19,19 @@ public class ArgumentsTab extends Tab {
public ArgumentsTab(InstanceEditWindow window) {
super("Arguments");
this.window = window;
InstanceMeta meta = window.instance.meta;
InstanceMeta meta = window.instance.meta();
if (meta.arguments == null) meta.arguments = new InstanceMeta.Arguments(new LinkedList<>(), new LinkedList<>(), new LinkedList<>());
if (meta.arguments.jvm == null) meta.arguments = meta.arguments.withJvm(new LinkedList<>());
jvm.set(String.join("\n", meta.arguments.jvm));
if (meta.arguments.client == null) meta.arguments = meta.arguments.withClient(new LinkedList<>());
client.set(String.join("\n", meta.arguments.client));
if (meta.arguments.server == null) meta.arguments = meta.arguments.withServer(new LinkedList<>());
server.set(String.join("\n", meta.arguments.server));
if (meta.arguments.jvm() == null) meta.arguments = meta.arguments.withJvm(new LinkedList<>());
jvm.set(String.join("\n", meta.arguments.jvm()));
if (meta.arguments.client() == null) meta.arguments = meta.arguments.withClient(new LinkedList<>());
client.set(String.join("\n", meta.arguments.client()));
if (meta.arguments.server() == null) meta.arguments = meta.arguments.withServer(new LinkedList<>());
server.set(String.join("\n", meta.arguments.server()));
}
@Override
protected void renderInner() {
InstanceMeta meta = window.instance.meta;
InstanceMeta meta = window.instance.meta();
if (ImGui.inputTextMultiline("JVM", jvm)) {
meta.arguments = meta.arguments.withJvm(List.of(Utils.NEW_LINE.split(jvm.get())));
window.instance.writeMeta();

View File

@ -20,26 +20,26 @@ public class ExportTab extends Tab {
public ExportTab(InstanceEditWindow window) {
super("Export");
this.window = window;
instanceVersion.set(window.instance.meta.instanceVersion);
instanceVersion.set(window.instance.meta().instanceVersion);
}
@Override
protected void renderInner() {
if (ImGui.inputTextWithHint("Version", "Version of the exported Pack", instanceVersion)) {
window.instance.meta.instanceVersion = instanceVersion.get();
window.instance.meta().instanceVersion = instanceVersion.get();
window.instance.writeMeta();
}
if (window.instance.mds.isComplete) {
if (window.instance.mds().isComplete()) {
for (Exporter<?> exporter : Exporters.EXPORTERS) {
if (ImGui.button(exporter.name)) {
if (ImGui.button(exporter.getName())) {
String defaultName = exporter.getDefaultFileName(window.instance);
String filter = "*." + exporter.fileExtension;
Path exportPath = GuiMain.saveFileDialog("Export " + exporter.name + " Pack", defaultName, new String[]{filter}, exporter.name + " packs (" + filter + ")");
String filter = "*." + exporter.getFileExtension();
Path exportPath = GuiMain.saveFileDialog("Export " + exporter.getName() + " Pack", defaultName, new String[]{filter}, exporter.getName() + " packs (" + filter + ")");
if (exportPath != null) {
ProcessState state = new ProcessState(Exporters.STEP_COUNT, "Initializing...");
GuiMain.open(new ProcessStateWatcherWindow("Exporting", "Could not export pack", state, () -> {
exporter.generate(state, window.instance, exportPath);
if (!state.isCancelled) LauncherEnv.showInfo(window.instance.name + " has been successfully exported to " + exportPath, "Successfully exported");
if (!state.isCancelled()) LauncherEnv.showInfo(window.instance.getName() + " has been successfully exported to " + exportPath, "Successfully exported");
}));
}
}

View File

@ -28,7 +28,7 @@ public class GeneralTab extends Tab {
super("General");
this.window = window;
imc = new InstanceManageControls(window.instance);
String java = window.instance.meta.java;
String java = window.instance.meta().java;
customJava = new ImBoolean(java != null);
if (java != null) customJavaPath.set(java);
}
@ -36,12 +36,12 @@ public class GeneralTab extends Tab {
@Override
protected void renderInner() {
if (ImGui.button("Open Directory")) {
Utils.openFile(window.instance.path.toFile());
Utils.openFile(window.instance.path().toFile());
}
imc.nameBox("Rename", name -> {
try {
Path newPath = MetaHolder.INSTANCE_DIR.resolve(name);
Files.move(window.instance.path, newPath);
Files.move(window.instance.path(), newPath);
GuiMain.open(new InstanceEditWindow(window.instance));
window.close();
} catch (IOException e) {
@ -51,13 +51,13 @@ public class GeneralTab extends Tab {
imc.snapshotsBox();
imc.versionBox(ver -> {
window.reDownload = true;
window.instance.meta.gameVersion = ver;
window.instance.meta().gameVersion = ver;
window.instance.writeMeta();
});
if (ImGui.button("Delete"))
LauncherEnv.showOkCancel("This instance will be removed forever (a long time)", "Are you sure?", () -> {
try {
JFiles.deleteRecursive(window.instance.path);
JFiles.deleteRecursive(window.instance.path());
} catch (IOException e) {
LauncherEnv.showError("Could not delete the instance", e);
}
@ -65,15 +65,15 @@ public class GeneralTab extends Tab {
}, R::nop);
if (ImGui.checkbox("Custom Java", customJava)) {
if (customJava.get()) {
window.instance.meta.java = OSUtils.jvmBinary;
customJavaPath.set(window.instance.meta.java);
window.instance.meta().java = OSUtils.getJvmBinary();
customJavaPath.set(window.instance.meta().java);
} else {
window.instance.meta.java = null;
window.instance.meta().java = null;
}
window.instance.writeMeta();
}
if (customJava.get() && ImGui.inputText("Path", customJavaPath)) {
window.instance.meta.java = customJavaPath.get();
window.instance.meta().java = customJavaPath.get();
window.instance.writeMeta();
}
}

View File

@ -16,9 +16,9 @@ public class InstanceEditWindow extends Window {
protected boolean lastTabWasMods = false;
public InstanceEditWindow(Instance instance) throws IOException {
super(instance.name + " - Edit");
super(instance.getName() + " - Edit");
this.instance = instance;
this.instance.mds.start();
this.instance.mds().start();
this.tabs = List.of(
new GeneralTab(this),
new ArgumentsTab(this),
@ -29,15 +29,15 @@ public class InstanceEditWindow extends Window {
@Override
public void draw() {
if (instance.isSetupLocked) {
if (instance.isSetupLocked()) {
ImGui.text("This instance is still being set up.");
return;
}
if (instance.isRunningLocked) {
if (instance.isRunningLocked()) {
ImGui.text("This instance is running. Edits in this state will result in breakage.");
}
lastTabWasMods = false;
if (ImGui.beginTabBar("InstanceEdit" + instance.id)) {
if (ImGui.beginTabBar("InstanceEdit" + instance.id())) {
for (Tab tab : tabs) tab.render();
ImGui.endTabBar();
}

View File

@ -29,9 +29,9 @@ public class ModsTab extends Tab {
@Override
protected void renderInner() {
window.lastTabWasMods = true;
if (!Files.exists(window.instance.modsDir)) {
if (!Files.exists(window.instance.getModsDir())) {
try {
Files.createDirectories(window.instance.modsDir);
Files.createDirectories(window.instance.getModsDir());
} catch (IOException e) {
Utils.LOGGER.error("Could not create mods directory which was missing from this modded instance", e);
}
@ -41,12 +41,12 @@ public class ModsTab extends Tab {
GuiMain.WINDOWS.add(new AddModWindow(window.instance));
}
ImGui.sameLine();
if (Files.exists(window.instance.modsDir) && ImGui.button("Show")) {
Utils.openFile(window.instance.modsDir.toFile());
if (Files.exists(window.instance.getModsDir()) && ImGui.button("Show")) {
Utils.openFile(window.instance.getModsDir().toFile());
}
ImGui.sameLine();
if (Files.exists(window.instance.configDir) && ImGui.button("Configs")) {
Utils.openFile(window.instance.configDir.toFile());
if (Files.exists(window.instance.getConfigDir()) && ImGui.button("Configs")) {
Utils.openFile(window.instance.getConfigDir().toFile());
}
try {
Set<Mod> modSet = window.instance.getMods();
@ -54,10 +54,10 @@ public class ModsTab extends Tab {
float scannedPercentage = 0;
boolean hasUnScanned = false;
for (Mod mod : modSet) {
if (window.instance.mds.hasScanned(mod)) scannedPercentage++;
if (window.instance.mds().hasScanned(mod)) scannedPercentage++;
else hasUnScanned = true;
for (Optional<ModSource> value : mod.metadata.sources.values()) {
if (value.isPresent) {
for (Optional<ModSource> value : mod.getMetadata().sources().values()) {
if (value.isPresent()) {
updatesFound = true;
break;
}
@ -74,21 +74,21 @@ public class ModsTab extends Tab {
ImGui.separator();
for (Mod mod : modSet) {
updatesFound = false;
for (Optional<ModSource> value : mod.metadata.sources.values()) {
updatesFound |= value.isPresent;
for (Optional<ModSource> value : mod.getMetadata().sources().values()) {
updatesFound |= value.isPresent();
}
if (filterUpdates.get() && !updatesFound) continue;
if (ImGui.checkbox("##" + mod.name, mod.isEnabled)) {
Path newSel = ModPath.toggle(mod.metadataPath);
if (ImGui.checkbox("##" + mod.getName(), mod.isEnabled())) {
Path newSel = ModPath.toggle(mod.getMetadataPath());
try {
Files.move(mod.metadataPath, newSel);
if (mod.metadataPath.equals(selected)) selected = newSel;
Files.move(mod.getMetadataPath(), newSel);
if (mod.getMetadataPath().equals(selected)) selected = newSel;
} catch (IOException e) {
LauncherEnv.showError("Could not change disabled state", e);
}
}
ImGui.sameLine();
if (ImGui.button(mod.name)) selected = mod.metadataPath;
if (ImGui.button(mod.getName())) selected = mod.getMetadataPath();
}
} catch (IOException e) {
Utils.LOGGER.error("Could not show mod list", e);
@ -98,24 +98,24 @@ public class ModsTab extends Tab {
ImGui.beginGroup();
if (selected == null) {
ImGui.text("Select a mod to view settings");
} else if (window.instance.mds.hasScanned(selected)) {
Mod md = window.instance.mds[selected];
ImGui.text(md.name);
} else if (window.instance.mds().hasScanned(selected)) {
Mod md = window.instance.mds().get(selected);
ImGui.text(md.getName());
ImGui.separator();
for (String s : md.description) {
for (String s : md.getDescription()) {
ImGui.text(s);
}
ImGui.separator();
Map<ModSource, Optional<ModSource>> sources = md.metadata.sources;
Map<ModSource, Optional<ModSource>> sources = md.getMetadata().sources();
ImGui.text("Sources:");
if (sources.isEmpty)
if (sources.isEmpty())
ImGui.bulletText("Local Drive");
else {
for (var source : sources) {
ImGui.bulletText(source.key.name);
source.value.ifPresent(update -> {
for (var source : sources.entrySet()) {
ImGui.bulletText(source.getKey().getName());
source.getValue().ifPresent(update -> {
ImGui.sameLine();
if (ImGui.button("Update to " + update.version)) {
if (ImGui.button("Update to " + update.getVersion())) {
try {
selected = md.update(update);
} catch (IOException e) {
@ -126,8 +126,8 @@ public class ModsTab extends Tab {
}
}
if (ImGui.button("Delete")) {
if (!md.metadata.dependents.isEmpty)
LauncherEnv.showError("This mod still has the following dependent mods installed: " + String.join(", ", md.metadata.dependents), "Dependents present");
if (!md.getMetadata().dependents().isEmpty())
LauncherEnv.showError("This mod still has the following dependent mods installed: " + String.join(", ", md.getMetadata().dependents()), "Dependents present");
else {
try {
md.delete();
@ -145,6 +145,6 @@ public class ModsTab extends Tab {
@Override
protected boolean isVisible() {
return window.instance.isFabric;
return window.instance.isFabric();
}
}

View File

@ -0,0 +1,12 @@
module io.gitlab.jfronny.inceptum.launcher.imgui {
exports io.gitlab.jfronny.inceptum.imgui;
requires transitive io.gitlab.jfronny.inceptum.launcher;
requires static org.jetbrains.annotations;
requires imgui.binding;
requires org.lwjgl;
requires org.lwjgl.glfw;
requires org.lwjgl.opengl;
requires org.lwjgl.tinyfd;
requires imgui.lwjgl3;
}

View File

@ -1,14 +1,13 @@
plugins {
id("inceptum.library")
id("inceptum.gson-compile")
id("inceptum.manifold")
}
dependencies {
val jlhttpVersion: String by rootProject.extra
val jfCommonsVersion: String by rootProject.extra
val jbAnnotationsVersion: String by rootProject.extra
api(project(":common"))
implementation("net.freeutils:jlhttp:$jlhttpVersion")
implementation("io.gitlab.jfronny:commons-jlhttp:$jfCommonsVersion")
compileOnly("org.jetbrains:annotations:$jbAnnotationsVersion")
}

View File

@ -1,9 +1,9 @@
package io.gitlab.jfronny.inceptum.launcher.api;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.FingerprintMatchesResponse.GC_FingerprintMatchesResponse;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.GetModFileResponse.GC_GetModFileResponse;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.GetModResponse.GC_GetModResponse;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.SearchResponse.GC_SearchResponse;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.GC_FingerprintMatchesResponse;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.GC_GetModFileResponse;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.GC_GetModResponse;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.response.GC_SearchResponse;
import io.gitlab.jfronny.commons.HttpUtils;
import io.gitlab.jfronny.inceptum.common.Net;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeFile;
@ -43,7 +43,7 @@ public class CurseforgeApi {
"gameVersion", gameVersion,
"pageSize", Integer.toString(pageSize),
"index", Integer.toString(page * pageSize)
)), GC_SearchResponse::read, API_KEY).data;
)), GC_SearchResponse::read, API_KEY).data();
}
public static CurseforgeMod getMod(String slug) throws IOException {
@ -52,31 +52,31 @@ public class CurseforgeApi {
"classId", "6",
"slug", slug
)), GC_SearchResponse::read, API_KEY);
if (response.pagination.totalCount != 1) {
if (response.pagination().totalCount() != 1) {
throw new FileNotFoundException("Could not find mod with slug \"" + slug + "\"");
}
return checkDistribution(response.data[0]);
return checkDistribution(response.data().get(0));
}
public static CurseforgeMod getMod(int id) throws IOException {
return checkDistribution(Net.downloadObject(API_URL + "mods/" + id, GC_GetModResponse::read, API_KEY).data);
return checkDistribution(Net.downloadObject(API_URL + "mods/" + id, GC_GetModResponse::read, API_KEY).data());
}
private static CurseforgeMod checkDistribution(CurseforgeMod mod) {
if (!mod.allowModDistribution) {
throw new IllegalArgumentException("The author of the mod \"" + mod.slug + "\" has chosen to deliberately break your ability of downloading it.\n"
if (!mod.allowModDistribution()) {
throw new IllegalArgumentException("The author of the mod \"" + mod.slug() + "\" has chosen to deliberately break your ability of downloading it.\n"
+ "Please let them know that disabling third party downloads does nothing but make the users life harder for no reason.");
}
return mod;
}
public static CurseforgeFile getFile(int modId, int fileId) throws IOException {
return Net.downloadObject(API_URL + "mods/" + modId + "/files/" + fileId, GC_GetModFileResponse::read, API_KEY).data;
return Net.downloadObject(API_URL + "mods/" + modId + "/files/" + fileId, GC_GetModFileResponse::read, API_KEY).data();
}
public static FingerprintMatchesResponse.Result checkFingerprint(long hash) throws IOException, URISyntaxException {
try (Reader r = HttpUtils.post(API_URL + "fingerprints").bodyJson("{\"fingerprints\":[" + hash + "]}").sendReader()) {
return GC_FingerprintMatchesResponse.read(r).data;
return GC_FingerprintMatchesResponse.read(r).data();
}
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.api;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo.GC_FabricVersionLoaderInfo;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.GC_FabricVersionLoaderInfo;
import io.gitlab.jfronny.commons.cache.MemoryOperationResultCache;
import io.gitlab.jfronny.gson.compile.util.GList;
import io.gitlab.jfronny.gson.stream.JsonReader;
@ -44,17 +44,17 @@ public class FabricMetaApi {
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;
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 (Library library : meta.libraries.common)
for (Library library : meta.libraries().common())
libs.add(convertLib(library));
if (type == FabricVersionInfoType.Client || type == FabricVersionInfoType.Both) {
for (Library library : meta.libraries.client)
for (Library library : meta.libraries().client())
libs.add(convertLib(library));
}
if (type == FabricVersionInfoType.Server || type == FabricVersionInfoType.Both) {
for (Library library : meta.libraries.server)
for (Library library : meta.libraries().server())
libs.add(convertLib(library));
}
libs.add(convertLib(new Library(
@ -62,7 +62,7 @@ public class FabricMetaApi {
"https://maven.fabricmc.net/"
)));
libs.add(convertLib(new Library(
ver.intermediary.maven,
ver.intermediary.maven(),
"https://maven.fabricmc.net/"
)));
result.libraries = List.copyOf(libs);
@ -71,18 +71,18 @@ public class FabricMetaApi {
}
private static VersionInfo.Library convertLib(Library library) {
String path = ArtifactMeta.parse(library.name).getJarPath(true);
String path = ArtifactMeta.parse(library.name()).getJarPath(true);
return new VersionInfo.Library(
new VersionInfo.Library.Downloads(
new VersionInfo.Library.Downloads.Artifact(
path,
-1,
null,
library.url + path
library.url() + path
),
null
),
library.name,
library.name(),
new HashMap<>(),
new Rules(true)
);

View File

@ -1,10 +1,10 @@
package io.gitlab.jfronny.inceptum.launcher.api;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.AssetIndex.GC_AssetIndex;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.JvmFileInfo.GC_JvmFileInfo;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.JvmInfo.GC_JvmInfo;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionInfo.GC_VersionInfo;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionsList.GC_VersionsList;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.GC_AssetIndex;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.GC_JvmFileInfo;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.GC_JvmInfo;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.GC_VersionInfo;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.GC_VersionsList;
import io.gitlab.jfronny.commons.OSUtils;
import io.gitlab.jfronny.inceptum.common.MetaHolder;
import io.gitlab.jfronny.inceptum.common.Net;
@ -48,22 +48,22 @@ public class McApi {
// https://github.com/ATLauncher/ATLauncher/blob/master/src/main/java/com/atlauncher/constants/Constants.java#L123
JvmInfo info = Net.downloadObject("https://launchermeta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json", GC_JvmInfo::read);
Map<String, List<JvmInfo.Jvm>> vms = switch (OSUtils.TYPE) {
case WINDOWS -> info.windowsX64;
case LINUX -> info.linux;
case MAC_OS -> info.macOs;
case WINDOWS -> info.windowsX64();
case LINUX -> info.linux();
case MAC_OS -> info.macOs();
};
List<JvmInfo.Jvm> vmList = vms[component];
List<JvmInfo.Jvm> vmList = vms.get(component);
if (vmList == null)
throw new IOException("Invalid component: " + component + " (available: " + String.join(", ", vms.keySet()));
for (JvmInfo.Jvm jvm : vmList) {
if (jvm.version.name.startsWith(Integer.toString(majorVersion))) {
return downloadObject(jvm.manifest.url, jvm.manifest.sha1, GC_JvmFileInfo::read).files;
if (jvm.version().name().startsWith(Integer.toString(majorVersion))) {
return downloadObject(jvm.manifest().url, jvm.manifest().sha1, GC_JvmFileInfo::read).files();
}
}
throw new IOException("JVM not found");
}
public static void downloadAsset(AssetIndex.Asset asset, Path path) throws IOException, URISyntaxException {
Net.downloadFile("https://resources.download.minecraft.net/" + asset.hash.substring(0, 2) + "/" + asset.hash, asset.hash, path);
Net.downloadFile("https://resources.download.minecraft.net/" + asset.hash().substring(0, 2) + "/" + asset.hash(), asset.hash(), path);
}
}

View File

@ -1,8 +1,8 @@
package io.gitlab.jfronny.inceptum.launcher.api;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthProject.GC_ModrinthProject;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthSearchResult.GC_ModrinthSearchResult;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthVersion.GC_ModrinthVersion;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthProject;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthSearchResult;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthVersion;
import io.gitlab.jfronny.gson.compile.util.GList;
import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.inceptum.common.Net;
@ -38,7 +38,7 @@ public class ModrinthApi {
return GList.read(r, GC_ModrinthVersion::read);
}
});
versions.sort(Comparator.comparing(version -> version.date_published));
versions.sort(Comparator.comparing(ModrinthVersion::date_published));
return versions;
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.api.account;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.api.account.MicrosoftAccount.GC_MicrosoftAccount;
import io.gitlab.jfronny.inceptum.launcher.api.account.GC_MicrosoftAccount;
import io.gitlab.jfronny.commons.ref.R;
import io.gitlab.jfronny.gson.compile.util.GList;
import io.gitlab.jfronny.gson.stream.JsonReader;
@ -28,7 +28,7 @@ public class AccountManager {
}
public static boolean accountMissing() {
return ACCOUNTS.isEmpty;
return ACCOUNTS.isEmpty();
}
public static List<MicrosoftAccount> getAccounts() {
@ -81,7 +81,7 @@ public class AccountManager {
if (ACCOUNTS.size() == 1)
switchAccount(null);
else
switchAccount(ACCOUNTS[0]);
switchAccount(ACCOUNTS.get(0));
}
ACCOUNTS.remove(account);
saveAccounts();

View File

@ -58,14 +58,14 @@ public class MicrosoftAccount {
public boolean mustLogin;
public MicrosoftAccount(MicrosoftAccountMeta meta) {
this.accountId = meta.accountId;
this.minecraftUsername = meta.minecraftUsername;
this.uuid = meta.uuid;
this.accessToken = meta.accessToken;
this.oauthToken = meta.oauthToken;
this.xstsAuth = meta.xstsAuth;
this.accessTokenExpiresAt = meta.accessTokenExpiresAt;
this.mustLogin = meta.mustLogin;
this.accountId = meta.accountId();
this.minecraftUsername = meta.minecraftUsername();
this.uuid = meta.uuid();
this.accessToken = meta.accessToken();
this.oauthToken = meta.oauthToken();
this.xstsAuth = meta.xstsAuth();
this.accessTokenExpiresAt = meta.accessTokenExpiresAt();
this.mustLogin = meta.mustLogin();
}
public MicrosoftAccountMeta toMeta() {
@ -90,14 +90,14 @@ public class MicrosoftAccount {
LoginResponse loginResponse, Profile profile) {
this.oauthToken = oauthTokenResponse;
this.xstsAuth = xstsAuthResponse;
this.accessToken = loginResponse.accessToken;
this.minecraftUsername = profile.name;
this.uuid = profile.id;
this.accountId = loginResponse.username;
this.accessToken = loginResponse.accessToken();
this.minecraftUsername = profile.name();
this.uuid = profile.id();
this.accountId = loginResponse.username();
this.mustLogin = false;
this.accessTokenExpiresAt = new Date();
this.accessTokenExpiresAt.time += loginResponse.expiresIn * 1000;
this.accessTokenExpiresAt.setTime(this.accessTokenExpiresAt.getTime() + loginResponse.expiresIn() * 1000);
}
public String getAccessToken() {
@ -110,8 +110,8 @@ public class MicrosoftAccount {
public String getCurrentUsername() throws IOException, URISyntaxException {
Profile profile = MicrosoftAuthAPI.getMcProfile(accessToken);
if (profile.name == null) throw new IOException("Got null name");
return profile.name;
if (profile.name() == null) throw new IOException("Got null name");
return profile.name();
}
public void updateSkinPreCheck() {
@ -120,11 +120,11 @@ public class MicrosoftAccount {
public String getSkinUrl() throws IOException, URISyntaxException {
Profile profile = MicrosoftAuthAPI.getMcProfile(accessToken);
return Optional.of(profile.skins).orElse(new ArrayList<>())
return Optional.of(profile.skins()).orElse(new ArrayList<>())
.stream()
.filter(s -> s.state.equalsIgnoreCase("ACTIVE"))
.filter(s -> s.state().equalsIgnoreCase("ACTIVE"))
.findFirst()
.map(s -> s.url)
.map(Profile.Skin::url)
.orElse(null);
}
@ -134,9 +134,9 @@ public class MicrosoftAccount {
public boolean refreshAccessToken(boolean force) {
try {
if (force || new Date().after(this.oauthToken.expiresAt)) {
if (force || new Date().after(this.oauthToken.expiresAt())) {
Utils.LOGGER.info("Oauth token expired. Attempting to refresh");
OauthTokenResponse oauthTokenResponse = MicrosoftAuthAPI.refreshAccessToken(oauthToken.refreshToken);
OauthTokenResponse oauthTokenResponse = MicrosoftAuthAPI.refreshAccessToken(oauthToken.refreshToken());
if (oauthTokenResponse == null) {
mustLogin = true;
@ -150,10 +150,10 @@ public class MicrosoftAccount {
AccountManager.saveAccounts();
}
if (force || new Date().after(this.xstsAuth.notAfter)) {
if (force || new Date().after(this.xstsAuth.notAfter())) {
Utils.LOGGER.info("xsts auth expired. Attempting to get new auth");
XboxLiveAuthResponse xboxLiveAuthResponse = MicrosoftAuthAPI.getXBLToken(this.oauthToken.accessToken);
this.xstsAuth = MicrosoftAuthAPI.getXstsToken(xboxLiveAuthResponse.token);
XboxLiveAuthResponse xboxLiveAuthResponse = MicrosoftAuthAPI.getXBLToken(this.oauthToken.accessToken());
this.xstsAuth = MicrosoftAuthAPI.getXstsToken(xboxLiveAuthResponse.token());
if (xstsAuth == null) {
mustLogin = true;
@ -166,7 +166,7 @@ public class MicrosoftAccount {
}
if (force || new Date().after(this.accessTokenExpiresAt)) {
LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft(identityToken);
LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft(getIdentityToken());
if (loginResponse == null) {
mustLogin = true;
@ -175,11 +175,11 @@ public class MicrosoftAccount {
return false;
}
this.accessToken = loginResponse.accessToken;
this.accountId = loginResponse.username;
this.accessToken = loginResponse.accessToken();
this.accountId = loginResponse.username();
this.accessTokenExpiresAt = new Date();
this.accessTokenExpiresAt.time += loginResponse.expiresIn * 1000;
this.accessTokenExpiresAt.setTime(this.accessTokenExpiresAt.getTime() + loginResponse.expiresIn() * 1000);
AccountManager.saveAccounts();
}
@ -195,7 +195,7 @@ public class MicrosoftAccount {
}
private String getIdentityToken() {
return "XBL3.0 x=" + xstsAuth.displayClaims.xui[0].uhs + ";" + xstsAuth.token;
return "XBL3.0 x=" + xstsAuth.displayClaims().xui().get(0).uhs() + ";" + xstsAuth.token();
}
public boolean ensureAccessTokenValid() {

View File

@ -1,13 +1,13 @@
package io.gitlab.jfronny.inceptum.launcher.api.account;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.Entitlements.GC_Entitlements;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.Profile.GC_Profile;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.LoginRequest.GC_LoginRequest;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.XblTokenRequest.GC_XblTokenRequest;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.XstsTokenRequest.GC_XstsTokenRequest;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.LoginResponse.GC_LoginResponse;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.OauthTokenResponse.GC_OauthTokenResponse;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.XboxLiveAuthResponse.GC_XboxLiveAuthResponse;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.GC_Entitlements;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.GC_Profile;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.GC_LoginRequest;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.GC_XblTokenRequest;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.GC_XstsTokenRequest;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.GC_LoginResponse;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.GC_OauthTokenResponse;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.GC_XboxLiveAuthResponse;
import io.gitlab.jfronny.commons.HttpUtils;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.Entitlements;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.Profile;

View File

@ -1,11 +1,12 @@
package io.gitlab.jfronny.inceptum.launcher.api.account;
import io.gitlab.jfronny.commons.jlhttp.JLHTTPServer;
import io.gitlab.jfronny.commons.jlhttp.util.VirtualHost;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.LauncherEnv;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.Entitlements;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.Profile;
import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.*;
import net.freeutils.httpserver.HTTPServer;
import org.jetbrains.annotations.Nullable;
import java.io.Closeable;
@ -15,8 +16,8 @@ import java.nio.charset.StandardCharsets;
import java.util.Objects;
public class MicrosoftAuthServer implements Closeable {
private static final HTTPServer server = new HTTPServer(MicrosoftAuthAPI.MICROSOFT_LOGIN_REDIRECT_PORT);
private static final HTTPServer.VirtualHost host = server.getVirtualHost(null);
private static final JLHTTPServer server = new JLHTTPServer(MicrosoftAuthAPI.MICROSOFT_LOGIN_REDIRECT_PORT);
private static final VirtualHost host = server.getVirtualHost(null);
private final MicrosoftAccount previous;
@ -26,33 +27,33 @@ public class MicrosoftAuthServer implements Closeable {
public void start() throws IOException {
host.addContext("/", (req, res) -> {
if (req.params.containsKey("error")) {
res.headers.add("Content-Type", "text/plain");
if (req.getParams().containsKey("error")) {
res.getHeaders().add("Content-Type", "text/plain");
res.send(500, "Error logging in. Check console for more information");
Utils.LOGGER.error("Error logging into Microsoft account: " + URLDecoder
.decode(req.params["error_description"], StandardCharsets.UTF_8));
.decode(req.getParams().get("error_description"), StandardCharsets.UTF_8));
close();
return 0;
}
if (!req.params.containsKey("code")) {
res.headers.add("Content-Type", "text/plain");
if (!req.getParams().containsKey("code")) {
res.getHeaders().add("Content-Type", "text/plain");
res.send(400, "Code is missing");
close();
return 0;
}
try {
acquireAccessToken(req.params["code"]);
acquireAccessToken(req.getParams().get("code"));
} catch (Exception e) {
Utils.LOGGER.error("Error acquiring accessToken", e);
res.headers.add("Content-Type", "text/html");
res.getHeaders().add("Content-Type", "text/html");
res.send(500, "Error logging in. Check console for more information");
close();
return 0;
}
res.headers.add("Content-Type", "text/plain");
res.getHeaders().add("Content-Type", "text/plain");
// #. {0} is the name of the launcher
res.send(200, "Login complete. You can now close this window and go back to the Launcher");
close();
@ -63,8 +64,8 @@ public class MicrosoftAuthServer implements Closeable {
}
private void addAccount(OauthTokenResponse oauthTokenResponse, XboxLiveAuthResponse xstsAuthResponse, LoginResponse loginResponse, Profile profile) {
if (this.previous != null || AccountManager.isAccountByName(loginResponse.username)) {
MicrosoftAccount account = (MicrosoftAccount) AccountManager.getAccountByName(loginResponse.username);
if (this.previous != null || AccountManager.isAccountByName(loginResponse.username())) {
MicrosoftAccount account = (MicrosoftAccount) AccountManager.getAccountByName(loginResponse.username());
if (account == null) {
return;
@ -91,7 +92,7 @@ public class MicrosoftAuthServer implements Closeable {
}
private void acquireXBLToken(OauthTokenResponse oauthTokenResponse) throws Exception {
XboxLiveAuthResponse xblAuthResponse = MicrosoftAuthAPI.getXBLToken(oauthTokenResponse.accessToken);
XboxLiveAuthResponse xblAuthResponse = MicrosoftAuthAPI.getXBLToken(oauthTokenResponse.accessToken());
acquireXsts(oauthTokenResponse, xblAuthResponse.token());
}
@ -105,16 +106,16 @@ public class MicrosoftAuthServer implements Closeable {
}
private void acquireMinecraftToken(OauthTokenResponse oauthTokenResponse, XboxLiveAuthResponse xstsAuthResponse) throws Exception {
LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft("XBL3.0 x=" + xstsAuthResponse.displayClaims.xui[0].uhs + ";" + xstsAuthResponse.token);
LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft("XBL3.0 x=" + xstsAuthResponse.displayClaims().xui().get(0).uhs() + ";" + xstsAuthResponse.token());
if (loginResponse == null) {
throw new Exception("Failed to login to Minecraft");
}
Entitlements entitlements = MicrosoftAuthAPI.getEntitlements(loginResponse.accessToken);
Entitlements entitlements = MicrosoftAuthAPI.getEntitlements(loginResponse.accessToken());
if (!(entitlements.items.stream().anyMatch(i -> i.name.equalsIgnoreCase("product_minecraft"))
&& entitlements.items.stream().anyMatch(i -> i.name.equalsIgnoreCase("game_minecraft")))) {
if (!(entitlements.items().stream().anyMatch(i -> i.name().equalsIgnoreCase("product_minecraft"))
&& entitlements.items().stream().anyMatch(i -> i.name().equalsIgnoreCase("game_minecraft")))) {
LauncherEnv.showError("This account doesn't have a valid purchase of Minecraft.\nPlease make sure you've bought the Java edition of Minecraft and then try again.", "Doesn't own Minecraft");
throw new Exception("Account does not own Minecraft");
}
@ -122,7 +123,7 @@ public class MicrosoftAuthServer implements Closeable {
Profile profile = null;
try {
profile = MicrosoftAuthAPI.getMcProfile(loginResponse.accessToken);
profile = MicrosoftAuthAPI.getMcProfile(loginResponse.accessToken());
} catch (Exception e) {
LauncherEnv.showError("""
No Minecraft profiles were found for this account. Have you purchased Minecraft?

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.gson;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.gson.MicrosoftAccountMeta.GC_MicrosoftAccountMeta;
import io.gitlab.jfronny.inceptum.launcher.gson.GC_MicrosoftAccountMeta;
import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.gson.stream.JsonWriter;
import io.gitlab.jfronny.inceptum.launcher.api.account.MicrosoftAccount;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.gson;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.Rules.GC_Rules;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.GC_Rules;
import io.gitlab.jfronny.gson.JsonParseException;
import io.gitlab.jfronny.gson.compile.util.GList;
import io.gitlab.jfronny.gson.stream.*;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.gson;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.system.source.ModSource.GC_ModSource;
import io.gitlab.jfronny.inceptum.launcher.system.source.GC_ModSource;
import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.gson.stream.JsonWriter;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta.Sources;

View File

@ -14,25 +14,25 @@ public class ModSourceAdapter {
writer.beginObject();
if (src instanceof ModrinthModSource mo) {
writer.name("type").value("modrinth")
.name("id").value(mo.versionId);
.name("id").value(mo.getVersionId());
} else if (src instanceof DirectModSource di) {
writer.name("type").value("direct")
.name("fileName").value(di.fileName)
.name("url").value(di.url)
.name("fileName").value(di.getFileName())
.name("url").value(di.url())
.name("dependencies");
writer.beginArray();
for (ModSource dependency : di.dependencies) {
for (ModSource dependency : di.dependencies()) {
write(dependency, writer);
}
writer.endArray();
} else if (src instanceof CurseforgeModSource cu) {
writer.name("type").value("curseforge");
if (cu.shortName.matches("\\d+")) {
writer.name("projectId").value(cu.projectId);
if (cu.getShortName().matches("\\d+")) {
writer.name("projectId").value(cu.getProjectId());
} else {
writer.name("project").value(cu.shortName);
writer.name("project").value(cu.getShortName());
}
writer.name("fileId").value(cu.fileId);
writer.name("fileId").value(cu.getFileId());
} else throw new RuntimeException("ModSources with the type " + src.getClass() + " are not supported");
writer.endObject();
}

View File

@ -51,7 +51,7 @@ public class RulesAdapter {
throw new JsonParseException("Unexpected action in argument: " + actionType);
}
if (hasFeatures) valid = false;
if (osName != null && !OSUtils.TYPE.mojName.equals(osName)) valid = false;
if (osName != null && !OSUtils.TYPE.getMojName().equals(osName)) valid = false;
if (osVersion != null && !System.getProperty("os.version").matches(osVersion)) valid = false;
if (actionType.equals("disallow")) valid = !valid;
}

View File

@ -86,7 +86,7 @@ public record ModMeta(
boolean changed = false;
if (!modrinth) {
try {
addSource(new ModrinthModSource(ModrinthApi.getVersionByHash(sha1).id), gameVersion);
addSource(new ModrinthModSource(ModrinthApi.getVersionByHash(sha1).id()), gameVersion);
changed = true;
} catch (IOException e) {
// not found
@ -95,9 +95,9 @@ public record ModMeta(
if (!curseforge) {
try {
FingerprintMatchesResponse.Result cf = CurseforgeApi.checkFingerprint(murmur2);
if (!cf.exactMatches.isEmpty) {
FingerprintMatchesResponse.Result.Match f = cf.exactMatches[0];
addSource(new CurseforgeModSource(f.id, f.file.id), gameVersion);
if (!cf.exactMatches().isEmpty()) {
FingerprintMatchesResponse.Result.Match f = cf.exactMatches().get(0);
addSource(new CurseforgeModSource(f.id(), f.file().id()), gameVersion);
changed = true;
}
} catch (IOException | URISyntaxException e) {
@ -109,9 +109,9 @@ public record ModMeta(
public void addSource(ModSource source, String gameVersion) {
try {
sources[source] = source.getUpdate(gameVersion);
sources.put(source, source.getUpdate(gameVersion));
} catch (IOException e) {
Utils.LOGGER.error("Could not check " + source.name + " for updates", e);
Utils.LOGGER.error("Could not check " + source.getName() + " for updates", e);
}
}
}

View File

@ -32,7 +32,7 @@ public record OauthTokenResponse(
private static Date getExpiresAt(Date expiresAt, long expiresIn) {
if (expiresAt == null) {
expiresAt = new Date();
expiresAt.time += expiresIn * 1000;
expiresAt.setTime(expiresAt.getTime() + expiresIn * 1000);
}
return expiresAt;
}

View File

@ -9,7 +9,7 @@ import java.nio.file.attribute.BasicFileAttributes;
public class CleanupFileVisitor implements FileVisitor<Path> {
@Override
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes basicFileAttributes) throws IOException {
if (JFiles.list(path).isEmpty) {
if (JFiles.list(path).isEmpty()) {
Files.delete(path);
return FileVisitResult.SKIP_SUBTREE;
}
@ -28,7 +28,7 @@ public class CleanupFileVisitor implements FileVisitor<Path> {
@Override
public FileVisitResult postVisitDirectory(Path path, IOException e) throws IOException {
if (Files.exists(path) && JFiles.list(path).isEmpty) {
if (Files.exists(path) && JFiles.list(path).isEmpty()) {
Files.delete(path);
}
return FileVisitResult.CONTINUE;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.exporter;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest.GC_CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.GC_CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.common.InceptumConfig;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
@ -24,20 +24,20 @@ public class CurseForgeExporter extends Exporter<CurseforgeModpackManifest> {
protected CurseforgeModpackManifest generateManifests(Path root, Instance instance, String version) throws IOException {
CurseforgeModpackManifest manifest = new CurseforgeModpackManifest(
new CurseforgeModpackManifest.Minecraft(
instance.gameVersion,
instance.getGameVersion(),
new LinkedHashSet<>()
),
"minecraftModpack",
1,
instance.name,
instance.getName(),
version,
InceptumConfig.authorName,
null, // files
OVERRIDES_DIR_DEFAULT
);
if (instance.isFabric) {
manifest.minecraft.modLoaders.add(new CurseforgeModpackManifest.Minecraft.ModLoader(
"fabric-" + instance.loaderVersion,
if (instance.isFabric()) {
manifest.minecraft().modLoaders().add(new CurseforgeModpackManifest.Minecraft.ModLoader(
"fabric-" + instance.getLoaderVersion(),
true
));
}
@ -48,17 +48,17 @@ public class CurseForgeExporter extends Exporter<CurseforgeModpackManifest> {
@Override
protected void addMods(Path root, Instance instance, Iterable<Mod> mods, CurseforgeModpackManifest manifest, Path modsOverrides) throws IOException {
modsLoop: for (Mod mod : mods) {
if (mod.needsInject) {
for (ModSource source : mod.metadata.sources.keySet()) {
if (mod.getNeedsInject()) {
for (ModSource source : mod.getMetadata().sources().keySet()) {
if (source instanceof CurseforgeModSource cms) {
manifest.files.add(cms.toManifest());
manifest.files().add(cms.toManifest());
continue modsLoop;
}
}
}
// Not available on CF
Files.createDirectories(modsOverrides);
Files.copy(mod.jarPath, modsOverrides.resolve(mod.jarPath.fileName.toString()));
Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString()));
}
GC_CurseforgeModpackManifest.write(manifest, root.resolve("manifest.json"));
}

View File

@ -1,5 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.exporter;
import io.gitlab.jfronny.commons.StreamIterable;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
@ -32,18 +33,18 @@ public abstract class Exporter<Manifest> {
Path root = fs.getPath(".");
Path overrides = fs.getPath(overridesDirName);
state.incrementStep("Preparing manifests");
Manifest manifest = generateManifests(root, instance, instance.meta.instanceVersion);
if (instance.isFabric) {
Manifest manifest = generateManifests(root, instance, instance.meta().instanceVersion);
if (instance.isFabric()) {
state.incrementStep("Adding mods");
addMods(root, instance, instance.mods.stream().filter(mod -> {
if (!mod.isEnabled) return false;
state.updateStep(mod.name);
addMods(root, instance, instance.getMods().stream().filter(mod -> {
if (!mod.isEnabled()) return false;
state.updateStep(mod.getName());
return true;
}).toList(), manifest, overrides.resolve("mods"));
}
state.incrementStep("Adding files");
filesLoop: for (Path path : IgnoringWalk.walk(instance.path)) {
Path relativePath = instance.path.relativize(path).normalize();
filesLoop: for (Path path : new StreamIterable<>(IgnoringWalk.walk(instance.path()))) {
Path relativePath = instance.path().relativize(path).normalize();
Path target = overrides;
for (Path segment : relativePath) {
if (target == overrides && segment.toString().equals("mods")) continue filesLoop;
@ -51,7 +52,7 @@ public abstract class Exporter<Manifest> {
target = target.resolve(segment.toString());
}
state.updateStep(relativePath.toString());
Files.createDirectories(target.parent);
Files.createDirectories(target.getParent());
Files.copy(path, target);
}
state.incrementStep("Cleaning up");
@ -74,6 +75,6 @@ public abstract class Exporter<Manifest> {
}
public String getDefaultFileName(Instance instance) {
return instance.name + " " + instance.meta.instanceVersion + " (" + name + ")." + fileExtension;
return instance.getName() + " " + instance.meta().instanceVersion + " (" + name + ")." + fileExtension;
}
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.exporter;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthModpackManifest.GC_ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
@ -23,13 +23,13 @@ public class ModrinthExporter extends Exporter<ModrinthModpackManifest> {
1,
"minecraft",
version,
instance.name,
instance.getName(),
null, // summary
new ArrayList<>(),
new ModrinthModpackManifest.Dependencies(
instance.gameVersion,
instance.getGameVersion(),
null,
instance.isFabric ? instance.loaderVersion : null,
instance.isFabric() ? instance.getLoaderVersion() : null,
null
)
);
@ -40,17 +40,17 @@ public class ModrinthExporter extends Exporter<ModrinthModpackManifest> {
@Override
protected void addMods(Path root, Instance instance, Iterable<Mod> mods, ModrinthModpackManifest manifest, Path modsOverrides) throws IOException {
modsLoop: for (Mod mod : mods) {
if (mod.needsInject) {
for (ModSource source : mod.metadata.sources.keySet()) {
if (mod.getNeedsInject()) {
for (ModSource source : mod.getMetadata().sources().keySet()) {
if (source instanceof ModrinthModSource cms) {
manifest.files.add(cms.toManifest());
manifest.files().add(cms.toManifest());
continue modsLoop;
}
}
}
// Not available on modrinth
Files.createDirectories(modsOverrides);
Files.copy(mod.jarPath, modsOverrides.resolve(mod.jarPath.fileName.toString()));
Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString()));
}
GC_ModrinthModpackManifest.write(manifest, root.resolve("modrinth.index.json"));
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.exporter;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.multimc.MMCPackMeta.GC_MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.model.multimc.GC_MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.model.multimc.MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
@ -43,16 +43,16 @@ public class MultiMCExporter extends Exporter<MMCPackMeta> {
name=%s
notes=
totalTimePlayed=0
""", Instant.now().toEpochMilli(), instance.name));
""", Instant.now().toEpochMilli(), instance.getName()));
}
{
MMCPackMeta manifest = new MMCPackMeta(new ArrayList<>(), 1);
//TODO get version automatically
manifest.components.add(new MMCPackMeta.Component(true, false, "org.lwjgl3", "3.2.2"));
manifest.components.add(new MMCPackMeta.Component(false, true, "net.minecraft", instance.gameVersion));
manifest.components().add(new MMCPackMeta.Component(true, false, "org.lwjgl3", "3.2.2"));
manifest.components().add(new MMCPackMeta.Component(false, true, "net.minecraft", instance.getGameVersion()));
if (instance.isFabric()) {
manifest.components.add(new MMCPackMeta.Component(true, false, "net.fabricmc.intermediary", instance.gameVersion));
manifest.components.add(new MMCPackMeta.Component(false, false, "net.fabricmc.fabric-loader", instance.loaderVersion));
manifest.components().add(new MMCPackMeta.Component(true, false, "net.fabricmc.intermediary", instance.getGameVersion()));
manifest.components().add(new MMCPackMeta.Component(false, false, "net.fabricmc.fabric-loader", instance.getLoaderVersion()));
}
GC_MMCPackMeta.write(manifest, root.resolve("mmc-pack.json"));
return manifest;
@ -62,6 +62,6 @@ public class MultiMCExporter extends Exporter<MMCPackMeta> {
@Override
protected void addMods(Path root, Instance instance, Iterable<Mod> mods, MMCPackMeta mmcPackMeta, Path modsOverrides) throws IOException {
Files.createDirectories(modsOverrides);
for (Mod mod : mods) Files.copy(mod.jarPath, modsOverrides.resolve(mod.jarPath.fileName.toString()));
for (Mod mod : mods) Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString()));
}
}

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.inceptum.launcher.system.importer;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest.GC_CurseforgeModpackManifest;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.GC_CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
@ -20,34 +20,34 @@ public class CurseForgeImporter extends Importer<CurseforgeModpackManifest> {
@Override
protected IntermediaryManifest validateManifest(CurseforgeModpackManifest manifest, Path sourceRoot) throws IOException {
if (manifest.manifestVersion != 1) throw new IOException("Unsupported CurseForge modpack manifest version");
if (!"minecraftModpack".equals(manifest.manifestType)) throw new IOException("Invalid input: not a minecraft modpack");
if (manifest.minecraft == null) throw new IOException("Modpack missing minecraft metadata");
if (manifest.minecraft.version == null) throw new IOException("Modpack missing minecraft version");
if (manifest.manifestVersion() != 1) throw new IOException("Unsupported CurseForge modpack manifest version");
if (!"minecraftModpack".equals(manifest.manifestType())) throw new IOException("Invalid input: not a minecraft modpack");
if (manifest.minecraft() == null) throw new IOException("Modpack missing minecraft metadata");
if (manifest.minecraft().version() == null) throw new IOException("Modpack missing minecraft version");
String fabric = null;
if (manifest.minecraft.modLoaders != null) {
for (CurseforgeModpackManifest.Minecraft.ModLoader loader : manifest.minecraft.modLoaders) {
if (manifest.minecraft().modLoaders() != null) {
for (CurseforgeModpackManifest.Minecraft.ModLoader loader : manifest.minecraft().modLoaders()) {
final String idPrefix = "fabric-";
if (!loader.id.startsWith(idPrefix)) throw new IOException("Unsupported mod loader");
fabric = loader.id.substring(idPrefix.length());
if (!loader.id().startsWith(idPrefix)) throw new IOException("Unsupported mod loader");
fabric = loader.id().substring(idPrefix.length());
}
}
return new IntermediaryManifest(manifest.name, manifest.overrides, manifest.minecraft.version, fabric);
return new IntermediaryManifest(manifest.name(), manifest.overrides(), manifest.minecraft().version(), fabric);
}
@Override
protected void downloadMods(CurseforgeModpackManifest manifest, Path instanceDir, ProcessState state) throws IOException {
if (manifest.files != null) {
if (manifest.files() != null) {
Path modsPath = instanceDir.resolve("mods");
for (CurseforgeModpackManifest.File file : manifest.files) {
if (!file.required) continue;
CurseforgeModSource source = new CurseforgeModSource(file.projectID, file.fileID);
state.updateStep("Downloading " + source.name);
for (CurseforgeModpackManifest.File file : manifest.files()) {
if (!file.required()) continue;
CurseforgeModSource source = new CurseforgeModSource(file.projectID(), file.fileID());
state.updateStep("Downloading " + source.getName());
ModDownload download = source.download();
ModMeta imod = ModMeta.of(download.sha1, download.murmur2, source, manifest.minecraft.version);
ModMeta imod = ModMeta.of(download.sha1(), download.murmur2(), source, manifest.minecraft().version());
Files.createDirectories(modsPath);
GC_ModMeta.write(imod, modsPath.resolve(source.shortName + ModPath.EXT_IMOD));
GC_ModMeta.write(imod, modsPath.resolve(source.getShortName() + ModPath.EXT_IMOD));
}
}
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.importer;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.commons.io.JFiles;
import io.gitlab.jfronny.commons.throwable.ThrowingFunction;
import io.gitlab.jfronny.inceptum.common.MetaHolder;
@ -38,7 +38,7 @@ public abstract class Importer<T> {
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) {
if (McApi.getVersions().versions().stream().filter(v -> v.id.equals(gameVersion)).findFirst().isEmpty()) {
throw new IOException("Invalid minecraft version: " + gameVersion);
}
if (fabricVersion == null) {
@ -50,45 +50,45 @@ public abstract class Importer<T> {
}
public Instance importPack(Path sourceRoot, ProcessState state) throws IOException {
if (state.isCancelled) return null;
if (state.isCancelled()) return null;
state.incrementStep("Generating skeleton");
T manifest = manifestClass.apply(sourceRoot.resolve(manifestFile));
IntermediaryManifest man = validateManifest(manifest, sourceRoot);
String name = man.name;
String name = man.name();
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);
InstanceMeta meta = new InstanceMeta();
meta.gameVersion = createVersionString(man.gameVersion, man.fabricVersion);
meta.gameVersion = createVersionString(man.gameVersion(), man.fabricVersion());
GC_InstanceMeta.write(meta, iDir.resolve(Instance.CONFIG_NAME));
if (state.isCancelled) {
if (state.isCancelled()) {
JFiles.deleteRecursive(iDir);
return null;
}
state.incrementStep("Downloading mods");
downloadMods(manifest, iDir, state);
if (state.isCancelled) {
if (state.isCancelled()) {
JFiles.deleteRecursive(iDir);
return null;
}
state.incrementStep("Adding overrides");
if (man.overridesPath() != null) {
Path overridesPath = sourceRoot.resolve(man.overridesPath);
Path overridesPath = sourceRoot.resolve(man.overridesPath());
JFiles.listTo(overridesPath, path -> {
JFiles.copyRecursive(path, iDir.resolve(path.fileName.toString()));
JFiles.copyRecursive(path, iDir.resolve(path.getFileName().toString()));
});
}
if (state.isCancelled) {
if (state.isCancelled()) {
JFiles.deleteRecursive(iDir);
return null;
}
Instance.setSetupLock(iDir, false);
Instance instance = InstanceList.read(iDir);
Steps.reDownload(instance, state);
if (state.isCancelled) {
if (state.isCancelled()) {
JFiles.deleteRecursive(iDir);
return null;
}

View File

@ -42,7 +42,7 @@ public class Importers {
state.updateStep("Downloading Pack");
Matcher m = CURSEFORGE_URL.matcher(url);
if (m.matches()) {
url = CurseforgeApi.getFile(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2))).downloadUrl;
url = CurseforgeApi.getFile(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2))).downloadUrl();
}
Net.downloadFile(url, tmp);
return importPack(tmp, state);

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.importer;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthModpackManifest.GC_ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.common.Net;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessState;
@ -16,37 +16,37 @@ public class ModrinthImporter extends Importer<ModrinthModpackManifest> {
@Override
protected IntermediaryManifest validateManifest(ModrinthModpackManifest manifest, Path sourceRoot) throws IOException {
if (manifest.formatVersion != 1) throw new IOException("Unsupported Modrinth modpack manifest version");
if (!"minecraft".equals(manifest.game)) throw new IOException("Invalid input: not a minecraft modpack");
if (manifest.dependencies == null) throw new IOException("Modrinth manifest lacks dependency block");
if (manifest.dependencies.minecraft == null) throw new IOException("Could not find minecraft version");
if (manifest.dependencies.fabricLoader == null) {
for (ModrinthModpackManifest.File file : manifest.files) {
if (file.path == null) {
if (manifest.formatVersion() != 1) throw new IOException("Unsupported Modrinth modpack manifest version");
if (!"minecraft".equals(manifest.game())) throw new IOException("Invalid input: not a minecraft modpack");
if (manifest.dependencies() == null) throw new IOException("Modrinth manifest lacks dependency block");
if (manifest.dependencies().minecraft() == null) throw new IOException("Could not find minecraft version");
if (manifest.dependencies().fabricLoader() == null) {
for (ModrinthModpackManifest.File file : manifest.files()) {
if (file.path() == null) {
throw new IOException("File lacks path");
}
if (file.path.startsWith("mods")) {
if (file.path().startsWith("mods")) {
throw new IOException("Found mod files but no fabric loader. Other loaders are unsupported!");
}
}
}
return new IntermediaryManifest(
manifest.name,
manifest.name(),
"overrides",
manifest.dependencies.minecraft,
manifest.dependencies.fabricLoader
manifest.dependencies().minecraft(),
manifest.dependencies().fabricLoader()
);
}
@Override
protected void downloadMods(ModrinthModpackManifest manifest, Path instanceDir, ProcessState state) throws IOException {
if (manifest.files != null) {
filesLoop: for (ModrinthModpackManifest.File file : manifest.files) {
Path path = instanceDir.parent.resolve(file.path).toAbsolutePath().normalize();
if (manifest.files() != null) {
filesLoop: for (ModrinthModpackManifest.File file : manifest.files()) {
Path path = instanceDir.getParent().resolve(file.path()).toAbsolutePath().normalize();
if (!path.startsWith(instanceDir)) throw new IOException("Pack attempted to write file outside instance. This is unsupported!");
String sha1 = file.hashes.sha1;
String sha1 = file.hashes().sha1();
IOException failedDownload = new IOException("Could not download file");
for (String url : file.downloads) {
for (String url : file.downloads()) {
try {
Net.downloadFile(url, sha1, path);
continue filesLoop;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.importer;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.multimc.MMCPackMeta.GC_MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.model.multimc.GC_MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.model.multimc.MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessState;
@ -16,8 +16,8 @@ public class MultiMCImporter extends Importer<MMCPackMeta> {
@Override
protected IntermediaryManifest validateManifest(MMCPackMeta manifest, Path sourceRoot) throws IOException {
if (manifest.formatVersion != 1) throw new IOException("Unsupported MultiMC format version");
if (manifest.components == null) throw new IOException("MultiMC pack missing components");
if (manifest.formatVersion() != 1) throw new IOException("Unsupported MultiMC format version");
if (manifest.components() == null) throw new IOException("MultiMC pack missing components");
String gameVersion = null;
String fabricVersion = null;
String name = null;
@ -31,9 +31,9 @@ public class MultiMCImporter extends Importer<MMCPackMeta> {
.orElse(null);
}
}
for (MMCPackMeta.Component component : manifest.components) {
if ("net.minecraft".equals(component.uid)) gameVersion = component.version;
if ("net.fabricmc.fabric-loader".equals(component.uid)) fabricVersion = component.version;
for (MMCPackMeta.Component component : manifest.components()) {
if ("net.minecraft".equals(component.uid())) gameVersion = component.version();
if ("net.fabricmc.fabric-loader".equals(component.uid())) fabricVersion = component.version();
}
if (gameVersion == null) throw new IOException("Pack lacks minecraft component");
return new IntermediaryManifest(name, ".minecraft", gameVersion, fabricVersion);

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.instance;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.commons.ref.R;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
@ -21,7 +21,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
public static final String CONFIG_NAME = "instance.json";
public Instance(Path path, InstanceMeta meta) throws IOException {
this(generateId(path.fileName.toString()), path, meta, ModsDirScanner.get(path.resolve("mods"), meta));
this(generateId(path.getFileName().toString()), path, meta, ModsDirScanner.get(path.resolve("mods"), meta));
}
public Instance(String id, Path path, InstanceMeta meta, ModsDirScanner mds) {
@ -54,7 +54,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
long time1 = meta.lastLaunched == null ? 0 : meta.lastLaunched;
long time2 = entry.meta.lastLaunched == null ? 0 : entry.meta.lastLaunched;
if (time1 == 0) {
if (time2 == 0) return path.fileName.toString().compareTo(entry.path.fileName.toString());
if (time2 == 0) return path.getFileName().toString().compareTo(entry.path.getFileName().toString());
return -1;
}
if (time2 == 0) return 1;
@ -63,7 +63,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
@Override
public String toString() {
return path.fileName.toString();
return path.getFileName().toString();
}
public Path getModsDir() {
@ -80,7 +80,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
}
public String getName() {
return path.fileName.toString();
return path.getFileName().toString();
}
public boolean isFabric() {
@ -118,7 +118,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
return true;
Files.delete(path.resolve(LOCK_NAME));
} catch (IOException e) {
Utils.LOGGER.error("Could not read running lock of " + name, e);
Utils.LOGGER.error("Could not read running lock of " + getName(), e);
}
return false;
}
@ -139,7 +139,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
}
return true;
} catch (IOException e) {
Utils.LOGGER.error("Could not read running lock of " + name, e);
Utils.LOGGER.error("Could not read running lock of " + getName(), e);
}
return false;
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.instance;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.commons.io.JFiles;
import io.gitlab.jfronny.commons.throwable.ThrowingConsumer;
import io.gitlab.jfronny.commons.throwable.ThrowingRunnable;
@ -29,7 +29,7 @@ public class InstanceList {
synchronized (metas) {
for (var entry : metas.entrySet()) {
try {
entry.value.close();
entry.getValue().close();
} catch (IOException e) {
Utils.LOGGER.error("Could not close reference to instance meta", e);
}
@ -60,7 +60,7 @@ public class InstanceList {
public static boolean isEmpty() throws IOException {
if (!Files.exists(MetaHolder.INSTANCE_DIR)) return true;
return JFiles.list(MetaHolder.INSTANCE_DIR, InstanceList::isInstance).isEmpty;
return JFiles.list(MetaHolder.INSTANCE_DIR, InstanceList::isInstance).isEmpty();
}
public static int size() throws IOException {
@ -74,12 +74,12 @@ public class InstanceList {
Objects.requireNonNull(instancePath);
synchronized (metas) {
if (!metas.containsKey(instancePath)) {
metas[instancePath] = new IEntry(
metas.put(instancePath, new IEntry(
instancePath,
new FileBackedRef<>(instancePath.resolve(Instance.CONFIG_NAME), GC_InstanceMeta::read)
);
));
}
return metas[instancePath].toPub();
return metas.get(instancePath).toPub();
}
}
@ -90,7 +90,7 @@ public class InstanceList {
private record IEntry(Path path, FileBackedRef<InstanceMeta> meta) implements Closeable {
@Override
public String toString() {
return path.fileName.toString();
return path.getFileName().toString();
}
public Instance toPub() throws IOException {

View File

@ -47,7 +47,7 @@ public class InstanceListWatcher implements Closeable {
}
if (kind == ENTRY_DELETE) changed = true;
} else if (Files.exists(dir.resolve(Instance.CONFIG_NAME))) {
String fn = child.fileName.toString();
String fn = child.getFileName().toString();
if (fn.equals(Instance.CONFIG_NAME)
|| fn.equals(Instance.LOCK_NAME)
|| fn.equals(Instance.SETUP_LOCK_NAME)) {

View File

@ -10,6 +10,6 @@ public record LoaderInfo(Type type, String version) {
}
public LoaderInfo(FabricLoaderVersion fabricVersion) {
this(LoaderInfo.Type.Fabric, fabricVersion.version);
this(LoaderInfo.Type.Fabric, fabricVersion.version());
}
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.instance;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModDownload;
@ -11,19 +11,19 @@ import java.nio.file.Path;
public class ModManager {
public static DownloadMeta download(ModSource ms, Path metaFile, ModsDirScanner mds) throws IOException {
for (Mod value : mds.mods) {
for (ModSource source : value.metadata.sources.keySet()) {
for (Mod value : mds.getMods()) {
for (ModSource source : value.getMetadata().sources().keySet()) {
if (ms.equals(source)) {
return new DownloadMeta(new ModDownload(value.metadata.sha1, value.metadata.murmur2, value.jarPath), value.metadata, source, metaFile);
return new DownloadMeta(new ModDownload(value.getMetadata().sha1(), value.getMetadata().murmur2(), value.getJarPath()), value.getMetadata(), source, metaFile);
}
}
}
ModDownload md = ms.download();
ModMeta manifest = ModMeta.of(md.sha1, md.murmur2, ms, mds.gameVersion);
for (ModSource depSrc : ms.getDependencies(mds.gameVersion)) {
DownloadMeta depMeta = download(depSrc, metaFile.parent.resolve(depSrc.shortName + ModPath.EXT_IMOD), mds);
depMeta.meta.dependents.add(metaFile.fileName.toString());
manifest.dependencies.add(depMeta.metaFile.fileName.toString());
ModMeta manifest = ModMeta.of(md.sha1(), md.murmur2(), ms, mds.getGameVersion());
for (ModSource depSrc : ms.getDependencies(mds.getGameVersion())) {
DownloadMeta depMeta = download(depSrc, metaFile.getParent().resolve(depSrc.getShortName() + ModPath.EXT_IMOD), mds);
depMeta.meta.dependents().add(metaFile.getFileName().toString());
manifest.dependencies().add(depMeta.metaFile.getFileName().toString());
depMeta.write();
}
return new DownloadMeta(md, manifest, ms, metaFile);

View File

@ -24,11 +24,11 @@ public class ModPath {
: fileName.endsWith(EXT_IMOD_DISABLED2)
? fileName.substring(0, fileName.length() - EXT_IMOD_DISABLED2.length())
: fileName.substring(0, fileName.length() - EXT_IMOD.length());
return p.parent.resolve(fileName);
return p.getParent().resolve(fileName);
}
public static boolean hasImod(Path mod) {
Path parent = mod.parent;
Path parent = mod.getParent();
if (parent == null) {
Utils.LOGGER.info("The mod file " + mod + " doesn't have a parent. What is happening here?");
return false;
@ -37,7 +37,7 @@ public class ModPath {
}
public static Path appendImod(Path p) {
return p.parent.resolve(fn(p) + EXT_IMOD);
return p.getParent().resolve(fn(p) + EXT_IMOD);
}
public static boolean isJar(Path p) {
@ -53,7 +53,7 @@ public class ModPath {
fileName = fileName.endsWith(EXT_IMOD_DISABLED2)
? fileName.substring(0, fileName.length() - EXT_IMOD_DISABLED2.length()) + EXT_IMOD
: fileName.substring(0, fileName.length() - EXT_DISABLED.length());
return p.parent.resolve(fileName);
return p.getParent().resolve(fileName);
}
public static Path disable(Path p) {
@ -61,7 +61,7 @@ public class ModPath {
fileName = fileName.endsWith(EXT_IMOD)
? fileName.substring(0, fileName.length() - EXT_IMOD.length()) + EXT_IMOD_DISABLED2
: fileName + EXT_DISABLED;
return p.parent.resolve(fileName);
return p.getParent().resolve(fileName);
}
public static Path toggle(Path p) {
@ -69,6 +69,6 @@ public class ModPath {
}
private static String fn(Path p) {
return p.fileName.toString();
return p.getFileName().toString();
}
}

View File

@ -29,7 +29,7 @@ public class InstanceLauncher {
LauncherEnv.showError("You have not set up an account.\nDoing so is required to play Minecraft", "Not authenticated");
return;
}
AuthInfo authInfo = AccountManager.selectedAccount;
AuthInfo authInfo = AccountManager.getSelectedAccount();
if (authInfo.equals(AccountManager.NULL_AUTH)) {
try {
String sysUser = System.getProperty("user.name");
@ -38,7 +38,7 @@ public class InstanceLauncher {
LauncherEnv.getInput("User name", "Please enter the username to use for this session", InceptumConfig.offlineAccountLastName, name -> {
InceptumConfig.offlineAccountLastName = name.equals(sysUser) ? null : name;
InceptumConfig.saveConfig();
AuthInfo infoNew = new AuthInfo(name, authInfo.uuid, authInfo.accessToken, authInfo.userType);
AuthInfo infoNew = new AuthInfo(name, authInfo.uuid(), authInfo.accessToken(), authInfo.userType());
launchClient(instance, infoNew);
}, R::nop);
} catch (IOException e) {
@ -57,11 +57,11 @@ public class InstanceLauncher {
public static void launch(Instance instance, LaunchType launchType, boolean restart, AuthInfo authInfo) throws LaunchException, IOException {
if (authInfo == null) throw new LaunchException("authInfo is null");
VersionsListInfo versionDataSimple = getVersion(instance.gameVersion);
VersionsListInfo versionDataSimple = getVersion(instance.getGameVersion());
VersionInfo versionInfo = McApi.getVersionInfo(versionDataSimple);
// Add fabric metadata if using fabric
if (instance.isFabric) {
versionInfo = FabricMetaApi.addFabric(versionInfo, instance.loaderVersion, launchType.fabricMetaType);
if (instance.isFabric()) {
versionInfo = FabricMetaApi.addFabric(versionInfo, instance.getLoaderVersion(), launchType.fabricMetaType);
}
// Ensure libs/assets are present
DownloadLibrariesStep.execute(versionInfo, new ProcessState());
@ -70,39 +70,39 @@ public class InstanceLauncher {
// JVM path
{
final VersionInfo lambdaVersionInfo = versionInfo;
args.add(Objects.requireNonNullElseGet(instance.meta.java, () ->
args.add(Objects.requireNonNullElseGet(instance.meta().java, () ->
OSUtils.getJvmBinary(MetaHolder.NATIVES_DIR
.resolve(lambdaVersionInfo.javaVersion.component)
.resolve(Integer.toString(lambdaVersionInfo.javaVersion.majorVersion)))
.resolve(lambdaVersionInfo.javaVersion.component())
.resolve(Integer.toString(lambdaVersionInfo.javaVersion.majorVersion())))
.toAbsolutePath().toString()));
}
// Java classpath
StringBuilder classPath = new StringBuilder();
for (ArtifactInfo artifact : VersionInfoLibraryResolver.getRelevant(versionInfo)) {
classPath.append(MetaHolder.LIBRARIES_DIR.resolve(artifact.path));
classPath.append(MetaHolder.LIBRARIES_DIR.resolve(artifact.path()));
classPath.append(File.pathSeparatorChar);
}
Path gameJar = MetaHolder.LIBRARIES_DIR.resolve("net/minecraft/" + launchType.name).resolve(versionDataSimple.id + ".jar");
classPath.append(gameJar);
classPath.append(File.pathSeparatorChar);
classPath.append(DownloadLibrariesStep.launchWrapperArtifact.localPath);
classPath.append(DownloadLibrariesStep.getLaunchWrapperArtifact().getLocalPath());
// JVM arguments
if (instance.meta.arguments != null && instance.meta.arguments.jvm != null)
args.addAll(instance.meta.arguments.jvm);
if (instance.meta().arguments != null && instance.meta().arguments.jvm() != null)
args.addAll(instance.meta().arguments.jvm());
if (launchType == LaunchType.Client && versionInfo.arguments != null)
args.addAll(parse(versionInfo.arguments.jvm, versionInfo, instance, classPath.toString(), authInfo));
if (instance.meta.minMem != null) args.add("-Xms" + instance.meta.minMem);
if (instance.meta.maxMem != null) args.add("-Xmx" + instance.meta.maxMem);
args.addAll(parse(versionInfo.arguments.jvm(), versionInfo, instance, classPath.toString(), authInfo));
if (instance.meta().minMem != null) args.add("-Xms" + instance.meta().minMem);
if (instance.meta().maxMem != null) args.add("-Xmx" + instance.meta().maxMem);
// Forceload natives
if (Files.exists(MetaHolder.FORCE_LOAD_PATH)) {
args.add("-Dinceptum.forceloadNatives=" + MetaHolder.FORCE_LOAD_PATH);
}
// Fabric imods
if (instance.isFabric) {
if (instance.isFabric()) {
StringBuilder fabricAddMods = new StringBuilder("-Dfabric.addMods=");
for (Mod mod : instance.mods) {
if (mod.isEnabled && mod.needsInject) {
fabricAddMods.append(mod.jarPath);
for (Mod mod : instance.getMods()) {
if (mod.isEnabled() && mod.getNeedsInject()) {
fabricAddMods.append(mod.getJarPath());
fabricAddMods.append(File.pathSeparatorChar);
}
}
@ -115,7 +115,7 @@ public class InstanceLauncher {
// Game arguments
if (launchType == LaunchType.Client) {
if (versionInfo.arguments != null)
args.addAll(parse(versionInfo.arguments.game, versionInfo, instance, classPath.toString(), authInfo));
args.addAll(parse(versionInfo.arguments.game(), versionInfo, instance, classPath.toString(), authInfo));
else if (versionInfo.minecraftArguments != null) {
for (String s : versionInfo.minecraftArguments.split(" ")) {
args.add(expandArg(s, versionInfo, instance, classPath.toString(), authInfo));
@ -125,30 +125,30 @@ public class InstanceLauncher {
if (instance.meta().arguments != null) {
switch (launchType) {
case Client -> {
if (instance.meta().arguments.client != null)
args.addAll(instance.meta.arguments.client);
if (instance.meta().arguments.client() != null)
args.addAll(instance.meta().arguments.client());
}
case Server -> {
if (instance.meta().arguments.server != null)
args.addAll(instance.meta.arguments.server);
if (instance.meta().arguments.server() != null)
args.addAll(instance.meta().arguments.server());
}
}
}
// Write launch time
instance.meta.lastLaunched = System.currentTimeMillis() / 1000L;
instance.meta().lastLaunched = System.currentTimeMillis() / 1000L;
instance.writeMeta();
// Log command used to start
Utils.LOGGER.info(String.join(" ", args));
// Create process
ProcessBuilder pb = new ProcessBuilder(args.toArray(new String[0]));
pb.directory(instance.path.toFile());
pb.directory(instance.path().toFile());
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
AtomicReference<Process> proc = new AtomicReference<>();
Runnable starterRunner = () -> {
try {
proc.set(pb.start());
instance.runningLock = proc.get().pid();
instance.setRunningLock(proc.get().pid());
} catch (IOException e) {
Utils.LOGGER.error("Could not start " + launchType.name, e);
}
@ -157,7 +157,7 @@ public class InstanceLauncher {
new Thread(() -> {
while (true) {
starterRunner.run();
if (!proc.get().isAlive) {
if (!proc.get().isAlive()) {
Utils.LOGGER.error("Could not create server process");
instance.isRunningLocked();
return;
@ -181,13 +181,13 @@ public class InstanceLauncher {
}
instance.isRunningLocked();
});
th.isDaemon = true;
th.setDaemon(true);
th.start();
}
}
private static String resolveMainClass(Instance instance, VersionInfo versionInfo, Path gameJar, LaunchType launchType) throws LaunchException {
if (launchType == LaunchType.Client || instance.isFabric) return versionInfo.mainClass;
if (launchType == LaunchType.Client || instance.isFabric()) return versionInfo.mainClass;
// Identify main class using MANIFEST.MF
final String linePrefix = "Main-Class: ";
try (FileSystem fs = Utils.openZipFile(gameJar, false)) {
@ -203,7 +203,7 @@ public class InstanceLauncher {
}
private static VersionsListInfo getVersion(String minecraftVersion) throws LaunchException {
for (VersionsListInfo version : McApi.getVersions().versions) {
for (VersionsListInfo version : McApi.getVersions().versions()) {
if (version.id.equals(minecraftVersion))
return version;
}
@ -223,19 +223,19 @@ public class InstanceLauncher {
private static String expandArg(String arg, VersionInfo info, Instance instance, String classPath, AuthInfo authInfo) {
return arg
// game args
.replace("${auth_player_name}", authInfo.name)
.replace("${auth_player_name}", authInfo.name())
.replace("${version_name}", "Inceptum")
.replace("${game_directory}", instance.path.toString())
.replace("${game_directory}", instance.path().toString())
.replace("${assets_root}", MetaHolder.ASSETS_DIR.toString())
.replace("${assets_index_name}", info.assets)
.replace("${auth_uuid}", authInfo.uuid)
.replace("${auth_access_token}", authInfo.accessToken)
.replace("${user_type}", authInfo.userType)
.replace("${auth_uuid}", authInfo.uuid())
.replace("${auth_access_token}", authInfo.accessToken())
.replace("${user_type}", authInfo.userType())
.replace("${version_type}", info.type)
.replace("${resolution_width}", "1920") //TODO has_custom_resolution
.replace("${resolution_height}", "1080") //TODO has_custom_resolution
// jvm args
.replace("${natives_directory}", MetaHolder.NATIVES_DIR.resolve(instance.gameVersion).toString())
.replace("${natives_directory}", MetaHolder.NATIVES_DIR.resolve(instance.getGameVersion()).toString())
.replace("${launcher_name}", "Inceptum")
.replace("${launcher_version}", BuildMetadata.VERSION)
.replace("${classpath}", classPath)

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.inceptum.launcher.system.mds;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson.GC_FabricModJson;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.GC_FabricModJson;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
import io.gitlab.jfronny.gson.JsonParseException;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
@ -44,20 +44,20 @@ public record FileScanTask(ProtoInstance instance, Path file, BiConsumer<Path, M
modified = true;
}
ModSource selectedSource = null;
for (ModSource source : meta.sources.keySet()) {
for (ModSource source : meta.sources().keySet()) {
source.getUpdate(gameVersion);
if (!Files.exists(source.jarPath)) source.download();
if (!Files.exists(source.getJarPath())) source.download();
selectedSource = source;
}
if (selectedSource != null) {
if (Files.exists(jarPath)) {
Files.delete(jarPath);
Path newImod = imodPath.parent.resolve(selectedSource.shortName + ModPath.EXT_IMOD);
Path newImod = imodPath.getParent().resolve(selectedSource.getShortName() + ModPath.EXT_IMOD);
Files.move(imodPath, newImod);
imodPath = newImod;
modified = true;
}
jarPath = selectedSource.jarPath;
jarPath = selectedSource.getJarPath();
managed = true;
} else if (!Files.exists(jarPath)) throw new IOException("Mod has no jar and no sources");
if (modified) meta = GC_ModMeta.read(imodPath);

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.mds;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
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.*;
@ -33,16 +33,16 @@ public class MdsMod extends Mod {
@Override
public String getName() {
String fileName = imodPath.fileName.toString();
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;
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");
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"};
}
@ -66,45 +66,45 @@ public class MdsMod extends Mod {
Files.delete(imodPath);
if (!managedJar) Files.delete(jarPath);
if (meta != null) {
for (Mod dependency : dependencies) dependency.removeDependent(this);
for (Mod dependent : dependents) dependent.removeDependency(this);
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);
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[instance.modsDir.resolve(dependency)].removeDependent(this);
for (String dependency : meta.dependencies()) {
if (!download.meta().dependencies().contains(dependency)) {
instance.mds().get(instance.modsDir().resolve(dependency)).removeDependent(this);
}
}
instance.mds.invalidate(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)
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)
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[instance.modsDir.resolve(s)]))
meta.dependencies().remove(meta.dependencies().stream()
.filter(s -> dependency.equals(instance.mds().get(instance.modsDir().resolve(s))))
.findFirst()
.orElseThrow(FileNotFoundException::new));
write();
@ -112,12 +112,12 @@ public class MdsMod extends Mod {
@Override
public void removeDependent(Mod dependent) throws IOException {
meta.dependents.remove(meta.dependents.stream()
.filter(s -> dependent.equals(instance.mds[instance.modsDir.resolve(s)]))
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();
if (!meta.explicit() && meta.dependents().isEmpty()) delete();
}
@Override

View File

@ -19,7 +19,7 @@ import static java.nio.file.StandardWatchEventKinds.*;
class ModsDirScannerImpl implements ModsDirScanner {
private static final Map<Path, ModsDirScannerImpl> SCANNERS = new HashMap<>();
private static final ExecutorService POOL = Executors.newFixedThreadPool(Runtime.runtime.availableProcessors(), new NamedThreadFactory("mds"));
private static final ExecutorService POOL = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new NamedThreadFactory("mds"));
private final Map<Path, Mod> descriptions = new HashMap<>();
private final Set<Path> scannedPaths = new HashSet<>();
private final Thread th;
@ -29,27 +29,27 @@ class ModsDirScannerImpl implements ModsDirScanner {
private ModsDirScannerImpl(Path modsDir, InstanceMeta instance) throws IOException {
this.instance = new ProtoInstance(modsDir, this, instance);
this.th = new Thread(this::scanTaskInternal, "mds-" + modsDir.parent.fileName);
this.th = new Thread(this::scanTaskInternal, "mds-" + modsDir.getParent().getFileName());
this.service = FileSystems.getDefault().newWatchService();
modsDir.register(service, ENTRY_MODIFY, ENTRY_CREATE, ENTRY_DELETE);
}
protected static ModsDirScannerImpl get(Path modsDir, InstanceMeta instance) throws IOException {
if (SCANNERS.containsKey(modsDir)) {
ModsDirScannerImpl mds = SCANNERS[modsDir];
if (mds.instance.meta.equals(instance)) return mds;
ModsDirScannerImpl mds = SCANNERS.get(modsDir);
if (mds.instance.meta().equals(instance)) return mds;
mds.close();
}
ModsDirScannerImpl mds = new ModsDirScannerImpl(modsDir, instance);
SCANNERS[modsDir] = mds;
SCANNERS.put(modsDir, mds);
return mds;
}
@Override
public boolean isComplete() {
if (!Files.isDirectory(instance.modsDir)) return true;
if (!Files.isDirectory(instance.modsDir())) return true;
try {
for (Path path : JFiles.list(instance.modsDir)) {
for (Path path : JFiles.list(instance.modsDir())) {
if (!descriptions.containsKey(path)) return false;
}
} catch (IOException e) {
@ -65,14 +65,14 @@ class ModsDirScannerImpl implements ModsDirScanner {
@Override
public String getGameVersion() {
return GameVersionParser.getGameVersion(instance.meta.gameVersion);
return GameVersionParser.getGameVersion(instance.meta().gameVersion);
}
@Override
public Set<Mod> getMods() throws IOException {
Set<Mod> mods = new TreeSet<>();
if (Files.isDirectory(instance.modsDir)) {
for (Path path : JFiles.list(instance.modsDir)) {
if (Files.isDirectory(instance.modsDir())) {
for (Path path : JFiles.list(instance.modsDir())) {
if (ModPath.isImod(path) && Files.exists(ModPath.trimImod(path)))
continue;
mods.add(get(path));
@ -85,7 +85,7 @@ class ModsDirScannerImpl implements ModsDirScanner {
public Mod get(Path path) {
if (!Files.isRegularFile(path)) return null;
if (!descriptions.containsKey(path)) return new NoopMod(path); // not yet scanned
return descriptions[path];
return descriptions.get(path);
}
@Override
@ -96,7 +96,7 @@ class ModsDirScannerImpl implements ModsDirScanner {
public boolean hasScanned(Path path) {
return scannedPaths.contains(path)
|| scannedPaths.contains(path.parent.resolve(path.fileName.toString() + ".imod"));
|| scannedPaths.contains(path.getParent().resolve(path.getFileName().toString() + ".imod"));
}
private void scanTaskInternal() {
@ -108,34 +108,34 @@ class ModsDirScannerImpl implements ModsDirScanner {
@Override
public void runOnce(BiConsumer<Path, Mod> discovered) {
try {
if (!Files.isDirectory(instance.modsDir)) {
if (!Files.isDirectory(instance.modsDir())) {
return;
}
Set<Future<?>> tasks = new HashSet<>();
discovered = discovered.andThen((path, iwModDescription) -> {
scannedPaths.add(path);
descriptions[path] = iwModDescription;
descriptions.put(path, iwModDescription);
});
Set<Path> toScan;
if (descriptions.isEmpty) {
toScan = Set.copyOf(JFiles.list(instance.modsDir));
if (descriptions.isEmpty()) {
toScan = Set.copyOf(JFiles.list(instance.modsDir()));
} else {
toScan = new HashSet<>();
WatchKey key = service.poll();
if (key != null) {
for (WatchEvent<?> event : key.pollEvents()) {
if (event.context() instanceof Path p) {
toScan.add(instance.modsDir.resolve(p));
toScan.add(instance.modsDir().resolve(p));
}
}
if (!key.reset()) Utils.LOGGER.warn("Could not reset config watch key");
}
JFiles.listTo(instance.modsDir, path -> {
JFiles.listTo(instance.modsDir(), path -> {
if (!descriptions.containsKey(path)) toScan.add(path);
});
}
for (Path p : toScan) {
tasks.add(POOL.submit(new FileScanTask(instance, p, discovered, gameVersion)));
tasks.add(POOL.submit(new FileScanTask(instance, p, discovered, getGameVersion())));
}
for (Future<?> task : tasks) {
try {
@ -164,6 +164,6 @@ class ModsDirScannerImpl implements ModsDirScanner {
public void close() throws IOException {
disposed = true;
service.close();
SCANNERS.remove(instance.modsDir);
SCANNERS.remove(instance.modsDir());
}
}

View File

@ -11,14 +11,14 @@ public class NamedThreadFactory implements ThreadFactory {
private final String namePrefix;
public NamedThreadFactory(String name) {
this.group = Thread.currentThread().threadGroup;
this.group = Thread.currentThread().getThreadGroup();
this.namePrefix = name + "-" + poolNumber.getAndIncrement() + "-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(this.group, r, this.namePrefix + this.threadNumber.getAndIncrement(), 0L);
if (t.isDaemon) t.isDaemon = false;
if (t.priority != 5) t.priority = 5;
if (t.isDaemon()) t.setDaemon(false);
if (t.getPriority() != 5) t.setPriority(5);
return t;
}
}

View File

@ -19,7 +19,7 @@ public class NoopMod extends Mod {
@Override
public String getName() {
return path.fileName.toString();
return path.getFileName().toString();
}
@Override

View File

@ -13,6 +13,6 @@ public record SetupStepInfo(VersionInfo version,
}
public boolean isCancelled() {
return currentState.isCancelled;
return currentState.isCancelled();
}
}

View File

@ -28,25 +28,25 @@ public class Steps {
}
public static void reDownload(Instance instance, ProcessState state) throws IOException {
if (instance.isLocked) return;
if (instance.isLocked()) return;
boolean found = false;
for (VersionsListInfo version : McApi.getVersions().versions) {
if (version.id.equals(instance.gameVersion)) {
for (VersionsListInfo version : McApi.getVersions().versions()) {
if (version.id.equals(instance.getGameVersion())) {
found = true;
VersionInfo vi = McApi.getVersionInfo(version);
if (instance.isFabric)
vi = FabricMetaApi.addFabric(vi, instance.loaderVersion, FabricMetaApi.FabricVersionInfoType.Both);
LoaderInfo li = instance.isFabric
? new LoaderInfo(LoaderInfo.Type.Fabric, instance.loaderVersion)
if (instance.isFabric())
vi = FabricMetaApi.addFabric(vi, instance.getLoaderVersion(), FabricMetaApi.FabricVersionInfoType.Both);
LoaderInfo li = instance.isFabric()
? new LoaderInfo(LoaderInfo.Type.Fabric, instance.getLoaderVersion())
: LoaderInfo.NONE;
SetupStepInfo info = new SetupStepInfo(vi, li, instance.name, state);
SetupStepInfo info = new SetupStepInfo(vi, li, instance.getName(), state);
for (Step step : Steps.STEPS) {
state.incrementStep(step.name);
state.incrementStep(step.getName());
step.execute(info);
if (state.isCancelled) return;
if (state.isCancelled()) return;
}
}
}
if (!found) throw new IOException("Could not identify minecraft version " + instance.gameVersion);
if (!found) throw new IOException("Could not identify minecraft version " + instance.getGameVersion());
}
}

View File

@ -14,14 +14,14 @@ public class DownloadAssetsStep implements Step {
public void execute(SetupStepInfo info) throws IOException {
Path o = MetaHolder.ASSETS_DIR.resolve("objects");
try {
for (var entry : McApi.getAssetIndex(info.version).objects) {
if (info.isCancelled) return;
Path fPath = o.resolve(entry.value.hash.substring(0, 2));
for (var entry : McApi.getAssetIndex(info.version()).objects().entrySet()) {
if (info.isCancelled()) return;
Path fPath = o.resolve(entry.getValue().hash().substring(0, 2));
if (!Files.exists(fPath)) Files.createDirectories(fPath);
fPath = fPath.resolve(entry.value.hash);
fPath = fPath.resolve(entry.getValue().hash());
if (Files.exists(fPath)) continue;
info.setState("Downloading asset: " + entry.key);
McApi.downloadAsset(entry.value, fPath);
info.setState("Downloading asset: " + entry.getKey());
McApi.downloadAsset(entry.getValue(), fPath);
}
} catch (Throwable e) {
throw new IOException("Could not download assets", e);

View File

@ -18,18 +18,18 @@ public class DownloadClientStep implements Step {
Path serverPath = MetaHolder.LIBRARIES_DIR.resolve("net/minecraft/server");
if (!Files.exists(clientPath)) Files.createDirectories(clientPath);
if (!Files.exists(serverPath)) Files.createDirectories(serverPath);
String minecraftVersion = GameVersionParser.getGameVersion(info.version.id);
String minecraftVersion = GameVersionParser.getGameVersion(info.version().id);
clientPath = clientPath.resolve(minecraftVersion + ".jar");
serverPath = serverPath.resolve(minecraftVersion + ".jar");
try {
if (!Files.exists(clientPath)) {
MojangFileDownload client = info.version.downloads.client;
MojangFileDownload client = info.version().downloads.client();
info.setState("Downloading Client");
Net.downloadFile(client.url, client.sha1, clientPath);
}
Utils.LOGGER.info(serverPath.toString());
if (!Files.exists(serverPath)) {
MojangFileDownload server = info.version.downloads.server;
MojangFileDownload server = info.version().downloads.server();
if (new ComparableVersion(minecraftVersion).compareTo("1.18") >= 0) {
info.setState("Downloading Bundler");
Path p = Files.createTempFile("bundler", ".jar");

View File

@ -16,23 +16,23 @@ import java.nio.file.Path;
public class DownloadJavaStep implements Step {
@Override
public void execute(SetupStepInfo info) throws IOException {
VersionInfo.JavaVersion ver = info.version.javaVersion;
Path jvmDir = MetaHolder.NATIVES_DIR.resolve(ver.component).resolve(Integer.toString(ver.majorVersion));
VersionInfo.JavaVersion ver = info.version().javaVersion;
Path jvmDir = MetaHolder.NATIVES_DIR.resolve(ver.component()).resolve(Integer.toString(ver.majorVersion()));
if (Files.exists(jvmDir)) return;
info.setState("Downloading JVM");
Files.createDirectories(jvmDir);
for (var entry : McApi.getJvm(ver.component, ver.majorVersion)) {
Path tPath = jvmDir.resolve(entry.key);
switch (entry.value.type) {
for (var entry : McApi.getJvm(ver.component(), ver.majorVersion()).entrySet()) {
Path tPath = jvmDir.resolve(entry.getKey());
switch (entry.getValue().type()) {
case "file" -> {
MojangFileDownload mf = entry.value.downloads.raw;
MojangFileDownload mf = entry.getValue().downloads().raw();
info.setState("jvm: Downloading " + tPath);
try {
Net.downloadFile(mf.url, mf.sha1, tPath);
} catch (URISyntaxException e) {
throw new IOException("Could not download jvm", e);
}
if (entry.value.executable) {
if (entry.getValue().executable()) {
if (!tPath.toFile().setExecutable(true)) info.setState("Could not set executable bit for " + tPath);
}
}

View File

@ -19,7 +19,7 @@ import java.nio.file.*;
public class DownloadLibrariesStep implements Step {
@Override
public void execute(SetupStepInfo info) throws IOException {
execute(info.version, info.currentState);
execute(info.version(), info.currentState());
}
@Override
@ -29,22 +29,22 @@ public class DownloadLibrariesStep implements Step {
public static void execute(VersionInfo version, ProcessState currentState) throws IOException {
for (ArtifactInfo artifact : VersionInfoLibraryResolver.getRelevant(version)) {
if (currentState.isCancelled) return;
Path path = MetaHolder.LIBRARIES_DIR.resolve(artifact.path);
if (currentState.isCancelled()) return;
Path path = MetaHolder.LIBRARIES_DIR.resolve(artifact.path());
if (!Files.exists(path)) {
currentState.updateStep("Downloading library: " + artifact.path);
if (!Files.exists(path.parent)) Files.createDirectories(path.parent);
if (!artifact.url.endsWith(".jar")) {
Utils.LOGGER.info("Not a valid URL for a jar: " + artifact.url);
currentState.updateStep("Downloading library: " + artifact.path());
if (!Files.exists(path.getParent())) Files.createDirectories(path.getParent());
if (!artifact.url().endsWith(".jar")) {
Utils.LOGGER.info("Not a valid URL for a jar: " + artifact.url());
continue;
}
try {
Net.downloadFile(artifact.url, artifact.sha1, path);
Net.downloadFile(artifact.url(), artifact.sha1(), path);
} catch (URISyntaxException e) {
throw new IOException("Could not download library", e);
}
}
if (artifact.isNative) {
if (artifact.isNative()) {
currentState.updateStep("Extracting natives");
try (FileSystem libFs = Utils.openZipFile(path, false)) {
JFiles.copyRecursive(libFs.getPath("."), MetaHolder.NATIVES_DIR.resolve(GameVersionParser.getGameVersion(version.id)));
@ -56,9 +56,9 @@ public class DownloadLibrariesStep implements Step {
}
ArtifactMeta artifact = getLaunchWrapperArtifact();
if (!Files.exists(artifact.localPath)) {
if (!Files.exists(artifact.getLocalPath())) {
try {
MavenApi.downloadLibrary(Updater.PROJECT_MAVEN, MavenApi.getMetadata(Updater.PROJECT_MAVEN, artifact.mavenNotation));
MavenApi.downloadLibrary(Updater.PROJECT_MAVEN, MavenApi.getMetadata(Updater.PROJECT_MAVEN, artifact.getMavenNotation()));
} catch (URISyntaxException | SAXException e) {
throw new IOException("Could not download launchwrapper", e);
}
@ -68,7 +68,7 @@ public class DownloadLibrariesStep implements Step {
public static ArtifactMeta getLaunchWrapperArtifact() throws FileNotFoundException {
String version = BuildMetadata.IS_PUBLIC ? BuildMetadata.VERSION : null;
try {
if (version == null) version = Updater.getUpdate(false, false).version;
if (version == null) version = Updater.getUpdate(false, false).version();
} catch (Updater.UpdateCheckException ignored) {
}
if (version == null) throw new FileNotFoundException("Could not find a valid launch wrapper version");

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.setup.steps;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.common.MetaHolder;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
@ -14,7 +14,7 @@ public class RunMdsStep implements Step {
@Override
public void execute(SetupStepInfo info) throws IOException {
info.setState("Running MDS");
Path instance = MetaHolder.INSTANCE_DIR.resolve(info.name);
Path instance = MetaHolder.INSTANCE_DIR.resolve(info.name());
ModsDirScanner.get(instance.resolve("mods"), GC_InstanceMeta.read(instance.resolve(Instance.CONFIG_NAME)))
.runOnce((path, iwModDescription) -> info.setState("Scanned " + path));
}

View File

@ -15,14 +15,14 @@ public class SetupDirsStep implements Step {
@Override
public void execute(SetupStepInfo info) throws IOException {
info.setState("Setting up instance dirs");
Path iDir = MetaHolder.INSTANCE_DIR.resolve(info.name);
Path iDir = MetaHolder.INSTANCE_DIR.resolve(info.name());
Instance.setSetupLock(iDir, true);
if (!Files.exists(iDir)) {
Files.createDirectories(iDir.resolve("resourcepacks"));
Files.createDirectories(iDir.resolve("saves"));
Files.createDirectories(iDir.resolve("screenshots"));
}
if (info.loader.type != LoaderInfo.Type.None) {
if (info.loader().type() != LoaderInfo.Type.None) {
if (!Files.exists(iDir.resolve("mods")))
Files.createDirectories(iDir.resolve("mods"));
if (!Files.exists(iDir.resolve("config")))
@ -32,7 +32,7 @@ public class SetupDirsStep implements Step {
if (!Files.exists(eulaTxt)) {
Files.writeString(eulaTxt, "eula=true");
}
Files.createDirectories(MetaHolder.NATIVES_DIR.resolve(GameVersionParser.getGameVersion(info.version.id)));
Files.createDirectories(MetaHolder.NATIVES_DIR.resolve(GameVersionParser.getGameVersion(info.version().id)));
}
@Override

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.setup.steps;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.common.MetaHolder;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
@ -15,11 +15,11 @@ public class WriteMetadataStep implements Step {
@Override
public void execute(SetupStepInfo info) throws IOException {
info.setState("Writing metadata");
Path instance = MetaHolder.INSTANCE_DIR.resolve(info.name);
Path instance = MetaHolder.INSTANCE_DIR.resolve(info.name());
Path metaPath = instance.resolve(Instance.CONFIG_NAME);
if (!Files.exists(metaPath)) {
InstanceMeta meta = new InstanceMeta();
meta.gameVersion = info.version.id;
meta.gameVersion = info.version().id;
GC_InstanceMeta.write(meta, metaPath);
}
Instance.setSetupLock(instance, false);

View File

@ -33,7 +33,7 @@ public final class CurseforgeModSource implements ModSource {
public CurseforgeModSource(String projectSlug, int fileId) throws IOException {
this.mod = CurseforgeApi.getMod(projectSlug);
this.projectId = mod.id;
this.projectId = mod.id();
this.fileId = fileId;
this.current = CurseforgeApi.getFile(projectId, fileId);
}
@ -42,7 +42,7 @@ public final class CurseforgeModSource implements ModSource {
public ModDownload download() throws IOException {
Path path = getJarPath();
try {
Net.downloadFile(current.downloadUrl, path);
Net.downloadFile(current.downloadUrl(), path);
} catch (URISyntaxException e) {
throw new IOException("Could not download file", e);
}
@ -54,11 +54,11 @@ public final class CurseforgeModSource implements ModSource {
public Set<ModSource> getDependencies(String gameVersion) throws IOException {
return DEPENDENCIES_CACHE.get(Tuple.of(projectId, fileId), () -> {
Set<ModSource> deps = new HashSet<>();
for (CurseforgeFile.Dependency dependency : current.dependencies) {
if (dependency.relationType == 3) { //TODO support other types (IDs are documented on field declaration)
for (CurseforgeMod.LatestFileIndex index : CurseforgeApi.getMod(dependency.modId).latestFilesIndexes) {
if (index.gameVersion.equals(gameVersion)) {
deps.add(new CurseforgeModSource(dependency.modId, index.fileId));
for (CurseforgeFile.Dependency dependency : current.dependencies()) {
if (dependency.relationType() == 3) { //TODO support other types (IDs are documented on field declaration)
for (CurseforgeMod.LatestFileIndex index : CurseforgeApi.getMod(dependency.modId()).latestFilesIndexes()) {
if (index.gameVersion().equals(gameVersion)) {
deps.add(new CurseforgeModSource(dependency.modId(), index.fileId()));
break;
}
}
@ -71,11 +71,11 @@ public final class CurseforgeModSource implements ModSource {
@Override
public Optional<ModSource> getUpdate(String gameVersion) throws IOException {
return UPDATE_CACHE.get(Tuple.of(projectId, fileId, gameVersion), () -> {
for (CurseforgeMod.LatestFileIndex file : mod.latestFilesIndexes) {
if (file.gameVersion.equals(gameVersion)) {
return file.fileId == fileId
for (CurseforgeMod.LatestFileIndex file : mod.latestFilesIndexes()) {
if (file.gameVersion().equals(gameVersion)) {
return file.fileId() == fileId
? Optional.empty()
: Optional.of(new CurseforgeModSource(projectId, file.fileId));
: Optional.of(new CurseforgeModSource(projectId, file.fileId()));
}
}
return Optional.empty();
@ -84,22 +84,22 @@ public final class CurseforgeModSource implements ModSource {
@Override
public String getVersion() {
return current.displayName;
return current.displayName();
}
@Override
public String getName() {
return "curseforge/" + shortName + '/' + current.id;
return "curseforge/" + getShortName() + '/' + current.id();
}
@Override
public String getShortName() {
return mod.slug == null ? Integer.toString(mod.id) : mod.slug;
return mod.slug() == null ? Integer.toString(mod.id()) : mod.slug();
}
@Override
public String getFileName() {
return current.fileName;
return current.fileName();
}
@Override

View File

@ -17,7 +17,7 @@ public record DirectModSource(String fileName, String url, Set<ModSource> depend
@Override
public ModDownload download() throws IOException {
Path p = jarPath;
Path p = getJarPath();
try {
Net.downloadFile(url, p); //TODO test
} catch (URISyntaxException e) {

View File

@ -29,6 +29,6 @@ public interface ModSource {
boolean equals(ModSource other);
default Path getJarPath() {
return MetaHolder.LIBRARIES_DIR.resolve("com").resolve(name).resolve(fileName);
return MetaHolder.LIBRARIES_DIR.resolve("com").resolve(getName()).resolve(getFileName());
}
}

View File

@ -25,29 +25,29 @@ public final class ModrinthModSource implements ModSource {
public ModrinthModSource(String versionId) throws IOException {
this.versionId = versionId;
this.current = ModrinthApi.getVersion(versionId);
this.mod = ModrinthApi.getMod(modId);
this.mod = ModrinthApi.getMod(getModId());
}
@Override
public ModDownload download() throws IOException {
ModrinthVersion.File file = current.files[0];
Path path = jarPath;
ModrinthVersion.File file = current.files().get(0);
Path path = getJarPath();
try {
Net.downloadFile(file.url, file.hashes.sha1, path);
Net.downloadFile(file.url(), file.hashes().sha1(), path);
} catch (URISyntaxException e) {
throw new IOException("Could not download file", e);
}
return new ModDownload(file.hashes.sha1, HashUtils.murmur2(Files.readAllBytes(path)), path);
return new ModDownload(file.hashes().sha1(), HashUtils.murmur2(Files.readAllBytes(path)), path);
}
@Override
public Set<ModSource> getDependencies(String gameVersion) throws IOException {
return DEPENDENCIES_CACHE.get(versionId, () -> {
Set<ModSource> deps = new HashSet<>();
for (ModrinthVersion.Dependency dependency : current.dependencies) {
for (ModrinthVersion.Dependency dependency : current.dependencies()) {
//TODO show optional dependencies
if (dependency.dependency_type == ModrinthVersion.Dependency.DependencyType.required)
deps.add(new ModrinthModSource(dependency.version_id));
if (dependency.dependency_type() == ModrinthVersion.Dependency.DependencyType.required)
deps.add(new ModrinthModSource(dependency.version_id()));
}
return Set.copyOf(deps);
});
@ -59,49 +59,49 @@ public final class ModrinthModSource implements ModSource {
ModrinthVersion stable = null;
ModrinthVersion beta = null;
ModrinthVersion latest = null;
for (ModrinthVersion version : ModrinthApi.getVersions(modId)) {
if (version.game_versions.contains(gameVersion) && version.loaders.contains("fabric")) {
for (ModrinthVersion version : ModrinthApi.getVersions(getModId())) {
if (version.game_versions().contains(gameVersion) && version.loaders().contains("fabric")) {
latest = version;
if (version.version_type == ModrinthVersion.VersionType.beta || version.version_type == ModrinthVersion.VersionType.release)
if (version.version_type() == ModrinthVersion.VersionType.beta || version.version_type() == ModrinthVersion.VersionType.release)
beta = version;
if (version.version_type == ModrinthVersion.VersionType.release)
if (version.version_type() == ModrinthVersion.VersionType.release)
stable = version;
}
}
ModrinthVersion next = switch (current.version_type) {
ModrinthVersion next = switch (current.version_type()) {
case alpha -> latest;
case beta -> beta;
case release -> stable;
};
if (next == null) return Optional.empty();
if (next.version_number.equals(current.version_number)) return Optional.empty();
return Optional.of(new ModrinthModSource(next.id));
if (next.version_number().equals(current.version_number())) return Optional.empty();
return Optional.of(new ModrinthModSource(next.id()));
});
}
@Override
public String getVersion() {
return current.version_number;
return current.version_number();
}
@Override
public String getName() {
return "modrinth/" + shortName + '/' + current.version_number;
return "modrinth/" + getShortName() + '/' + current.version_number();
}
@Override
public String getShortName() {
return (mod.slug == null ? mod.id : mod.slug);
return (mod.slug() == null ? mod.id() : mod.slug());
}
@Override
public String getFileName() {
return current.files[0].filename;
return current.files().get(0).filename();
}
@Override
public boolean equals(ModSource other) {
return other instanceof ModrinthModSource ms && ms.modId.equals(modId) && ms.versionId.equals(versionId);
return other instanceof ModrinthModSource ms && ms.getModId().equals(getModId()) && ms.versionId.equals(versionId);
}
public String getVersionId() {
@ -109,20 +109,20 @@ public final class ModrinthModSource implements ModSource {
}
public String getModId() {
return current.project_id;
return current.project_id();
}
public ModrinthModpackManifest.File toManifest() throws IOException {
ModrinthVersion.File orig = current.files[0];
ModrinthVersion.File orig = current.files().get(0);
return new ModrinthModpackManifest.File(
"mods/" + orig.filename,
"mods/" + orig.filename(),
new ModrinthHashes(
orig.hashes.sha1,
orig.hashes.sha512
orig.hashes().sha1(),
orig.hashes().sha512()
),
null, // env
List.of(orig.url),
Files.size(jarPath)
List.of(orig.url()),
Files.size(getJarPath())
);
}
}

View File

@ -25,7 +25,7 @@ public class ProcessUtils {
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);
try (InputStreamReader isReader = new InputStreamReader(pr.inputStream);
try (InputStreamReader isReader = new InputStreamReader(pr.getInputStream());
BufferedReader bReader = new BufferedReader(isReader)) {
String strLine;
while ((strLine = bReader.readLine()) != null) {

View File

@ -12,15 +12,15 @@ public class VersionInfoLibraryResolver {
public static Set<ArtifactInfo> getRelevant(VersionInfo version) {
Set<ArtifactInfo> artifacts = new LinkedHashSet<>();
for (VersionInfo.Library library : version.libraries) {
if (library.rules != null && !library.rules.allow) continue;
if (library.downloads.classifiers != null && library.natives != null && library.natives.containsKey(OSUtils.TYPE.mojName)) {
artifacts.add(new ArtifactInfo(library.downloads.classifiers[library.natives[OSUtils.TYPE.mojName]], true));
if (library.rules() != null && !library.rules().allow()) continue;
if (library.downloads().classifiers() != null && library.natives() != null && library.natives().containsKey(OSUtils.TYPE.getMojName())) {
artifacts.add(new ArtifactInfo(library.downloads().classifiers().get(library.natives().get(OSUtils.TYPE.getMojName())), true));
}
if (library.downloads.artifact == null) {
Utils.LOGGER.info("Null library artifact @ " + library.name);
if (library.downloads().artifact() == null) {
Utils.LOGGER.info("Null library artifact @ " + library.name());
continue;
}
artifacts.add(new ArtifactInfo(library.downloads.artifact, false));
artifacts.add(new ArtifactInfo(library.downloads().artifact(), false));
}
return artifacts;
}

View File

@ -0,0 +1,32 @@
module io.gitlab.jfronny.inceptum.launcher {
exports io.gitlab.jfronny.inceptum.launcher;
exports io.gitlab.jfronny.inceptum.launcher.api;
exports io.gitlab.jfronny.inceptum.launcher.api.account;
exports io.gitlab.jfronny.inceptum.launcher.gson;
exports io.gitlab.jfronny.inceptum.launcher.model.curseforge;
exports io.gitlab.jfronny.inceptum.launcher.model.curseforge.response;
exports io.gitlab.jfronny.inceptum.launcher.model.fabric;
exports io.gitlab.jfronny.inceptum.launcher.model.inceptum;
exports io.gitlab.jfronny.inceptum.launcher.model.microsoft;
exports io.gitlab.jfronny.inceptum.launcher.model.microsoft.request;
exports io.gitlab.jfronny.inceptum.launcher.model.microsoft.response;
exports io.gitlab.jfronny.inceptum.launcher.model.modrinth;
exports io.gitlab.jfronny.inceptum.launcher.model.mojang;
exports io.gitlab.jfronny.inceptum.launcher.model.multimc;
exports io.gitlab.jfronny.inceptum.launcher.system.exporter;
exports io.gitlab.jfronny.inceptum.launcher.system.importer;
exports io.gitlab.jfronny.inceptum.launcher.system.instance;
exports io.gitlab.jfronny.inceptum.launcher.system.launch;
exports io.gitlab.jfronny.inceptum.launcher.system.mds;
exports io.gitlab.jfronny.inceptum.launcher.system.mds.noop;
exports io.gitlab.jfronny.inceptum.launcher.system.setup;
exports io.gitlab.jfronny.inceptum.launcher.system.setup.steps;
exports io.gitlab.jfronny.inceptum.launcher.system.source;
exports io.gitlab.jfronny.inceptum.launcher.util;
exports io.gitlab.jfronny.inceptum.launcher.util.gitignore;
requires transitive io.gitlab.jfronny.inceptum.common;
requires io.gitlab.jfronny.commons.jlhttp;
requires static org.jetbrains.annotations;
requires static io.gitlab.jfronny.gson.compile.annotations;
}

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.inceptum.wrapper;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.common.model.inceptum.WrapperConfig.GC_WrapperConfig;
import io.gitlab.jfronny.inceptum.common.model.inceptum.GC_WrapperConfig;
import io.gitlab.jfronny.commons.ref.R;
import io.gitlab.jfronny.inceptum.common.*;
import io.gitlab.jfronny.inceptum.common.model.inceptum.UpdateChannel;