From 18810b255b65cc2820b2ca36a2a0198718a7411e Mon Sep 17 00:00:00 2001 From: JFronny Date: Fri, 18 Nov 2022 21:58:40 +0100 Subject: [PATCH] Refactor to use manifold and records for models --- build.gradle.kts | 4 +- .../main/kotlin/inceptum.manifold.gradle.kts | 22 ++ common/build.gradle.kts | 2 + .../lang/Iterable/StructuralIterable.java | 9 + .../java/extensions/java/util/Map/MapExt.java | 19 ++ .../util/stream/BaseStream/BaseStreamExt.java | 7 + .../java/util/stream/Stream/StreamExt.java | 44 ++++ .../extensions/org/w3c/dom/Node/NodeExt.java | 14 ++ .../org/w3c/dom/NodeList/NodeListExt.java | 33 +++ .../jfronny/inceptum/common/GsonPreset.java | 34 +++ .../inceptum/common/InceptumConfig.java | 10 +- .../InceptumEnvironmentInitializer.java | 4 +- .../jfronny/inceptum/common/MetaHolder.java | 2 +- .../gitlab/jfronny/inceptum/common/Net.java | 10 +- .../jfronny/inceptum/common/ObjectCache.java | 6 +- .../inceptum/common/OutdatedException.java | 7 - .../io/gitlab/jfronny/inceptum/common/R.java | 3 + .../jfronny/inceptum/common/Updater.java | 38 ++-- .../gitlab/jfronny/inceptum/common/Utils.java | 17 +- .../jfronny/inceptum/common/api/MavenApi.java | 207 +++++++----------- .../common/model/inceptum/UpdateMetadata.java | 20 +- .../common/model/inceptum/WrapperConfig.java | 8 +- .../common/model/maven/ArtifactMeta.java | 21 +- .../common/model/maven/DependencyNode.java | 23 +- .../common/model/maven/MavenDependency.java | 6 +- .../inceptum/common/model/maven/Pom.java | 17 +- launcher-cli/build.gradle.kts | 1 + .../inceptum/cli/BaseInstanceCommand.java | 10 +- .../gitlab/jfronny/inceptum/cli/CliMain.java | 2 +- .../gitlab/jfronny/inceptum/cli/Command.java | 12 +- .../jfronny/inceptum/cli/CommandArgs.java | 4 +- .../jfronny/inceptum/cli/HelpBuilder.java | 8 +- .../inceptum/cli/commands/ExportCommand.java | 6 +- .../inceptum/cli/commands/HelpCommand.java | 8 +- .../inceptum/cli/commands/ImportCommand.java | 2 +- .../cli/commands/JvmStateCommand.java | 5 +- .../inceptum/cli/commands/LaunchCommand.java | 12 +- .../inceptum/cli/commands/ListCommand.java | 18 +- .../inceptum/cli/commands/ModCommand.java | 50 ++--- .../inceptum/gtk/window/AboutWindow.java | 2 +- launcher-imgui/build.gradle.kts | 1 + .../jfronny/inceptum/imgui/GuiMain.java | 20 +- .../imgui/control/InstanceManageControls.java | 28 +-- .../inceptum/imgui/control/InstanceView.java | 10 +- .../jfronny/inceptum/imgui/control/Tab.java | 4 +- .../inceptum/imgui/window/AddModWindow.java | 45 ++-- .../inceptum/imgui/window/GuiUtil.java | 2 +- .../inceptum/imgui/window/MainWindow.java | 6 +- .../imgui/window/NewInstanceWindow.java | 4 +- .../dialog/ProcessStateWatcherWindow.java | 4 +- .../imgui/window/edit/ArgumentsTab.java | 20 +- .../inceptum/imgui/window/edit/ExportTab.java | 12 +- .../imgui/window/edit/GeneralTab.java | 16 +- .../imgui/window/edit/InstanceEditWindow.java | 10 +- .../inceptum/imgui/window/edit/ModsTab.java | 66 +++--- launcher/build.gradle.kts | 1 + .../inceptum/launcher/api/CurseforgeApi.java | 2 +- .../inceptum/launcher/api/FabricMetaApi.java | 50 +++-- .../jfronny/inceptum/launcher/api/McApi.java | 2 +- .../launcher/api/account/AccountManager.java | 6 +- .../api/account/MicrosoftAccount.java | 48 ++-- .../api/account/MicrosoftAuthAPI.java | 3 +- .../api/account/MicrosoftAuthServer.java | 30 ++- .../api/account/request/LoginRequest.java | 7 - .../launcher/gson/MicrosoftAccountMeta.java | 9 +- .../launcher/gson/ModSourceAdapter.java | 16 +- .../inceptum/launcher/gson/RulesAdapter.java | 2 +- .../model/curseforge/CurseforgeFile.java | 142 ++++++------ .../model/curseforge/CurseforgeMod.java | 162 +++++++------- .../curseforge/CurseforgeModpackManifest.java | 41 ++-- .../response/FingerprintMatchesResponse.java | 30 +-- .../response/GetModFileResponse.java | 6 +- .../curseforge/response/GetModResponse.java | 6 +- .../curseforge/response/SearchResponse.java | 16 +- .../model/fabric/FabricLoaderVersion.java | 10 +- .../launcher/model/fabric/FabricModJson.java | 9 +- .../model/fabric/FabricVersionLoaderInfo.java | 33 +-- .../model/fabric/IntermediaryVersion.java | 8 +- .../launcher/model/inceptum/ArtifactInfo.java | 14 +- .../launcher/model/inceptum/InstanceMeta.java | 60 +++-- .../model/inceptum/ModMeta$Sources.java | 5 +- .../launcher/model/inceptum/ModMeta.java | 91 ++++---- .../model/microsoft/Entitlements.java | 14 +- .../model/microsoft/OauthTokenResponse.java | 48 ---- .../launcher/model/microsoft/Profile.java | 24 +- .../model/microsoft/request/LoginRequest.java | 8 + .../microsoft}/request/XblTokenRequest.java | 7 +- .../microsoft}/request/XstsTokenRequest.java | 7 +- .../{ => response}/LoginResponse.java | 6 +- .../response/OauthTokenResponse.java | 39 ++++ .../{ => response}/XboxLiveAuthResponse.java | 10 +- .../model/modrinth/ModrinthHashes.java | 7 +- .../modrinth/ModrinthModpackManifest.java | 50 ++--- .../model/modrinth/ModrinthProject.java | 80 +++---- .../model/modrinth/ModrinthSearchResult.java | 51 ++--- .../model/modrinth/ModrinthVersion.java | 53 ++--- .../launcher/model/mojang/AssetIndex.java | 13 +- .../launcher/model/mojang/JvmFileInfo.java | 21 +- .../launcher/model/mojang/JvmInfo.java | 33 +-- .../model/mojang/MinecraftArgument.java | 3 +- .../model/mojang/MojangFileDownload.java | 3 +- .../inceptum/launcher/model/mojang/Rules.java | 3 +- .../launcher/model/mojang/VersionInfo.java | 96 ++++---- .../launcher/model/mojang/VersionsList.java | 14 +- .../model/mojang/VersionsListInfo.java | 3 +- .../launcher/model/multimc/MMCPackMeta.java | 16 +- .../system/exporter/CleanupFileVisitor.java | 4 +- .../system/exporter/CurseForgeExporter.java | 41 ++-- .../launcher/system/exporter/Exporter.java | 21 +- .../system/exporter/ModrinthExporter.java | 32 +-- .../system/exporter/MultiMCExporter.java | 32 +-- .../system/importer/CurseForgeImporter.java | 32 +-- .../launcher/system/importer/Importer.java | 10 +- .../system/importer/ModrinthImporter.java | 36 +-- .../launcher/system/instance/Instance.java | 14 +- .../system/instance/InstanceList.java | 14 +- .../launcher/system/instance/Mod.java | 2 +- .../launcher/system/instance/ModManager.java | 16 +- .../launcher/system/instance/ModPath.java | 12 +- .../system/launch/InstanceLauncher.java | 54 ++--- .../launcher/system/mds/FileScanTask.java | 17 +- .../inceptum/launcher/system/mds/MdsMod.java | 18 +- .../system/mds/ModsDirScannerImpl.java | 21 +- .../system/mds/NamedThreadFactory.java | 13 +- .../launcher/system/mds/ProtoInstance.java | 17 +- .../launcher/system/mds/noop/NoopMod.java | 4 +- .../inceptum/launcher/system/setup/Steps.java | 16 +- .../setup/steps/DownloadAssetsStep.java | 10 +- .../setup/steps/DownloadClientStep.java | 6 +- .../system/setup/steps/DownloadJavaStep.java | 15 +- .../setup/steps/DownloadLibrariesStep.java | 14 +- .../system/setup/steps/RunMdsStep.java | 2 +- .../system/setup/steps/SetupDirsStep.java | 6 +- .../system/setup/steps/WriteMetadataStep.java | 7 +- .../system/source/CurseforgeModSource.java | 10 +- .../system/source/DirectModSource.java | 2 +- .../launcher/system/source/ModSource.java | 5 +- .../system/source/ModrinthModSource.java | 34 +-- .../inceptum/launcher/util/ProcessUtils.java | 13 +- .../util/VersionInfoLibraryResolver.java | 6 +- 140 files changed, 1430 insertions(+), 1519 deletions(-) create mode 100644 buildSrc/src/main/kotlin/inceptum.manifold.gradle.kts create mode 100644 common/src/main/java/extensions/java/lang/Iterable/StructuralIterable.java create mode 100644 common/src/main/java/extensions/java/util/Map/MapExt.java create mode 100644 common/src/main/java/extensions/java/util/stream/BaseStream/BaseStreamExt.java create mode 100644 common/src/main/java/extensions/java/util/stream/Stream/StreamExt.java create mode 100644 common/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java create mode 100644 common/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java create mode 100644 common/src/main/java/io/gitlab/jfronny/inceptum/common/GsonPreset.java delete mode 100644 common/src/main/java/io/gitlab/jfronny/inceptum/common/OutdatedException.java delete mode 100644 launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/LoginRequest.java delete mode 100644 launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/OauthTokenResponse.java create mode 100644 launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/LoginRequest.java rename launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/{api/account => model/microsoft}/request/XblTokenRequest.java (73%) rename launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/{api/account => model/microsoft}/request/XstsTokenRequest.java (70%) rename launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/{ => response}/LoginResponse.java (70%) create mode 100644 launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/OauthTokenResponse.java rename launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/{ => response}/XboxLiveAuthResponse.java (68%) diff --git a/build.gradle.kts b/build.gradle.kts index 1754c46..2ea5536 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,8 +12,10 @@ allprojects { val lwjglVersion by extra("3.3.1") val imguiVersion by extra("1.86.4") val jfCommonsVersion by extra("1.0-SNAPSHOT") -val gsonCompileVersion by extra("1.0-SNAPSHOT") +val gsonCompileVersion by extra("1.1-SNAPSHOT") +val manifoldVersion by extra("2022.1.25") val jlhttpVersion by extra("2.6") + val flavorProp: String by extra(prop("flavor", "custom")) if (!setOf("custom", "maven", "fat", "windows", "linux", "macos").contains(flavorProp)) throw IllegalStateException("Unsupported flavor: $flavorProp") val flavor: String by extra(if (flavorProp != "custom") flavorProp else OS.TYPE.codename) diff --git a/buildSrc/src/main/kotlin/inceptum.manifold.gradle.kts b/buildSrc/src/main/kotlin/inceptum.manifold.gradle.kts new file mode 100644 index 0000000..b651185 --- /dev/null +++ b/buildSrc/src/main/kotlin/inceptum.manifold.gradle.kts @@ -0,0 +1,22 @@ +plugins { + id("inceptum.java-conventions") +} + +dependencies { + val manifoldVersion: String by rootProject.extra + + implementation("systems.manifold:manifold-props-rt:$manifoldVersion") + + testAnnotationProcessor(annotationProcessor("systems.manifold:manifold-ext:$manifoldVersion")!!) + testAnnotationProcessor(annotationProcessor("systems.manifold:manifold-props:$manifoldVersion")!!) +} + +if (sourceSets.main.get().allJava.files.any {it.name == "module-info.java"}) { + tasks.withType { + options.compilerArgs.addAll(arrayOf("-Xplugin:Manifold no-bootstrap", "--module-path", classpath.asPath)) + } +} else { + tasks.withType { + options.compilerArgs.addAll(arrayOf("-Xplugin:Manifold no-bootstrap")) + } +} \ No newline at end of file diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 003bb6e..601468a 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("inceptum.library-conventions") id("jf.codegen") id("inceptum.gson-compile") + id("inceptum.manifold") } dependencies { @@ -18,6 +19,7 @@ sourceSets { main { generate(project) { `class`("io.gitlab.jfronny.inceptum.common", "BuildMetadata") { + modifiers(Modifier.PUBLIC) val modifiers = arrayOf(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) field("VERSION", versionS, *modifiers) diff --git a/common/src/main/java/extensions/java/lang/Iterable/StructuralIterable.java b/common/src/main/java/extensions/java/lang/Iterable/StructuralIterable.java new file mode 100644 index 0000000..5e3d1ef --- /dev/null +++ b/common/src/main/java/extensions/java/lang/Iterable/StructuralIterable.java @@ -0,0 +1,9 @@ +package extensions.java.lang.Iterable; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.Structural; + +@Extension +@Structural +public class StructuralIterable { +} diff --git a/common/src/main/java/extensions/java/util/Map/MapExt.java b/common/src/main/java/extensions/java/util/Map/MapExt.java new file mode 100644 index 0000000..b869483 --- /dev/null +++ b/common/src/main/java/extensions/java/util/Map/MapExt.java @@ -0,0 +1,19 @@ +package extensions.java.util.Map; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; + +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +@Extension +public abstract class MapExt implements Iterable> { + public static Iterator> iterator(@This Map thiz) { + return thiz.entrySet().iterator(); + } + + public static V set(@This Map thiz, K key, V value) { + return thiz.put(key, value); + } +} diff --git a/common/src/main/java/extensions/java/util/stream/BaseStream/BaseStreamExt.java b/common/src/main/java/extensions/java/util/stream/BaseStream/BaseStreamExt.java new file mode 100644 index 0000000..cd2739d --- /dev/null +++ b/common/src/main/java/extensions/java/util/stream/BaseStream/BaseStreamExt.java @@ -0,0 +1,7 @@ +package extensions.java.util.stream.BaseStream; + +import manifold.ext.rt.api.Extension; + +@Extension +public abstract class BaseStreamExt implements Iterable { +} diff --git a/common/src/main/java/extensions/java/util/stream/Stream/StreamExt.java b/common/src/main/java/extensions/java/util/stream/Stream/StreamExt.java new file mode 100644 index 0000000..5d928e6 --- /dev/null +++ b/common/src/main/java/extensions/java/util/stream/Stream/StreamExt.java @@ -0,0 +1,44 @@ +package extensions.java.util.stream.Stream; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Extension +public abstract class StreamExt { + public static Set toSet(@This Stream thiz) { + return thiz.collect(LinkedHashSet::new, Set::add, Set::addAll); + } + + public static Map toMap(@This Stream thiz, Function keyMapper, Function valueMapper) { + return thiz.collect(Collectors.toMap(keyMapper, valueMapper)); + } + + public static Map toMap(@This Stream thiz, Function keyMapper) { + return thiz.toMap(keyMapper, Function.identity()); + } + + public static Map> groupingBy(@This Stream thiz, Function valueMapper) { + return thiz.collect(Collectors.groupingBy(valueMapper)); + } + + public static String join(@This Stream thiz) { + return thiz.collect(Collectors.joining()); + } + + public static String join(@This Stream thiz, String delimiter) { + return thiz.collect(Collectors.joining(delimiter)); + } + + public static String join(@This Stream thiz, char delimiter) { + return thiz.join("" + delimiter); + } + + public static Stream concat(@This Stream thiz, Stream other) { + return Stream.concat(thiz, other); + } +} diff --git a/common/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java b/common/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java new file mode 100644 index 0000000..45ad5fc --- /dev/null +++ b/common/src/main/java/extensions/org/w3c/dom/Node/NodeExt.java @@ -0,0 +1,14 @@ +package extensions.org.w3c.dom.Node; + +import manifold.ext.rt.api.Extension; +import manifold.ext.rt.api.This; +import org.w3c.dom.Node; + +@Extension +public class NodeExt { + public static boolean isWhitespace(@This Node thiz) { + if (thiz.nodeType == Node.TEXT_NODE && thiz.textContent.isBlank()) return true; + if (thiz.nodeType == Node.COMMENT_NODE) return true; + return false; + } +} diff --git a/common/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java b/common/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java new file mode 100644 index 0000000..0490bb0 --- /dev/null +++ b/common/src/main/java/extensions/org/w3c/dom/NodeList/NodeListExt.java @@ -0,0 +1,33 @@ +package extensions.org.w3c.dom.NodeList; + +import manifold.ext.rt.api.*; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.*; + +@Extension +public abstract class NodeListExt implements Iterable { + public static Iterator iterator(@This NodeList thiz) { + return new Iterator<>() { + private int index = 0; + @Override + public boolean hasNext() { + while (index < thiz.length && thiz[index].isWhitespace()) { + index++; + } + return index < thiz.length; + } + + @Override + public Node next() { + if (!hasNext()) throw new NoSuchElementException(); + return thiz[index++]; + } + }; + } + + public static Node get(@This NodeList thiz, int index) { + return thiz.item(index); + } +} diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/GsonPreset.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/GsonPreset.java new file mode 100644 index 0000000..1560dbf --- /dev/null +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/GsonPreset.java @@ -0,0 +1,34 @@ +package io.gitlab.jfronny.inceptum.common; + +import io.gitlab.jfronny.gson.stream.JsonReader; +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; + } + + public static void configure(JsonWriter writer) { + writer.serializeNulls = true; + writer.isSerializeSpecialFloatingPointValues = true; + writer.isLenient = true; + writer.indent = " "; + writer.omitQuotes = true; + } + } + + public static class Api { + public static void configure(JsonReader reader) { + reader.isSerializeSpecialFloatingPointValues = true; + reader.isLenient = true; + } + + public static void configure(JsonWriter writer) { + writer.serializeNulls = false; + writer.isSerializeSpecialFloatingPointValues = true; + writer.isLenient = false; + } + } +} diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumConfig.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumConfig.java index 1c67c31..53b704c 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumConfig.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumConfig.java @@ -18,8 +18,8 @@ public class InceptumConfig { public static String authorName = "Inceptum"; public static void load() throws IOException { - if (!Files.exists(MetaHolder.CONFIG_PATH.getParent())) - Files.createDirectories(MetaHolder.CONFIG_PATH.getParent()); + if (!Files.exists(MetaHolder.CONFIG_PATH.parent)) + Files.createDirectories(MetaHolder.CONFIG_PATH.parent); if (!Files.exists(MetaHolder.CONFIG_PATH)) { Path gLaunch2 = MetaHolder.BASE_PATH.resolve("glaunch2.json"); Path json = MetaHolder.BASE_PATH.resolve("inceptum.json"); @@ -32,7 +32,7 @@ public class InceptumConfig { } } try (JsonReader jr = new JsonReader(Files.newBufferedReader(MetaHolder.CONFIG_PATH))) { - jr.setLenient(true); + GsonPreset.Config.configure(jr); jr.beginObject(); while (jr.peek() != JsonToken.END_OBJECT) { String name = null; @@ -70,9 +70,7 @@ public class InceptumConfig { public static void saveConfig() { try (JsonWriter jw = new JsonWriter(Files.newBufferedWriter(MetaHolder.CONFIG_PATH))) { - jw.setLenient(true); - jw.setOmitQuotes(true); - jw.setIndent(" "); + GsonPreset.Config.configure(jw); jw.beginObject() .comment("Whether to show snapshots in the version selector for new instances") .name("snapshots").value(snapshots) diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumEnvironmentInitializer.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumEnvironmentInitializer.java index 947e7dd..56dc196 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumEnvironmentInitializer.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/InceptumEnvironmentInitializer.java @@ -9,11 +9,11 @@ import java.io.IOException; public class InceptumEnvironmentInitializer { public static void initialize() throws IOException { Logger.registerFactory(InceptumEnvironmentInitializer::defaultFactory); - HttpUtils.setUserAgent("jfmods/inceptum/" + BuildMetadata.VERSION); + HttpUtils.userAgent = "jfmods/inceptum/" + BuildMetadata.VERSION; InceptumConfig.load(); } public static Logger defaultFactory(String name) { - return new StdoutLogger(name, true, true, true); + return StdoutLogger.fancy(name); } } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/MetaHolder.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/MetaHolder.java index e252f51..ebe8f72 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/MetaHolder.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/MetaHolder.java @@ -17,7 +17,7 @@ public class MetaHolder { case WINDOWS -> getPath(System.getenv("APPDATA")); case MAC_OS -> getPath(System.getProperty("user.home")).resolve("Library").resolve("Application Support"); case LINUX -> { - String s = System.getenv().get("XDG_CONFIG_HOME"); + String s = System.getenv("XDG_CONFIG_HOME"); if (s == null) yield getPath(System.getProperty("user.home")).resolve(".config"); else diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/Net.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/Net.java index d5e3272..fa566e3 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/Net.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/Net.java @@ -65,11 +65,11 @@ public class Net { if (url.startsWith("/")) res.append(url); else res.append("/").append(url); int i = 0; - for (Map.Entry entry : params.entrySet()) { + for (Map.Entry entry : params) { res.append(i++ == 0 ? '?' : '&') - .append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)) + .append(URLEncoder.encode(entry.key, StandardCharsets.UTF_8)) .append('=') - .append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)); + .append(URLEncoder.encode(entry.value, 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.getParent())) Files.createDirectories(path.getParent()); + if (!Files.exists(path.parent)) Files.createDirectories(path.parent); Files.write(path, downloadData(url)); } public static void downloadFile(String url, String sha1, Path path) throws IOException, URISyntaxException { - if (!Files.exists(path.getParent())) Files.createDirectories(path.getParent()); + if (!Files.exists(path.parent)) Files.createDirectories(path.parent); Files.write(path, downloadData(url, sha1)); } } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/ObjectCache.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/ObjectCache.java index 0b647c5..3b1da9c 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/ObjectCache.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/ObjectCache.java @@ -30,10 +30,10 @@ public class ObjectCache { public T get(String key, ThrowingSupplier download, ThrowingFunction builder) throws IOException, TEx { if (!container.containsKey(key)) { Path cd = cacheDir.resolve(key); - if (Files.exists(cd)) container.put(key, builder.apply(Files.readString(cd))); - else container.put(key, builder.apply(download.get())); + if (Files.exists(cd)) container[key] = builder.apply(Files.readString(cd)); + else container[key] = builder.apply(download.get()); } //noinspection unchecked - return (T) container.get(key); + return (T) container[key]; } } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/OutdatedException.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/OutdatedException.java deleted file mode 100644 index 4243fd4..0000000 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/OutdatedException.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.gitlab.jfronny.inceptum.common; - -public class OutdatedException extends RuntimeException { - public OutdatedException(String message) { - super(message); - } -} diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/R.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/R.java index 465d1e4..4914b42 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/R.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/R.java @@ -5,11 +5,14 @@ package io.gitlab.jfronny.inceptum.common; */ public class R { public static void nop() { + // No-Op } public static void nop(Object a1) { + // No-Op } public static void nop(Object a1, Object a2) { + // No-Op } } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/Updater.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/Updater.java index 691f5b0..ec531c6 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/Updater.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/Updater.java @@ -14,7 +14,6 @@ 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 { @@ -33,35 +32,36 @@ public class Updater { public static void update(UpdateMetadata source, boolean relaunch) throws IOException, URISyntaxException { Utils.LOGGER.info("Downloading version " + source.version); - WrapperConfig config = new WrapperConfig(); - config.natives = new HashMap<>(); - config.libraries = new LinkedHashSet<>(); - config.repositories = new LinkedHashSet<>(source.repositories); - source.natives.forEach((k, v) -> config.natives.put(k, new LinkedHashSet<>(v))); + WrapperConfig config = new WrapperConfig( + new LinkedHashSet<>(), + new LinkedHashSet<>(source.repositories), + new HashMap<>() + ); + source.natives.forEach((k, v) -> config.natives[k] = new LinkedHashSet<>(v)); DependencyNode node = downloadLibrary(source.repositories, "io.gitlab.jfronny.inceptum:launcher-dist:" + source.version, config.libraries); Utils.LOGGER.info("Downloaded Dependencies:\n" + node); List currentLibraries = new LinkedList<>(config.libraries); - if (source.natives.containsKey(Utils.getCurrentFlavor())) { + if (source.natives.containsKey(Utils.currentFlavor)) { Set natives = new LinkedHashSet<>(); - for (String lib : source.natives.get(Utils.getCurrentFlavor())) { + for (String lib : source.natives[Utils.currentFlavor]) { downloadLibrary(source.repositories, lib, natives); } currentLibraries.addAll(natives); - config.natives.put(Utils.getCurrentFlavor(), natives); + config.natives[Utils.currentFlavor] = natives; } GC_WrapperConfig.write(MetaHolder.WRAPPER_CONFIG_PATH, config); if (relaunch) { - Runtime.getRuntime().addShutdownHook(new Thread(() -> { + Runtime.runtime.addShutdownHook(new Thread(() -> { try { - new ProcessBuilder(OSUtils.getJvmBinary(), + new ProcessBuilder(OSUtils.jvmBinary, "-cp", buildClasspath(currentLibraries.stream()) .map(Path::toString) - .collect(Collectors.joining("" + File.pathSeparatorChar)) + .join(File.pathSeparatorChar) ).inheritIO().start(); } catch (IOException e) { Utils.LOGGER.error("Could not relaunch", e); @@ -71,7 +71,7 @@ public class Updater { } public static List getLaunchClasspath(WrapperConfig wrapperConfig) throws IOException, URISyntaxException { - Set natives = wrapperConfig.natives.get(Utils.getCurrentFlavor()); + Set natives = wrapperConfig.natives[Utils.currentFlavor]; if (natives == null) natives = new LinkedHashSet<>(); Set libs = wrapperConfig.libraries; if (libs == null) libs = new LinkedHashSet<>(); @@ -79,14 +79,14 @@ public class Updater { boolean configChanged = false; for (String lib : libs) { - Path p = ArtifactMeta.parse(lib).getLocalPath(); + Path p = ArtifactMeta.parse(lib).localPath; if (!Files.exists(p)) { configChanged = true; downloadLibrary(wrapperConfig.repositories, lib, libs); } } for (String lib : natives) { - Path p = ArtifactMeta.parse(lib).getLocalPath(); + Path p = ArtifactMeta.parse(lib).localPath; if (!Files.exists(p)) { configChanged = true; downloadLibrary(wrapperConfig.repositories, lib, natives); @@ -95,7 +95,7 @@ public class Updater { if (configChanged) GC_WrapperConfig.write(MetaHolder.WRAPPER_CONFIG_PATH, wrapperConfig); - return buildClasspath(Stream.concat(libs.stream(), natives.stream())).toList(); + return buildClasspath(libs.stream().concat(natives.stream())).toList(); } private static Stream buildClasspath(Stream libraries) { @@ -104,7 +104,7 @@ public class Updater { private static DependencyNode downloadLibrary(Set repositories, final String artifact, Set libraries) throws IOException, URISyntaxException { List suppressed = new LinkedList<>(); - for (String repository : Stream.concat(Stream.of(PROJECT_MAVEN), repositories.stream()).toList()) { + for (String repository : Stream.of(PROJECT_MAVEN).concat(repositories.stream())) { ArtifactMeta meta; try { meta = MavenApi.getMetadata(repository, artifact); @@ -120,7 +120,7 @@ public class Updater { suppressed.add(notFound); continue; } catch (IOException | URISyntaxException | XMLStreamException | SAXException e) { - throw new IOException("Could not download artifact " + meta.getMavenNotation() + " from " + repository, e); + throw new IOException("Could not download artifact " + meta.mavenNotation + " from " + repository, e); } Set dependencies = new LinkedHashSet<>(); if (pom.dependencies != null) { @@ -175,7 +175,7 @@ public class Updater { return switch (channel) { case CI -> ARTIFACTS_URL; case Stable -> STABLE_URL; - } + "/Inceptum-" + Utils.getCurrentFlavor() + ".jar"; + } + "/Inceptum-" + Utils.currentFlavor + ".jar"; } public static class UpdateCheckException extends Exception { diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/Utils.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/Utils.java index 39488d0..c37192f 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/Utils.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/Utils.java @@ -17,6 +17,7 @@ import java.util.stream.Collectors; public class Utils { public static final int CACHE_SIZE = 128; + public static final Pattern NEW_LINE = Pattern.compile("[\r\n]+"); public static final Pattern VALID_FILENAME = Pattern.compile("[a-zA-Z0-9_\\-.][a-zA-Z0-9 _\\-.]*[a-zA-Z0-9_\\-.]"); public static final Logger LOGGER = Logger.forName("Inceptum"); private static ClassLoader SYSTEM_LOADER = ClassLoader.getSystemClassLoader(); @@ -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.getRuntime().exec(new String[]{"xdg-open", uri.toString()}); - } else if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { - Desktop.getDesktop().browse(uri); + Runtime.runtime.exec(new String[]{"xdg-open", uri.toString()}); + } else if (Desktop.isDesktopSupported && Desktop.desktop.isSupported(Desktop.Action.BROWSE)) { + Desktop.desktop.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.getRuntime().exec(new String[]{"xdg-open", file.getAbsoluteFile().toString()}); - } else if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { - Desktop.getDesktop().open(file); + Runtime.runtime.exec(new String[]{"xdg-open", file.absoluteFile.toString()}); + } else if (Desktop.isDesktopSupported && Desktop.desktop.isSupported(Desktop.Action.BROWSE)) { + Desktop.desktop.open(file); } } catch (Exception e) { Utils.LOGGER.error("Error opening web browser!", 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()) - .collect(Collectors.joining(separator)); + .filter(s -> !s.isEmpty) + .join(separator); } public static String getCurrentFlavor() { diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/api/MavenApi.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/api/MavenApi.java index b0a5e67..15ba1c7 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/api/MavenApi.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/api/MavenApi.java @@ -29,202 +29,147 @@ public class MavenApi { } public static Path downloadLibrary(String repo, ArtifactMeta meta) throws IOException, URISyntaxException { - Path res = meta.getLocalPath(); + Path res = meta.localPath; 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.getPomPath())).sendInputStream()) { + try (InputStream is = HttpUtils.get(Utils.join("/", repo, meta.pomPath)).sendInputStream()) { Document doc = FACTORY.parse(is); - doc.getDocumentElement().normalize(); - Pom result = new Pom(); - if (!"project".equals(doc.getDocumentElement().getNodeName())) throw new IOException("Illegal document name"); - boolean hasModelVersion = false; - boolean hasGroupId = false; - boolean hasArtifactId = false; - boolean hasVersion = false; - for (Node node : iterable(doc.getDocumentElement().getChildNodes())) { - switch (node.getNodeName()) { - case "modelVersion" -> { - hasModelVersion = true; - result.modelVersion = node.getTextContent(); - } + doc.documentElement.normalize(); + if (!"project".equals(doc.documentElement.nodeName)) throw new IOException("Illegal document name"); + String modelVersion = null; + String groupId = null; + String artifactId = null; + String version = null; + String packaging = null; + List dependencies = null; + String classifier = null; + for (Node node : doc.documentElement.childNodes) { + switch (node.nodeName) { + case "modelVersion" -> modelVersion = node.textContent; case "parent" -> { // Dirty hack to get slf4j working: simply assume the groupId and version of the parent is also the groupId of this - if (!hasGroupId) { - for (Node child : iterable(node.getChildNodes())) { - switch (child.getNodeName()) { + if (groupId == null) { + for (Node child : node.childNodes) { + switch (child.nodeName) { case "groupId" -> { - if (!hasGroupId) { - hasGroupId = true; - result.groupId = node.getTextContent(); + if (groupId == null) { + groupId = node.textContent; } } case "version" -> { - if (!hasVersion) { - hasVersion = true; - result.version = node.getTextContent(); + if (version == null) { + version = node.textContent; } } } } } } - case "groupId" -> { - hasGroupId = true; - result.groupId = node.getTextContent(); - } + case "groupId" -> groupId = node.textContent; case "artifactId" -> { - hasArtifactId = true; - result.artifactId = node.getTextContent(); + artifactId = node.textContent; } case "version" -> { - hasVersion = true; - result.version = node.getTextContent(); + version = node.textContent; } - case "packaging" -> result.packaging = node.getTextContent(); + case "packaging" -> packaging = node.textContent; case "dependencies" -> { - result.dependencies = new LinkedList<>(); - for (Node dep : iterable(node.getChildNodes())) { + dependencies = new LinkedList<>(); + for (Node dep : node.childNodes) { MavenDependency resolved = parseDependency(dep); if (resolved != null) { - result.dependencies.add(resolved); + dependencies.add(resolved); } } } - case "classifier" -> result.classifier = node.getTextContent(); + case "classifier" -> classifier = node.textContent; default -> {} } } - if (!hasModelVersion) throw new IOException("Pom lacks modelVersion"); - if (!hasGroupId) throw new IOException("Pom lacks groupId"); - if (!hasArtifactId) throw new IOException("Pom lacks artifactId"); - if (!hasVersion) throw new IOException("Pom lacks version"); - return result; + if (modelVersion == null) throw new IOException("Pom lacks modelVersion"); + 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 Pom(modelVersion, groupId, artifactId, version, classifier, null, packaging, dependencies); } } private static @Nullable MavenDependency parseDependency(Node doc) throws IOException { - MavenDependency result = new MavenDependency(); - boolean hasGroupId = false; - boolean hasArtifactId = false; - boolean hasVersion = false; - boolean hasScope = false; - for (Node node : iterable(doc.getChildNodes())) { - switch (node.getNodeName()) { - case "groupId" -> { - hasGroupId = true; - result.groupId = node.getTextContent(); - } - case "artifactId" -> { - hasArtifactId = true; - result.artifactId = node.getTextContent(); - } - case "version" -> { - hasVersion = true; - result.version = node.getTextContent(); - } + String groupId = null; + 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; case "scope" -> { - hasScope = true; - result.scope = node.getTextContent(); - if (!RUNTIME_SCOPES.contains(result.scope)) return null; + scope = node.textContent; + if (!RUNTIME_SCOPES.contains(scope)) return null; } case "optional" -> { - if (node.getTextContent().equals("true")) return null; + if (node.textContent.equals("true")) return null; } } } - if (!hasGroupId) throw new IOException("Pom lacks groupId"); - if (!hasArtifactId) throw new IOException("Pom lacks artifactId"); - if (!hasVersion) { - if (result.groupId.equals("org.lwjgl")) { + if (groupId == null) throw new IOException("Pom lacks groupId"); + if (artifactId == null) throw new IOException("Pom lacks artifactId"); + if (version == null) { + if (groupId.equals("org.lwjgl")) { // Lwjgl uses a shared bom for versions which I don't want to support // The required modules are explicit dependencies of launcher-imgui anyway return null; } - throw new IOException("Dependency " + result.groupId + ":" + result.artifactId + " lacks version"); + throw new IOException("Dependency " + groupId + ":" + artifactId + " lacks version"); } - if (!hasScope) throw new IOException("Pom lacks scope"); - return result; + if (scope == null) throw new IOException("Pom lacks scope"); + return new MavenDependency(groupId, artifactId, version, scope); } 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.getMetadataPath())).sendInputStream()) { + try (InputStream is = HttpUtils.get(Utils.join("/", repo, sourceMeta.metadataPath)).sendInputStream()) { Document doc = FACTORY.parse(is); - doc.getDocumentElement().normalize(); - ArtifactMeta result = new ArtifactMeta(); - if (!"metadata".equals(doc.getDocumentElement().getNodeName())) throw new IOException("Illegal document name"); - boolean hasGroupId = false; - boolean hasArtifactId = false; - boolean hasVersion = false; - for (Node node : iterable(doc.getDocumentElement().getChildNodes())) { - switch (node.getNodeName()) { - case "groupId" -> { - hasGroupId = true; - result.groupId = node.getTextContent(); - } - case "artifactId" -> { - hasArtifactId = true; - result.artifactId = node.getTextContent(); - } - case "version" -> { - hasVersion = true; - result.version = node.getTextContent(); - } + doc.documentElement.normalize(); + if (!"metadata".equals(doc.documentElement.nodeName)) 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; case "versioning" -> { - for (Node node1 : iterable(node.getChildNodes())) { - if (node1.getNodeName().equals("snapshot")) { + for (Node node1 : node.childNodes) { + if (node1.nodeName.equals("snapshot")) { String timestamp = null; String buildNumber = null; - for (Node node2 : iterable(node1.getChildNodes())) { - switch (node2.getNodeName()) { - case "timestamp" -> timestamp = node2.getTextContent(); - case "buildNumber" -> buildNumber = node2.getTextContent(); + for (Node node2 : node1.childNodes) { + switch (node2.nodeName) { + case "timestamp" -> timestamp = node2.textContent; + case "buildNumber" -> buildNumber = node2.textContent; default -> {} } } if (timestamp == null) throw new IOException("Pom snapshots lack timestamp"); if (buildNumber == null) throw new IOException("Pom snapshots lack buildNumber"); - result.snapshotVersion = timestamp + '-' + buildNumber; + snapshotVersion = timestamp + '-' + buildNumber; } } } default -> {} } } - if (!hasGroupId) throw new IOException("Pom lacks groupId"); - if (!hasArtifactId) throw new IOException("Pom lacks artifactId"); - if (!hasVersion) throw new IOException("Pom lacks version"); - result.classifier = sourceMeta.classifier; - return result; + 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); } } - - private static Iterable iterable(NodeList list) { - return () -> new Iterator<>() { - int index = 0; - - @Override - public boolean hasNext() { - while (index < list.getLength() && isWhitespace(list.item(index))) { - index++; - } - return index < list.getLength(); - } - - @Override - public Node next() { - if (!hasNext()) throw new NoSuchElementException(); - return list.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; - } } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/UpdateMetadata.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/UpdateMetadata.java index 1c93c6c..c563c0b 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/UpdateMetadata.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/UpdateMetadata.java @@ -1,18 +1,18 @@ package io.gitlab.jfronny.inceptum.common.model.inceptum; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Map; import java.util.Set; -@GSerializable -public class UpdateMetadata { - public Integer wrapperVersion; - public String version; - public Long buildTime; - public Boolean isPublic; - public Boolean isRelease; - public Integer jvm; - public Set repositories; - public Map> natives; +@GSerializable(configure = GsonPreset.Api.class) +public record UpdateMetadata(int wrapperVersion, + String version, + long buildTime, + boolean isPublic, + boolean isRelease, + int jvm, + Set repositories, + Map> natives) { } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/WrapperConfig.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/WrapperConfig.java index f3289b5..00759a0 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/WrapperConfig.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/inceptum/WrapperConfig.java @@ -1,13 +1,11 @@ package io.gitlab.jfronny.inceptum.common.model.inceptum; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Map; import java.util.Set; -@GSerializable -public class WrapperConfig { - public Set libraries; - public Set repositories; - public Map> natives; +@GSerializable(configure = GsonPreset.Config.class) +public record WrapperConfig(Set libraries, Set repositories, Map> natives) { } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/ArtifactMeta.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/ArtifactMeta.java index ebb1335..9734c8d 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/ArtifactMeta.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/ArtifactMeta.java @@ -1,32 +1,25 @@ package io.gitlab.jfronny.inceptum.common.model.maven; import io.gitlab.jfronny.inceptum.common.MetaHolder; +import org.jetbrains.annotations.Nullable; import java.nio.file.Path; import java.util.Objects; -public class ArtifactMeta { +public record ArtifactMeta(String groupId, String artifactId, String version, @Nullable String classifier, @Nullable String snapshotVersion) { + public ArtifactMeta(String groupId, String artifactId, String version) { + this(groupId, artifactId, version, null, null); + } + public static ArtifactMeta parse(String mavenNotation) { if (Objects.requireNonNull(mavenNotation).isEmpty()) throw new IllegalArgumentException("The notation is empty"); String[] lib = mavenNotation.split(":"); if (lib.length <= 1) throw new IllegalArgumentException("Not in maven notation"); if (lib.length == 2) throw new IllegalArgumentException("Skipping versions is not supported"); if (lib.length >= 5) throw new IllegalArgumentException("Unkown elements in maven notation"); - ArtifactMeta meta = new ArtifactMeta(); - meta.groupId = lib[0]; - meta.artifactId = lib[1]; - meta.version = lib[2]; - if (lib.length > 3) meta.classifier = lib[3]; - return meta; + return new ArtifactMeta(lib[0], lib[1], lib[2], lib.length > 3 ? lib[3] : null, null); } - public String groupId; - public String artifactId; - public String version; - - public String classifier; - public String snapshotVersion; - public String getPomPath() { String path = groupId.replace('.', '/') + '/'; path += artifactId + '/'; diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/DependencyNode.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/DependencyNode.java index f030b2e..47aa18a 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/DependencyNode.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/DependencyNode.java @@ -2,28 +2,7 @@ package io.gitlab.jfronny.inceptum.common.model.maven; import java.util.*; -public class DependencyNode { - private final String name; - private final Set dependencies; - - public DependencyNode(String name, Set dependencies) { - this.name = Objects.requireNonNull(name); - this.dependencies = Objects.requireNonNull(dependencies); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DependencyNode that = (DependencyNode) o; - return name.equals(that.name) && dependencies.equals(that.dependencies); - } - - @Override - public int hashCode() { - return Objects.hash(name, dependencies); - } - +public record DependencyNode(String name, Set dependencies) { @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/MavenDependency.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/MavenDependency.java index ab5cd22..87ed4c7 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/MavenDependency.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/MavenDependency.java @@ -1,8 +1,4 @@ package io.gitlab.jfronny.inceptum.common.model.maven; -public class MavenDependency { - public String groupId; - public String artifactId; - public String version; - public String scope; +public record MavenDependency(String groupId, String artifactId, String version, String scope) { } diff --git a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/Pom.java b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/Pom.java index ff495c2..bedfdf4 100644 --- a/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/Pom.java +++ b/common/src/main/java/io/gitlab/jfronny/inceptum/common/model/maven/Pom.java @@ -4,13 +4,12 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -public class Pom { - public String modelVersion; - public String groupId; - public String artifactId; - public String version; - public String classifier; - public String snapshotVersion; - @Nullable public String packaging; - @Nullable public List dependencies; +public record Pom(String modelVersion, + String groupId, + String artifactId, + String version, + String classifier, + String snapshotVersion, + @Nullable String packaging, + @Nullable List dependencies) { } diff --git a/launcher-cli/build.gradle.kts b/launcher-cli/build.gradle.kts index 65463af..ccf3058 100644 --- a/launcher-cli/build.gradle.kts +++ b/launcher-cli/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("inceptum.application-conventions") + id("inceptum.manifold") } application { diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/BaseInstanceCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/BaseInstanceCommand.java index f33d1b3..5bf752d 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/BaseInstanceCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/BaseInstanceCommand.java @@ -11,11 +11,7 @@ import java.nio.file.Path; import java.util.List; public abstract class BaseInstanceCommand extends Command { - public BaseInstanceCommand(String help, String usage, String... aliases) { - super(help, mutateUsage(usage), aliases); - } - - public BaseInstanceCommand(String help, String usage, List aliases, List subCommands) { + protected BaseInstanceCommand(String help, String usage, List aliases, List subCommands) { super(help, mutateUsage(usage), aliases, subCommands); } @@ -36,9 +32,9 @@ public abstract class BaseInstanceCommand extends Command { Utils.LOGGER.error("You must specify an instance to commit in"); return; } - Path instancePath = MetaHolder.INSTANCE_DIR.resolve(args.get(0)); + Path instancePath = MetaHolder.INSTANCE_DIR.resolve(args[0]); if (!Files.exists(instancePath)) { - Utils.LOGGER.error("Invalid instance: \"" + args.get(0) + "\""); + Utils.LOGGER.error("Invalid instance: \"" + args[0] + "\""); return; } Instance instance; diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CliMain.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CliMain.java index 783275f..e9f6c87 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CliMain.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CliMain.java @@ -22,7 +22,7 @@ public class CliMain { public static final Command COMMANDS_ROOT = new Command("Root command", "", List.of(), KNOWN_COMMANDS) { @Override protected void invoke(CommandArgs args) { - throw new RuntimeException("Could not find command: " + args.get(0)); + throw new RuntimeException("Could not find command: " + args[0]); } @Override diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/Command.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/Command.java index 0a0d9a6..bc9e8b0 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/Command.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/Command.java @@ -24,7 +24,7 @@ public abstract class Command { } public String getName() { - return aliases.get(0); + return aliases[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.get(0))) { + if (command.isAlias(args[0])) { CommandResolution resolution = command.resolve(args.subArgs()); - if (!aliases.isEmpty()) resolution.resolvePath().add(0, aliases.get(0)); + if (!aliases.isEmpty) resolution.resolvePath.add(0, aliases[0]); return resolution; } } } - return new CommandResolution(this, args, aliases.isEmpty() + return new CommandResolution(this, args, aliases.isEmpty ? new ArrayList<>() - : new ArrayList<>(List.of(aliases.get(0)))); + : new ArrayList<>(List.of(aliases[0]))); } public void buildHelp(HelpBuilder builder) { builder.writeCommand(aliases, help, usage); for (Command command : subCommands) { - command.buildHelp(aliases.isEmpty() ? builder : builder.beginSubcommand(aliases.get(0))); + command.buildHelp(aliases.isEmpty ? builder : builder.beginSubcommand(aliases[0])); } } } diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CommandArgs.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CommandArgs.java index e600262..a9a1ad1 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CommandArgs.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/CommandArgs.java @@ -16,11 +16,11 @@ public class CommandArgs implements Iterable { } public String last() { - return args.get(args.size() - 1); + return args[args.size() - 1]; } public String get(int index) { - return args.get(index); + return args[index]; } public List after(String param) { diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/HelpBuilder.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/HelpBuilder.java index a0d5495..99ffadf 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/HelpBuilder.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/HelpBuilder.java @@ -31,22 +31,22 @@ public class HelpBuilder { } public void writeCommand(List 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.get(i); + String alias = aliases[i]; builder.append(alias); if (i < aliasesSize - 1) builder.append(", "); } builder.append(": ").append(help.replace("\n", "\n " + indent)); - if (level == 0 && !usage.isBlank() && !aliases.isEmpty()) { + if (level == 0 && !usage.isBlank()) { StringBuilder usagePrefix = new StringBuilder("inceptum"); for (String s : upper) { usagePrefix.append(" ").append(s); } - usagePrefix.append(" ").append(aliases.get(0)).append(" "); + usagePrefix.append(" ").append(aliases[0]).append(" "); builder.append("\n ") .append(indent) .append("Usage: ") diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ExportCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ExportCommand.java index d4a533c..caf7674 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ExportCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ExportCommand.java @@ -26,7 +26,7 @@ public class ExportCommand extends BaseInstanceCommand { if (args.length == 0) throw new IllegalAccessException("You must specify a target path"); if (args.length == 1) throw new IllegalAccessException("You must specify a version number"); if (args.length != 2) throw new IllegalAccessException("Too many arguments"); - Exporters.CURSE_FORGE.generate(new ProcessState(), instance, Paths.get(args.get(0)), args.get(1)); + Exporters.CURSE_FORGE.generate(new ProcessState(), instance, Paths.get(args[0]), args[1]); } 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.get(0)), "1.0"); + Exporters.MULTI_MC.generate(new ProcessState(), instance, Paths.get(args[0]), "1.0"); } } @@ -52,7 +52,7 @@ public class ExportCommand extends BaseInstanceCommand { if (args.length == 0) throw new IllegalAccessException("You must specify a target path"); if (args.length == 1) throw new IllegalAccessException("You must specify a version number"); if (args.length != 2) throw new IllegalAccessException("Too many arguments"); - Exporters.MODRINTH.generate(new ProcessState(), instance, Paths.get(args.get(0)), args.get(1)); + Exporters.MODRINTH.generate(new ProcessState(), instance, Paths.get(args[0]), args[1]); } } } diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/HelpCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/HelpCommand.java index d16ace9..e8bf501 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/HelpCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/HelpCommand.java @@ -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.getResult()); + System.out.println(help.result); } private static void printHeader() { diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ImportCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ImportCommand.java index 9ae0264..7b15fd6 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ImportCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ImportCommand.java @@ -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.get(0)), state).getFileName().toString(); + String name = Importers.importPack(Paths.get(args[0]), state).fileName.toString(); System.out.println(OutputColors.GREEN_BOLD + "Imported as " + name + OutputColors.RESET); } } diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/JvmStateCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/JvmStateCommand.java index 38bba6a..6282b96 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/JvmStateCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/JvmStateCommand.java @@ -21,11 +21,10 @@ public class JvmStateCommand extends Command { System.out.println("Classloader " + loader + ":"); if (loader instanceof URLClassLoader uc) - System.out.println("\t" + Arrays.toString(uc.getURLs())); + System.out.println("\t" + Arrays.toString(uc.uRLs)); else System.out.println("\t(cannot display components as not a URLClassLoader)"); - if (loader.getParent() != null) - dumpClasspath(loader.getParent()); + if (loader.getParent() != null) dumpClasspath(loader.getParent()); } } diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/LaunchCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/LaunchCommand.java index 2b1303a..3379c92 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/LaunchCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/LaunchCommand.java @@ -46,11 +46,13 @@ public class LaunchCommand extends BaseInstanceCommand { return; } if (args.length > 1) { - InstanceMeta meta = instance.meta(); - if (meta.arguments == null) meta.arguments = new InstanceMeta.Arguments(); - meta.arguments.client = meta.arguments.client == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.client); - meta.arguments.server = meta.arguments.server == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.server); - meta.arguments.jvm = meta.arguments.jvm == null ? new ArrayList<>() : new ArrayList<>(meta.arguments.jvm); + 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.client.addAll(args.after(0)); meta.arguments.server.addAll(args.after(0)); } diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ListCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ListCommand.java index b47d9ac..a29ee42 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ListCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ListCommand.java @@ -21,13 +21,13 @@ public class ListCommand extends Command { @Override protected void invoke(CommandArgs args) throws IOException { List 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.json"))) { System.out.println("- Invalid instance: " + path + " (no instance metadata)"); continue; } - System.out.println("- \"" + path.getFileName().toString() + "\""); + System.out.println("- \"" + path.fileName.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.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 : "")); + 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 : "")); } } } diff --git a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java index 6851229..5ff5056 100644 --- a/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java +++ b/launcher-cli/src/main/java/io/gitlab/jfronny/inceptum/cli/commands/ModCommand.java @@ -7,7 +7,6 @@ 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; import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner; -import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; import io.gitlab.jfronny.inceptum.launcher.util.Unchecked; import java.io.FileNotFoundException; @@ -47,27 +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.getMetadata().sources.isEmpty(); - boolean updatable = hasSources && mod.getMetadata().sources.values().stream().anyMatch(Optional::isPresent); + instance.mds.runOnce((path, mod) -> { + boolean hasSources = !mod.metadata.sources.isEmpty; + boolean updatable = hasSources && mod.metadata.sources.values().stream().anyMatch(Optional::isPresent); if (filterUpdatable && !updatable) return; - System.out.println("- " + path.getFileName().toString()); - System.out.println(" " + mod.getName()); - for (String s : mod.getDescription()) { + System.out.println("- " + path.fileName.toString()); + System.out.println(" " + mod.name); + for (String s : mod.description) { System.out.println(" " + s); } if (hasSources) { System.out.println(" Sources:"); - for (Map.Entry> 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()); + 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); } } }); @@ -100,22 +98,22 @@ public class ModCommand extends Command { } Set 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.modsDir.resolve(arg); + if (!Files.exists(p)) p = instance.modsDir.resolve(arg + ".imod"); if (!Files.exists(p)) { - Utils.LOGGER.error("Nonexistant mod file: " + instance.modsDir().resolve(arg)); + Utils.LOGGER.error("Nonexistant mod file: " + instance.modsDir.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.get(mod).delete(); + mds[mod].delete(); } catch (IOException e) { Utils.LOGGER.error("Could not delete " + mod, e); return; @@ -157,23 +155,23 @@ public class ModCommand extends Command { if (args.length == 0) { throw new IllegalArgumentException("You must specify mods to remove"); } - Set mods = pathSupplier.apply(args, instance.path()); - ModsDirScanner mds = instance.mds(); - if (!mds.isComplete()) { + Set 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 { - mds.get(mod).delete(); - Mod md = mds.get(mod); - md.getMetadata().sources.values().stream() + Mod md = mds[mod]; + md.delete(); + md.metadata.sources.values().stream() .filter(Optional::isPresent) .map(Optional::get) .findFirst() .ifPresentOrElse(update -> { try { - Utils.LOGGER.info("Updating " + mod + " to " + update.getVersion()); + Utils.LOGGER.info("Updating " + mod + " to " + update.version); md.update(update); Utils.LOGGER.info("Update completed"); } catch (IOException e) { diff --git a/launcher-gtk/src/main/java/io/gitlab/jfronny/inceptum/gtk/window/AboutWindow.java b/launcher-gtk/src/main/java/io/gitlab/jfronny/inceptum/gtk/window/AboutWindow.java index 7e88302..bb69169 100644 --- a/launcher-gtk/src/main/java/io/gitlab/jfronny/inceptum/gtk/window/AboutWindow.java +++ b/launcher-gtk/src/main/java/io/gitlab/jfronny/inceptum/gtk/window/AboutWindow.java @@ -10,7 +10,7 @@ public class AboutWindow extends AboutDialog { public AboutWindow() { setProgramName(new Str("Inceptum")); setCopyright(new Str("Copyright (C) 2021 JFronny")); - setVersion(new Str(BuildMetadata.VERSION.toString())); + setVersion(new Str(BuildMetadata.VERSION)); setLicenseType(License.MIT_X11); setLicense(I18n.str("about.license")); setWebsiteLabel(I18n.str("about.contact")); diff --git a/launcher-imgui/build.gradle.kts b/launcher-imgui/build.gradle.kts index 4837299..94294e8 100644 --- a/launcher-imgui/build.gradle.kts +++ b/launcher-imgui/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("inceptum.application-conventions") + id("inceptum.manifold") } application { diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/GuiMain.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/GuiMain.java index c9431df..91cebf4 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/GuiMain.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/GuiMain.java @@ -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.get(0)) / 2); + GLFW.glfwSetWindowPos(handle, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight[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.setFontDefault(io.getFonts().addFontFromMemoryTTF(Objects.requireNonNull(is).readAllBytes(), 16f)); + io.fontDefault = io.fonts.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.getName() + "##" + System.identityHashCode(window); - if (window.isCloseable()) { - if (ImGui.begin(title, window.getOpenState(), window.getFlags())) { + if (window.isNew) window.preFirstDraw(); + String title = window.name + "##" + System.identityHashCode(window); + if (window.isCloseable) { + if (ImGui.begin(title, window.openState, window.flags)) { window.draw(); } } else { - if (ImGui.begin(title, window.getFlags())) { + if (ImGui.begin(title, window.flags)) { window.draw(); } } ImGui.end(); - if (!window.getOpenState().get() && !window.isClosed()) window.close(); + if (!window.openState.get() && !window.isClosed) window.close(); } } //end frame ImGui.render(); - imGuiGl3.renderDrawData(ImGui.getDrawData()); + imGuiGl3.renderDrawData(ImGui.drawData); if (ImGui.getIO().hasConfigFlags(ImGuiConfigFlags.ViewportsEnable)) { final long backupWindowPtr = GLFW.glfwGetCurrentContext(); diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceManageControls.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceManageControls.java index e2c18ff..454965a 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceManageControls.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceManageControls.java @@ -34,21 +34,21 @@ public class InstanceManageControls { private FabricVersionLoaderInfo selectedFabric; public InstanceManageControls(@Nullable Instance instance) { - selected = getVersions(false).get(0); + selected = getVersions(false)[0]; if (instance != null) { for (VersionsListInfo ver : getVersions(true)) { - if (ver.id.equals(instance.getGameVersion())) + if (ver.id.equals(instance.gameVersion)) selected = ver; } } version.set(getVersions(snapshots.get()).indexOf(selected)); - name.set(instance == null ? InstanceNameTool.getDefaultName(selected.id, fabric.get()) : instance.getName()); - fabric.set(instance == null || instance.isFabric()); - List versions = getFabricLoaderInfo(); + name.set(instance == null ? InstanceNameTool.getDefaultName(selected.id, fabric.get()) : instance.name); + fabric.set(instance == null || instance.isFabric); + List versions = fabricLoaderInfo; for (int i = 0, fabricLoaderInfoSize = versions.size(); i < fabricLoaderInfoSize; i++) { - FabricVersionLoaderInfo version = versions.get(i); - if (instance != null && instance.isFabric() - ? version.loader.version.equals(instance.getLoaderVersion()) + FabricVersionLoaderInfo version = versions[i]; + if (instance != null && instance.isFabric + ? version.loader.version.equals(instance.loaderVersion) : version.loader.stable) { selectedFabric = version; fabricVersion.set(i); @@ -74,7 +74,7 @@ public class InstanceManageControls { InceptumConfig.snapshots = snapshots.get(); InceptumConfig.saveConfig(); //fix version index - int i = getVersions(InceptumConfig.snapshots).indexOf(getVersions(prev).get(version.get())); + int i = getVersions(InceptumConfig.snapshots).indexOf(getVersions(prev)[version.get()]); if (i == -1) version.set(0); else version.set(i); } @@ -84,16 +84,16 @@ public class InstanceManageControls { List vil = getVersions(InceptumConfig.snapshots); String originalStr = null; try { - originalStr = getVersionInfo().id; + originalStr = versionInfo.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.get(version.get()); + selected = vil[version.get()]; exchangeNameIfDefault(prev.id, fabric.get()); } - if (getFabricLoaderInfo().isEmpty()) { + if (fabricLoaderInfo.isEmpty()) { fabric.set(false); exchangeNameIfDefault(selected.id, true); } else { @@ -102,7 +102,7 @@ public class InstanceManageControls { } if (fabric.get()) { ImGui.sameLine(); - List versions = getFabricLoaderInfo(); + List versions = fabricLoaderInfo; if (ImGui.combo("Loader", fabricVersion, versions.stream().map(info -> info.loader.version).toArray(String[]::new))) { selectedFabric = versions.get(fabricVersion.get()); } @@ -110,7 +110,7 @@ public class InstanceManageControls { } try { if (originalStr != null && !originalStr.equals(getVersionInfo().id)) - modifiedVersion.accept(getVersionInfo().id); + modifiedVersion.accept(versionInfo.id); } catch (IOException e) { Utils.LOGGER.error("Could not compare version string", e); } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceView.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceView.java index ff50984..8d6c0a9 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceView.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/InstanceView.java @@ -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.json"))) { + if (!Files.exists(instance.path.resolve("instance.json"))) { Utils.LOGGER.error("Invalid instance (doesn't contain instance.json): " + 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) { diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/Tab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/Tab.java index 05a27b4..1d558eb 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/Tab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/control/Tab.java @@ -12,13 +12,13 @@ public abstract class Tab { protected abstract void renderInner(); public void render() { - if (canShow() && ImGui.beginTabItem(name)) { + if (isVisible && ImGui.beginTabItem(name)) { renderInner(); ImGui.endTabItem(); } } - protected boolean canShow() { + protected boolean isVisible() { return true; } } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/AddModWindow.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/AddModWindow.java index 2adefaf..0edda97 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/AddModWindow.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/AddModWindow.java @@ -26,19 +26,19 @@ public class AddModWindow extends Window { private ModrinthSearchResult mr = null; private List cf = null; - public AddModWindow(Instance instance) throws IOException { - super(instance.getName() + " - Add Mods"); + public AddModWindow(Instance instance) { + super(instance.name + " - Add Mods"); this.instance = instance; } - private void reSearch() throws IOException { + private void reSearch() { String query = this.query.get(); new Thread(() -> { try { - ModrinthSearchResult ms = ModrinthApi.search(query, mrPage, instance.getGameVersion(), ModrinthProjectType.mod); + ModrinthSearchResult ms = ModrinthApi.search(query, mrPage, instance.gameVersion, ModrinthProjectType.mod); if (!this.query.get().equals(query)) return; mr = ms; - List cs = CurseforgeApi.search(instance.getGameVersion(), query, cfPage, "Popularity"); + List cs = CurseforgeApi.search(instance.gameVersion, query, cfPage, "Popularity"); if (!this.query.get().equals(query)) return; cf = cs; } catch (IOException e) { @@ -71,12 +71,11 @@ public class AddModWindow extends Window { reSearch(); } } - if (mr != null && ImGui.beginTable("mods" + instance.id(), 3, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) { + 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-"; - if (mod.project_id.startsWith(idPrefix)) - mod.project_id = mod.project_id.substring(idPrefix.length()); + 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); @@ -84,22 +83,21 @@ public class AddModWindow extends Window { ImGui.text(mod.description); ImGui.tableNextColumn(); boolean alreadyPresent = false; - for (Mod mdsMod : instance.getMods()) { - alreadyPresent = mdsMod.getMetadata().sources.keySet().stream() - .anyMatch(s -> s instanceof ModrinthModSource ms - && ms.getModId().equals(mod.project_id)); + for (Mod mdsMod : instance.mods) { + alreadyPresent = mdsMod.metadata.sources.keySet().stream() + .anyMatch(s -> s instanceof ModrinthModSource ms && ms.modId.equals(projectId)); if (alreadyPresent) break; } if (alreadyPresent) { ImGui.text("Installed"); } else { - if (ImGui.button("Add##" + mod.project_id)) { + if (ImGui.button("Add##" + projectId)) { ModrinthVersion stable = null; ModrinthVersion beta = null; ModrinthVersion latest = null; - for (ModrinthVersion version : ModrinthApi.getVersions(mod.project_id)) { - if (version.game_versions.contains(instance.getGameVersion()) && version.loaders.contains("fabric")) { + for (ModrinthVersion version : ModrinthApi.getVersions(projectId)) { + if (version.game_versions.contains(instance.gameVersion) && version.loaders.contains("fabric")) { latest = version; if (version.version_type == ModrinthVersion.VersionType.beta || version.version_type == ModrinthVersion.VersionType.release) { beta = version; @@ -117,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 ? mod.project_id : mod.slug) + ModPath.EXT_IMOD), instance.mds()).write(); + ModManager.download(new ModrinthModSource(finalLatest.id), instance.modsDir.resolve((mod.slug == null ? projectId : mod.slug) + ModPath.EXT_IMOD), instance.mds).write(); } catch (IOException e) { LauncherEnv.showError("Could not download mod", e); } @@ -126,7 +124,7 @@ public class AddModWindow extends Window { } } ImGui.sameLine(); - if (ImGui.button("Web##" + mod.project_id)) { + if (ImGui.button("Web##" + projectId)) { Utils.openWebBrowser(new URI("https://modrinth.com/mod/" + modId)); } } @@ -150,7 +148,7 @@ 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(); @@ -159,10 +157,9 @@ public class AddModWindow extends Window { ImGui.text(mod.summary); ImGui.tableNextColumn(); boolean alreadyPresent = false; - for (Mod mdsMod : instance.mds().getMods()) { - alreadyPresent = mdsMod.getMetadata().sources.keySet().stream() - .anyMatch(s -> s instanceof CurseforgeModSource ms - && ms.getProjectId() == mod.id); + for (Mod mdsMod : instance.mds.mods) { + alreadyPresent = mdsMod.metadata.sources.keySet().stream() + .anyMatch(s -> s instanceof CurseforgeModSource ms && ms.projectId == mod.id); if (alreadyPresent) break; } @@ -172,7 +169,7 @@ public class AddModWindow extends Window { if (ImGui.button("Add##" + mod.id)) { CurseforgeMod.LatestFileIndex latest = null; for (CurseforgeMod.LatestFileIndex file : mod.latestFilesIndexes) { - if (file.gameVersion.equals(instance.getGameVersion())) { + if (file.gameVersion.equals(instance.gameVersion)) { if (latest == null) latest = file; } } @@ -182,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.modsDir.resolve((mod.slug == null ? mod.id : mod.slug) + ModPath.EXT_IMOD), instance.mds).write(); } catch (IOException e) { LauncherEnv.showError("Could not download mod", e); } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/GuiUtil.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/GuiUtil.java index e525166..7354bcc 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/GuiUtil.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/GuiUtil.java @@ -49,7 +49,7 @@ public class GuiUtil { LauncherEnv.showInfo("The instance was successfully created. You can now launch it using the main menu", "Successfully installed"); }, () -> { 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); } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/MainWindow.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/MainWindow.java index f98fddf..548a0e3 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/MainWindow.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/MainWindow.java @@ -49,11 +49,11 @@ public class MainWindow extends Window { } if (ImGui.beginMenu("Account")) { if (ImGui.menuItem("New")) GuiMain.open(new MicrosoftLoginWindow()); - AuthInfo selected = AccountManager.getSelectedAccount(); - List accounts = AccountManager.getAccounts(); + AuthInfo selected = AccountManager.selectedAccount; + List accounts = AccountManager.accounts; int accountsSize = accounts.size(); for (int i = 0; i < accountsSize; i++) { - MicrosoftAccount account = accounts.get(i); + MicrosoftAccount account = accounts[i]; if (selected.equals(account)) accountIndex.set(i); if (ImGui.radioButton(account.minecraftUsername, accountIndex, i)) { AccountManager.switchAccount(account); diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/NewInstanceWindow.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/NewInstanceWindow.java index 89bc1e8..29c2395 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/NewInstanceWindow.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/NewInstanceWindow.java @@ -32,7 +32,7 @@ public class NewInstanceWindow extends Window { imc.nameBox("OK", name -> { try { GuiUtil.createInstance(new SetupStepInfo(imc.getVersionInfo(), - imc.getLoaderInfo(), + imc.loaderInfo, name, Steps.createProcessState())); } catch (IOException e) { @@ -54,7 +54,7 @@ public class NewInstanceWindow extends Window { GuiMain.open(new ProcessStateWatcherWindow("Importing", "Could not import packs", state, cToken -> { for (Path pack : packs) { Path imported = Importers.importPack(pack, state); - LauncherEnv.showInfo(pack.getFileName() + " has been successfully imported as " + imported.getFileName(), "Imported pack"); + LauncherEnv.showInfo(pack.fileName + " has been successfully imported as " + imported.fileName, "Imported pack"); } }, null)); } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/dialog/ProcessStateWatcherWindow.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/dialog/ProcessStateWatcherWindow.java index 37e5049..aa62fb4 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/dialog/ProcessStateWatcherWindow.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/dialog/ProcessStateWatcherWindow.java @@ -36,8 +36,8 @@ public class ProcessStateWatcherWindow extends Window { @Override public void draw() { - ImGui.progressBar(state.getProgress()); - ImGui.textUnformatted(state.getCurrentStep()); + ImGui.progressBar(state.progress); + ImGui.textUnformatted(state.currentStep); if (cancel != null && ImGui.button("Cancel")) { canceled.set(true); close(); diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ArgumentsTab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ArgumentsTab.java index dd95b64..2c33079 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ArgumentsTab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ArgumentsTab.java @@ -2,12 +2,15 @@ package io.gitlab.jfronny.inceptum.imgui.window.edit; import imgui.ImGui; import imgui.type.ImString; +import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.imgui.control.Tab; import io.gitlab.jfronny.inceptum.imgui.window.GuiUtil; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.regex.Pattern; public class ArgumentsTab extends Tab { private final InstanceEditWindow window; @@ -18,28 +21,29 @@ public class ArgumentsTab extends Tab { public ArgumentsTab(InstanceEditWindow window) { super("Arguments"); this.window = window; - InstanceMeta meta = window.instance.meta(); - if (meta.arguments == null) meta.arguments = new InstanceMeta.Arguments(); - if (meta.arguments.jvm == null) meta.arguments.jvm = new LinkedList<>(); + 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.client = new LinkedList<>(); + 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.server = new LinkedList<>(); + 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; if (ImGui.inputTextMultiline("JVM", jvm)) { - window.instance.meta().arguments.jvm = List.of(jvm.get().split("[\r\n]+")); + meta.arguments = meta.arguments.withJvm(List.of(Utils.NEW_LINE.split(jvm.get()))); window.instance.writeMeta(); } if (ImGui.inputTextMultiline("Client", client)) { - window.instance.meta().arguments.client = List.of(client.get().split("[\r\n]+")); + meta.arguments = meta.arguments.withClient(List.of(Utils.NEW_LINE.split(client.get()))); window.instance.writeMeta(); } if (ImGui.inputTextMultiline("Server", server)) { - window.instance.meta().arguments.server = List.of(server.get().split("[\r\n]+")); + meta.arguments = meta.arguments.withServer(List.of(Utils.NEW_LINE.split(server.get()))); window.instance.writeMeta(); } } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java index e5f1686..5f14f22 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ExportTab.java @@ -23,18 +23,18 @@ public class ExportTab extends Tab { @Override protected void renderInner() { - if (window.instance.mds().isComplete()) { + if (window.instance.mds.isComplete) { for (Exporter exporter : Exporters.EXPORTERS) { - if (ImGui.button(exporter.getName())) { + if (ImGui.button(exporter.name)) { GuiMain.open(new TextBoxWindow("Version", "Please enter the current version of your modpack", "1.0", version -> { - String defaultName = window.instance.getName() + " " + version + " (" + exporter.getName() + ")." + exporter.getFileExtension(); - String filter = "*." + exporter.getFileExtension(); - Path exportPath = GuiMain.saveFileDialog("Export " + exporter.getName() + " Pack", defaultName, new String[]{filter}, exporter.getName() + " packs (" + filter + ")"); + String defaultName = window.instance.name + " " + version + " (" + exporter.name + ")." + exporter.fileExtension; + String filter = "*." + exporter.fileExtension; + Path exportPath = GuiMain.saveFileDialog("Export " + exporter.name + " Pack", defaultName, new String[]{filter}, exporter.name + " packs (" + filter + ")"); if (exportPath != null) { ProcessState state = new ProcessState(Exporters.STEP_COUNT, "Initializing..."); GuiMain.open(new ProcessStateWatcherWindow("Exporting", "Could not export pack", state, cToken -> { exporter.generate(state, window.instance, exportPath, version); - LauncherEnv.showInfo(window.instance.getName() + " has been successfully exported to " + exportPath, "Successfully exported"); + LauncherEnv.showInfo(window.instance.name + " has been successfully exported to " + exportPath, "Successfully exported"); }, null)); } }, R::nop)); diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/GeneralTab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/GeneralTab.java index 63e5fd0..1280a4d 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/GeneralTab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/GeneralTab.java @@ -26,7 +26,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); } @@ -34,12 +34,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) { @@ -55,7 +55,7 @@ public class GeneralTab extends Tab { 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); } @@ -63,15 +63,15 @@ public class GeneralTab extends Tab { }, R::nop); if (ImGui.checkbox("Custom Java", customJava)) { if (customJava.get()) { - window.instance.meta().java = OSUtils.getJvmBinary(); - customJavaPath.set(window.instance.meta().java); + window.instance.meta.java = OSUtils.jvmBinary; + 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(); } } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/InstanceEditWindow.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/InstanceEditWindow.java index 1897c41..695502e 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/InstanceEditWindow.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/InstanceEditWindow.java @@ -16,9 +16,9 @@ public class InstanceEditWindow extends Window { protected boolean lastTabWasMods = false; public InstanceEditWindow(Instance instance) throws IOException { - super(instance.getName() + " - Edit"); + super(instance.name + " - 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(); } diff --git a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java index d490f6f..4fee2c2 100644 --- a/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java +++ b/launcher-imgui/src/main/java/io/gitlab/jfronny/inceptum/imgui/window/edit/ModsTab.java @@ -29,28 +29,24 @@ public class ModsTab extends Tab { @Override protected void renderInner() { window.lastTabWasMods = true; - if (!Files.exists(window.instance.modsDir())) { + if (!Files.exists(window.instance.modsDir)) { try { - Files.createDirectories(window.instance.modsDir()); + Files.createDirectories(window.instance.modsDir); } catch (IOException e) { Utils.LOGGER.error("Could not create mods directory which was missing from this modded instance", e); } } ImGui.beginChild("mods select", 200, 0); if (ImGui.button("Add")) { - try { - GuiMain.WINDOWS.add(new AddModWindow(window.instance)); - } catch (IOException e) { - Utils.LOGGER.error("Could not open window", e); - } + 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.modsDir) && ImGui.button("Show")) { + Utils.openFile(window.instance.modsDir.toFile()); } ImGui.sameLine(); - if (Files.exists(window.instance.configDir()) && ImGui.button("Configs")) { - Utils.openFile(window.instance.configDir().toFile()); + if (Files.exists(window.instance.configDir) && ImGui.button("Configs")) { + Utils.openFile(window.instance.configDir.toFile()); } try { Set modSet = window.instance.getMods(); @@ -58,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 value : mod.getMetadata().sources.values()) { - if (value.isPresent()) { + for (Optional value : mod.metadata.sources.values()) { + if (value.isPresent) { updatesFound = true; break; } @@ -78,21 +74,21 @@ public class ModsTab extends Tab { ImGui.separator(); for (Mod mod : modSet) { updatesFound = false; - for (Optional value : mod.getMetadata().sources.values()) { - updatesFound |= value.isPresent(); + for (Optional value : mod.metadata.sources.values()) { + updatesFound |= value.isPresent; } if (filterUpdates.get() && !updatesFound) continue; - if (ImGui.checkbox("##" + mod.getName(), mod.isEnabled())) { - Path newSel = ModPath.toggle(mod.getMetadataPath()); + if (ImGui.checkbox("##" + mod.name, mod.isEnabled)) { + Path newSel = ModPath.toggle(mod.metadataPath); try { - Files.move(mod.getMetadataPath(), newSel); - if (mod.getMetadataPath().equals(selected)) selected = newSel; + Files.move(mod.metadataPath, newSel); + if (mod.metadataPath.equals(selected)) selected = newSel; } catch (IOException e) { LauncherEnv.showError("Could not change disabled state", e); } } ImGui.sameLine(); - if (ImGui.button(mod.getName())) selected = mod.getMetadataPath(); + if (ImGui.button(mod.name)) selected = mod.metadataPath; } } catch (IOException e) { Utils.LOGGER.error("Could not show mod list", e); @@ -102,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().get(selected); - ImGui.text(md.getName()); + } else if (window.instance.mds.hasScanned(selected)) { + Mod md = window.instance.mds[selected]; + ImGui.text(md.name); ImGui.separator(); - for (String s : md.getDescription()) { + for (String s : md.description) { ImGui.text(s); } ImGui.separator(); - Map> sources = md.getMetadata().sources; + Map> sources = md.metadata.sources; ImGui.text("Sources:"); - if (sources.isEmpty()) + if (sources.isEmpty) ImGui.bulletText("Local Drive"); else { - for (Map.Entry> source : sources.entrySet()) { - ImGui.bulletText(source.getKey().getName()); - source.getValue().ifPresent(update -> { + for (var source : sources) { + ImGui.bulletText(source.key.name); + source.value.ifPresent(update -> { ImGui.sameLine(); - if (ImGui.button("Update to " + update.getVersion())) { + if (ImGui.button("Update to " + update.version)) { try { selected = md.update(update); } catch (IOException e) { @@ -130,8 +126,8 @@ public class ModsTab extends Tab { } } if (ImGui.button("Delete")) { - if (!md.getMetadata().dependents.isEmpty()) - LauncherEnv.showError("This mod still has the following dependent mods installed: " + String.join(", ", md.getMetadata().dependents), "Dependents present"); + if (!md.metadata.dependents.isEmpty) + LauncherEnv.showError("This mod still has the following dependent mods installed: " + String.join(", ", md.metadata.dependents), "Dependents present"); else { try { md.delete(); @@ -148,7 +144,7 @@ public class ModsTab extends Tab { } @Override - protected boolean canShow() { - return window.instance.isFabric(); + protected boolean isVisible() { + return window.instance.isFabric; } } diff --git a/launcher/build.gradle.kts b/launcher/build.gradle.kts index 1f94962..9b4bc1d 100644 --- a/launcher/build.gradle.kts +++ b/launcher/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("inceptum.library-conventions") id("inceptum.gson-compile") + id("inceptum.manifold") } dependencies { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/CurseforgeApi.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/CurseforgeApi.java index b2c2c1d..5f86ad1 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/CurseforgeApi.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/CurseforgeApi.java @@ -50,7 +50,7 @@ public class CurseforgeApi { if (response.pagination.totalCount != 1) { throw new FileNotFoundException("Could not find mod with slug \"" + slug + "\""); } - return checkDistribution(response.data.get(0)); + return checkDistribution(response.data[0]); } public static CurseforgeMod getMod(int id) throws IOException { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/FabricMetaApi.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/FabricMetaApi.java index d6f6605..781ae35 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/FabricMetaApi.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/FabricMetaApi.java @@ -5,6 +5,7 @@ import io.gitlab.jfronny.gson.stream.JsonReader; import io.gitlab.jfronny.inceptum.common.Net; import io.gitlab.jfronny.inceptum.common.model.maven.ArtifactMeta; import io.gitlab.jfronny.inceptum.launcher.model.fabric.*; +import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library; import io.gitlab.jfronny.inceptum.launcher.model.mojang.*; import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser; @@ -40,40 +41,45 @@ public class FabricMetaApi { 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 libs = new ArrayList<>(version.libraries); - for (FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library : meta.libraries.common) + for (Library library : meta.libraries.common) libs.add(convertLib(library)); if (type == FabricVersionInfoType.Client || type == FabricVersionInfoType.Both) { - for (FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library : meta.libraries.client) + for (Library library : meta.libraries.client) libs.add(convertLib(library)); } if (type == FabricVersionInfoType.Server || type == FabricVersionInfoType.Both) { - for (FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library : meta.libraries.server) + for (Library library : meta.libraries.server) libs.add(convertLib(library)); } - var floader = new FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library(); - floader.name = "net.fabricmc:fabric-loader:" + fabricVersion; - floader.url = "https://maven.fabricmc.net/"; - libs.add(convertLib(floader)); - floader.name = ver.intermediary.maven; - libs.add(convertLib(floader)); + libs.add(convertLib(new Library( + "net.fabricmc:fabric-loader:" + fabricVersion, + "https://maven.fabricmc.net/" + ))); + libs.add(convertLib(new Library( + ver.intermediary.maven, + "https://maven.fabricmc.net/" + ))); result.libraries = List.copyOf(libs); result.id = GameVersionParser.createVersionWithFabric(version.id, fabricVersion); return result; } - private static VersionInfo.Library convertLib(FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library library) { - VersionInfo.Library res = new VersionInfo.Library(); - res.name = library.name; - res.rules = new Rules(true); - res.natives = new HashMap<>(); - res.downloads = new VersionInfo.Library.Downloads(); - res.downloads.classifiers = null; - res.downloads.artifact = new VersionInfo.Library.Downloads.Artifact(); - res.downloads.artifact.path = ArtifactMeta.parse(library.name).getJarPath(true); - res.downloads.artifact.size = -1; - res.downloads.artifact.sha1 = null; - res.downloads.artifact.url = library.url + res.downloads.artifact.path; - return res; + private static VersionInfo.Library convertLib(Library library) { + 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 + ), + null + ), + library.name, + new HashMap<>(), + new Rules(true) + ); } public enum FabricVersionInfoType { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/McApi.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/McApi.java index 1d37571..1ddf598 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/McApi.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/McApi.java @@ -47,7 +47,7 @@ public class McApi { case LINUX -> info.linux; case MAC_OS -> info.macOs; }; - List vmList = vms.get(component); + List vmList = vms[component]; if (vmList == null) throw new IOException("Invalid component: " + component + " (available: " + String.join(", ", vms.keySet())); for (JvmInfo.Jvm jvm : vmList) { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/AccountManager.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/AccountManager.java index 82c17d3..f167fc4 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/AccountManager.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/AccountManager.java @@ -26,7 +26,7 @@ public class AccountManager { } public static boolean accountMissing() { - return ACCOUNTS.isEmpty(); + return ACCOUNTS.isEmpty; } public static List getAccounts() { @@ -40,6 +40,7 @@ public class AccountManager { public static void saveAccounts() { try (JsonWriter w = new JsonWriter(Files.newBufferedWriter(MetaHolder.ACCOUNTS_PATH))) { + GsonPreset.Config.configure(w); GList.write(w, ACCOUNTS, GC_MicrosoftAccount::write); } catch (IOException e) { Utils.LOGGER.error("Could not save accounts", e); @@ -50,6 +51,7 @@ public class AccountManager { Utils.LOGGER.info("Loading accounts"); if (Files.exists(MetaHolder.ACCOUNTS_PATH)) { try (JsonReader r = new JsonReader(Files.newBufferedReader(MetaHolder.ACCOUNTS_PATH))) { + GsonPreset.Config.configure(r); ACCOUNTS.addAll(GList.read(r, GC_MicrosoftAccount::read)); } catch (IOException e) { Utils.LOGGER.error("Could not load accounts", e); @@ -77,7 +79,7 @@ public class AccountManager { if (ACCOUNTS.size() == 1) switchAccount(null); else - switchAccount(ACCOUNTS.get(0)); + switchAccount(ACCOUNTS[0]); } ACCOUNTS.remove(account); saveAccounts(); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAccount.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAccount.java index 547b51b..2fd7647 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAccount.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAccount.java @@ -1,9 +1,9 @@ package io.gitlab.jfronny.inceptum.launcher.api.account; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; -import io.gitlab.jfronny.inceptum.common.R; -import io.gitlab.jfronny.inceptum.common.Utils; +import io.gitlab.jfronny.inceptum.common.*; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; +import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.*; import io.gitlab.jfronny.inceptum.launcher.gson.MicrosoftAccountMeta; import io.gitlab.jfronny.inceptum.launcher.model.microsoft.*; @@ -11,13 +11,8 @@ import java.io.IOException; import java.net.URISyntaxException; import java.util.*; -@GSerializable(with = MicrosoftAccountMeta.class) +@GSerializable(with = MicrosoftAccountMeta.class, configure = GsonPreset.Config.class) public class MicrosoftAccount { - /** - * Auto generated serial. - */ - private static final long serialVersionUID = 5483749902584257559L; - /** * The username/email/id of the account. */ @@ -60,14 +55,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() { @@ -92,14 +87,14 @@ public class MicrosoftAccount { LoginResponse loginResponse, Profile profile) { this.oauthToken = oauthTokenResponse; this.xstsAuth = xstsAuthResponse; - this.accessToken = loginResponse.accessToken(); + this.accessToken = loginResponse.accessToken; this.minecraftUsername = profile.name; this.uuid = profile.id; - this.accountId = loginResponse.username(); + this.accountId = loginResponse.username; this.mustLogin = false; this.accessTokenExpiresAt = new Date(); - this.accessTokenExpiresAt.setTime(this.accessTokenExpiresAt.getTime() + (loginResponse.expiresIn() * 1000)); + this.accessTokenExpiresAt.time += loginResponse.expiresIn * 1000; } public String getAccessToken() { @@ -152,10 +147,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()); + this.xstsAuth = MicrosoftAuthAPI.getXstsToken(xboxLiveAuthResponse.token); if (xstsAuth == null) { mustLogin = true; @@ -168,7 +163,7 @@ public class MicrosoftAccount { } if (force || new Date().after(this.accessTokenExpiresAt)) { - LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft(this.getIdentityToken()); + LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft(identityToken); if (loginResponse == null) { mustLogin = true; @@ -177,12 +172,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 - .setTime(this.accessTokenExpiresAt.getTime() + (loginResponse.expiresIn() * 1000)); + this.accessTokenExpiresAt.time += loginResponse.expiresIn * 1000; AccountManager.saveAccounts(); } @@ -198,7 +192,7 @@ public class MicrosoftAccount { } private String getIdentityToken() { - return "XBL3.0 x=" + xstsAuth.displayClaims().xui().get(0).uhs() + ";" + xstsAuth.token(); + return "XBL3.0 x=" + xstsAuth.displayClaims.xui[0].uhs + ";" + xstsAuth.token; } public boolean ensureAccessTokenValid() { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthAPI.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthAPI.java index 3218000..3b2ba41 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthAPI.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthAPI.java @@ -1,8 +1,9 @@ package io.gitlab.jfronny.inceptum.launcher.api.account; import io.gitlab.jfronny.commons.HttpUtils; -import io.gitlab.jfronny.inceptum.launcher.api.account.request.*; import io.gitlab.jfronny.inceptum.launcher.model.microsoft.*; +import io.gitlab.jfronny.inceptum.launcher.model.microsoft.request.*; +import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.*; import java.io.IOException; import java.io.Reader; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthServer.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthServer.java index 67a63ca..f277db2 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthServer.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/MicrosoftAuthServer.java @@ -2,6 +2,7 @@ package io.gitlab.jfronny.inceptum.launcher.api.account; import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; +import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.*; import io.gitlab.jfronny.inceptum.launcher.model.microsoft.*; import net.freeutils.httpserver.HTTPServer; import org.jetbrains.annotations.Nullable; @@ -24,33 +25,33 @@ public class MicrosoftAuthServer implements Closeable { public void start() throws IOException { host.addContext("/", (req, res) -> { - if (req.getParams().containsKey("error")) { - res.getHeaders().add("Content-Type", "text/plain"); + if (req.params.containsKey("error")) { + res.headers.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.getParams().get("error_description"), StandardCharsets.UTF_8)); + .decode(req.params["error_description"], StandardCharsets.UTF_8)); close(); return 0; } - if (!req.getParams().containsKey("code")) { - res.getHeaders().add("Content-Type", "text/plain"); + if (!req.params.containsKey("code")) { + res.headers.add("Content-Type", "text/plain"); res.send(400, "Code is missing"); close(); return 0; } try { - acquireAccessToken(req.getParams().get("code")); + acquireAccessToken(req.params["code"]); } catch (Exception e) { Utils.LOGGER.error("Error acquiring accessToken", e); - res.getHeaders().add("Content-Type", "text/html"); + res.headers.add("Content-Type", "text/html"); res.send(500, "Error logging in. Check console for more information"); close(); return 0; } - res.getHeaders().add("Content-Type", "text/plain"); + res.headers.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(); @@ -61,8 +62,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; @@ -103,16 +104,13 @@ public class MicrosoftAuthServer implements Closeable { } private void acquireMinecraftToken(OauthTokenResponse oauthTokenResponse, XboxLiveAuthResponse xstsAuthResponse) throws Exception { - String xblUhs = xstsAuthResponse.displayClaims().xui().get(0).uhs(); - String xblXsts = xstsAuthResponse.token(); - - LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft("XBL3.0 x=" + xblUhs + ";" + xblXsts); + LoginResponse loginResponse = MicrosoftAuthAPI.loginToMinecraft("XBL3.0 x=" + xstsAuthResponse.displayClaims.xui[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")))) { @@ -123,7 +121,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? diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/LoginRequest.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/LoginRequest.java deleted file mode 100644 index 022e767..0000000 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/LoginRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.gitlab.jfronny.inceptum.launcher.api.account.request; - -import io.gitlab.jfronny.gson.compile.annotations.GSerializable; - -@GSerializable -public record LoginRequest(String xtoken, String platform) { -} diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/MicrosoftAccountMeta.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/MicrosoftAccountMeta.java index d4f642f..8dee105 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/MicrosoftAccountMeta.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/MicrosoftAccountMeta.java @@ -3,17 +3,16 @@ package io.gitlab.jfronny.inceptum.launcher.gson; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; import io.gitlab.jfronny.gson.stream.JsonReader; import io.gitlab.jfronny.gson.stream.JsonWriter; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.api.account.MicrosoftAccount; -import io.gitlab.jfronny.inceptum.launcher.model.microsoft.OauthTokenResponse; -import io.gitlab.jfronny.inceptum.launcher.model.microsoft.XboxLiveAuthResponse; +import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.OauthTokenResponse; +import io.gitlab.jfronny.inceptum.launcher.model.microsoft.response.XboxLiveAuthResponse; import java.io.IOException; import java.util.Date; -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public record MicrosoftAccountMeta(String accountId, String minecraftUsername, String uuid, String accessToken, OauthTokenResponse oauthToken, XboxLiveAuthResponse xstsAuth, Date accessTokenExpiresAt, boolean mustLogin) { - public static final long SERIAL_VERSION_UID = 5483749902584257559L; - public static void write(JsonWriter writer, MicrosoftAccount value) throws IOException { GC_MicrosoftAccountMeta.write(writer, value == null ? null : value.toMeta()); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/ModSourceAdapter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/ModSourceAdapter.java index e02b969..23bba6e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/ModSourceAdapter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/ModSourceAdapter.java @@ -14,25 +14,25 @@ public class ModSourceAdapter { writer.beginObject(); if (src instanceof ModrinthModSource mo) { writer.name("type").value("modrinth") - .name("id").value(mo.getVersionId()); + .name("id").value(mo.versionId); } 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.fileName) + .name("url").value(di.url) .name("dependencies"); writer.beginArray(); - for (ModSource dependency : di.dependencies()) { + for (ModSource dependency : di.dependencies) { write(writer, dependency); } writer.endArray(); } else if (src instanceof CurseforgeModSource cu) { writer.name("type").value("curseforge"); - if (cu.getShortName().matches("\\d+")) { - writer.name("projectId").value(cu.getProjectId()); + if (cu.shortName.matches("\\d+")) { + writer.name("projectId").value(cu.projectId); } else { - writer.name("project").value(cu.getShortName()); + writer.name("project").value(cu.shortName); } - writer.name("fileId").value(cu.getFileId()); + writer.name("fileId").value(cu.fileId); } else throw new RuntimeException("ModSources with the type " + src.getClass() + " are not supported"); writer.endObject(); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/RulesAdapter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/RulesAdapter.java index 62e62c8..6d35173 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/RulesAdapter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/gson/RulesAdapter.java @@ -51,7 +51,7 @@ public class RulesAdapter { throw new JsonParseException("Unexpected action in argument: " + actionType); } if (hasFeatures) valid = false; - if (osName != null && !OSUtils.TYPE.getMojName().equals(osName)) valid = false; + if (osName != null && !OSUtils.TYPE.mojName.equals(osName)) valid = false; if (osVersion != null && !System.getProperty("os.version").matches(osVersion)) valid = false; if (actionType.equals("disallow")) valid = !valid; } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeFile.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeFile.java index 9a5b526..7397ceb 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeFile.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeFile.java @@ -1,87 +1,81 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; import java.util.List; -@GSerializable -public class CurseforgeFile { - public Integer id; - public Integer gameId; - public Integer modId; - public Boolean isAvailable; - public String displayName; - public String fileName; - /* Possible values: - 1=Release - 2=Beta - 3=Alpha*/ - public Integer releaseType; - /* Possible values: - 1=Processing - 2=ChangesRequired - 3=UnderReview - 4=Approved - 5=Rejected - 6=MalwareDetected - 7=Deleted - 8=Archived - 9=Testing - 10=Released - 11=ReadyForReview - 12=Deprecated - 13=Baking - 14=AwaitingPublishing - 15=FailedPublishing*/ - public Integer fileStatus; - public List hashes; - public Date fileDate; - public Integer fileLength; - public Long downloadCount; - public String downloadUrl; - public List gameVersions; - public List sortableGameVersions; - public List dependencies; - public Integer alternateFileId; - public Boolean isServerPack; - public Long fileFingerprint; // murmur5 hash - public List modules; - - @GSerializable - public static class Hash { - public String value; +@GSerializable(configure = GsonPreset.Api.class) +public record CurseforgeFile( + int id, + int gameId, + int modId, + boolean isAvailable, + String displayName, + String fileName, /* Possible values: - 1=Sha1 - 2=Md5*/ - public Integer algo; - } - - @GSerializable - public static class GameVersion { - public String gameVersionName; - public String gameVersionPadded; - public String gameVersion; - public Date gameVersionReleaseDate; - public Integer gameVersionTypeId; - } - - @GSerializable - public static class Dependency { - public Integer modId; + 1=Release + 2=Beta + 3=Alpha*/ + int releaseType, /* Possible values: - 1=EmbeddedLibrary - 2=OptionalDependency - 3=RequiredDependency - 4=Tool - 5=Incompatible - 6=Include*/ - public Integer relationType; + 1=Processing + 2=ChangesRequired + 3=UnderReview + 4=Approved + 5=Rejected + 6=MalwareDetected + 7=Deleted + 8=Archived + 9=Testing + 10=Released + 11=ReadyForReview + 12=Deprecated + 13=Baking + 14=AwaitingPublishing + 15=FailedPublishing*/ + int fileStatus, + List hashes, + Date fileDate, + int fileLength, + long downloadCount, + String downloadUrl, + List gameVersions, + List sortableGameVersions, + List dependencies, + int alternateFileId, + boolean isServerPack, + long fileFingerprint, // murmur5 hash + List modules +) { + /* Possible algorithms: + 1=Sha1 + 2=Md5*/ + @GSerializable(configure = GsonPreset.Api.class) + public record Hash(String value, int algo) { } - @GSerializable - public static class Module { - public String name; - public Long fingerprint; + @GSerializable(configure = GsonPreset.Api.class) + public record GameVersion(String gameVersionName, + String gameVersionPadded, + String gameVersion, + Date gameVersionReleaseDate, + int gameVersionTypeId) { + } + + /* Possible relationship types: + 1=EmbeddedLibrary + 2=OptionalDependency + 3=RequiredDependency + 4=Tool + 5=Incompatible + 6=Include*/ + @GSerializable(configure = GsonPreset.Api.class) + public record Dependency(int modId, int relationType) { + } + + @GSerializable(configure = GsonPreset.Api.class) + public record Module(String name, long fingerprint) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeMod.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeMod.java index d1433cc..ff083f5 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeMod.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeMod.java @@ -1,105 +1,95 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; import java.util.List; -@GSerializable -public class CurseforgeMod { - public Integer id; - public Integer gameId; - public String name; - public String slug; - public Links links; - public String summary; - /* Possible values: - 1=New - 2=ChangesRequired - 3=UnderSoftReview - 4=Approved - 5=Rejected - 6=ChangesMade - 7=Inactive - 8=Abandoned - 9=Deleted - 10=UnderReview*/ - public Integer status; - public Long downloadCount; - public Boolean isFeatured; - public Integer primaryCategoryId; - public List categories; - public Integer classId; - public List authors; - public Logo logo; - public List screenshots; - public Integer mainFileId; - public List latestFiles; - public List latestFilesIndexes; - public Date dateCreated; - public Date dateModified; - public Date dateReleased; - public Boolean allowModDistribution; - public Integer gamePopularityRank; - public Boolean isAvailable; - public Integer thumbsUpCount; - - @GSerializable - public static class Links { - public String websiteUrl; - public String wikiUrl; - public String issuesUrl; - public String sourcesUrl; +@GSerializable(configure = GsonPreset.Api.class) +public record CurseforgeMod( + int id, + int gameId, + String name, + String slug, + Links links, + String summary, // optional + /* Possible values: + 1=New + 2=ChangesRequired + 3=UnderSoftReview + 4=Approved + 5=Rejected + 6=ChangesMade + 7=Inactive + 8=Abandoned + 9=Deleted + 10=UnderReview*/ + int status, + long downloadCount, + boolean isFeatured, + int primaryCategoryId, + List categories, + int classId, + List authors, + Logo logo, + List screenshots, + int mainFileId, + List latestFiles, + List latestFilesIndexes, + Date dateCreated, + Date dateModified, + Date dateReleased, + boolean allowModDistribution, + int gamePopularityRank, + boolean isAvailable, + int thumbsUpCount +) { + @GSerializable(configure = GsonPreset.Api.class) + public record Links(String websiteUrl, String wikiUrl, String issuesUrl, String sourcesUrl) { } - @GSerializable - public static class Category { - public Integer id; - public Integer gameId; - public String name; - public String slug; - public String url; - public String iconUrl; - public Date dateModified; - public Boolean isClass; - public Integer classId; - public Integer primaryCategoryId; + @GSerializable(configure = GsonPreset.Api.class) + public record Category(int id, + int gameId, + String name, + String slug, + String url, + String iconUrl, + Date dateModified, + boolean isClass, + int classId, + int primaryCategoryId) { } - @GSerializable - public static class Author { - public Integer id; - public String name; - public String url; + @GSerializable(configure = GsonPreset.Api.class) + public record Author(int id, String name, String url) { } - @GSerializable - public static class Logo { - public Integer id; - public Integer modId; - public String title; - public String description; - public String thumbnailUrl; - public String url; + @GSerializable(configure = GsonPreset.Api.class) + public record Logo(int id, + int modId, + String title, + String description, + String thumbnailUrl, + String url) { } - @GSerializable - public static class Screenshot { - public Integer id; - public Integer modId; - public String title; - public String description; - public String thumbnailUrl; - public String url; + @GSerializable(configure = GsonPreset.Api.class) + public record Screenshot(int id, + int modId, + String title, + String description, + String thumbnailUrl, + String url) { } - @GSerializable - public static class LatestFileIndex { - public String gameVersion; - public Integer fileId; - public String filename; - public Integer releaseType; - public Integer gameVersionTypeId; - public Integer modLoader; + @GSerializable(configure = GsonPreset.Api.class) + public record LatestFileIndex(String gameVersion, + int fileId, + String filename, + int releaseType, + int gameVersionTypeId, + Integer modLoader) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeModpackManifest.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeModpackManifest.java index d2d81e4..9c7fa6e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeModpackManifest.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/CurseforgeModpackManifest.java @@ -1,36 +1,27 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Set; -@GSerializable -public class CurseforgeModpackManifest { - public Minecraft minecraft; - public String manifestType; - public Integer manifestVersion; - public String name; - public String version; - public String author; - public Set files; - public String overrides; - - @GSerializable - public static class Minecraft { - public String version; - public Set modLoaders; - - @GSerializable - public static class ModLoader { - public String id; - public Boolean primary; +@GSerializable(configure = GsonPreset.Api.class) +public record CurseforgeModpackManifest(Minecraft minecraft, + String manifestType, + int manifestVersion, + String name, + String version, + String author, + Set files, + String overrides) { + @GSerializable(configure = GsonPreset.Api.class) + public record Minecraft(String version, Set modLoaders) { + @GSerializable(configure = GsonPreset.Api.class) + public record ModLoader(String id, boolean primary) { } } - @GSerializable - public static class File { - public Integer projectID; - public Integer fileID; - public Boolean required; + @GSerializable(configure = GsonPreset.Api.class) + public record File(int projectID, int fileID, boolean required) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/FingerprintMatchesResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/FingerprintMatchesResponse.java index 364acaa..18837f3 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/FingerprintMatchesResponse.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/FingerprintMatchesResponse.java @@ -1,28 +1,22 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge.response; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeFile; import java.util.List; -@GSerializable -public class FingerprintMatchesResponse { - public Result data; - - @GSerializable - public static class Result { - public Boolean isCacheBuilt; - public List exactMatches; - public List exactFingerprints; - public List partialMatches; - public List installedFingerprints; - public List unmatchedFingerprints; - - @GSerializable - public static class Match { - public Integer id; - public CurseforgeFile file; - public List latestFiles; +@GSerializable(configure = GsonPreset.Api.class) +public record FingerprintMatchesResponse(Result data) { + @GSerializable(configure = GsonPreset.Api.class) + public record Result(boolean isCacheBuilt, + List exactMatches, + List exactFingerprints, + List partialMatches, + List installedFingerprints, + List unmatchedFingerprints) { + @GSerializable(configure = GsonPreset.Api.class) + public record Match(int id, CurseforgeFile file, List latestFiles) { } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModFileResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModFileResponse.java index d22faf7..3a326e5 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModFileResponse.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModFileResponse.java @@ -1,9 +1,9 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge.response; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeFile; -@GSerializable -public class GetModFileResponse { - public CurseforgeFile data; +@GSerializable(configure = GsonPreset.Api.class) +public record GetModFileResponse(CurseforgeFile data) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModResponse.java index 3067556..a615778 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModResponse.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/GetModResponse.java @@ -1,9 +1,9 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge.response; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeMod; -@GSerializable -public class GetModResponse { - public CurseforgeMod data; +@GSerializable(configure = GsonPreset.Api.class) +public record GetModResponse(CurseforgeMod data) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/SearchResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/SearchResponse.java index e51fe6c..c7a6505 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/SearchResponse.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/curseforge/response/SearchResponse.java @@ -1,20 +1,14 @@ package io.gitlab.jfronny.inceptum.launcher.model.curseforge.response; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeMod; import java.util.List; -@GSerializable -public class SearchResponse { - public List data; - public Pagination pagination; - - @GSerializable - public static class Pagination { - public Integer index; - public Integer pageSite; - public Integer resultCount; - public Integer totalCount; +@GSerializable(configure = GsonPreset.Api.class) +public record SearchResponse(List data, Pagination pagination) { + @GSerializable(configure = GsonPreset.Api.class) + public record Pagination(int index, int pageSite, int resultCount, int totalCount) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricLoaderVersion.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricLoaderVersion.java index 5bcff6e..0675527 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricLoaderVersion.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricLoaderVersion.java @@ -1,12 +1,8 @@ package io.gitlab.jfronny.inceptum.launcher.model.fabric; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -@GSerializable -public class FabricLoaderVersion { - public String separator; - public Integer build; - public String maven; - public String version; - public Boolean stable; +@GSerializable(configure = GsonPreset.Api.class) +public record FabricLoaderVersion(String separator, int build, String maven, String version, boolean stable) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricModJson.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricModJson.java index 3ab26fc..96e0fc0 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricModJson.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricModJson.java @@ -1,11 +1,8 @@ package io.gitlab.jfronny.inceptum.launcher.model.fabric; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -@GSerializable -public class FabricModJson { - public String id; - public String name; - public String description; - public String version; +@GSerializable(configure = GsonPreset.Api.class) +public record FabricModJson(String id, String name, String description, String version) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricVersionLoaderInfo.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricVersionLoaderInfo.java index be37c88..06f952e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricVersionLoaderInfo.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/FabricVersionLoaderInfo.java @@ -1,41 +1,30 @@ package io.gitlab.jfronny.inceptum.launcher.model.fabric; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public class FabricVersionLoaderInfo { public FabricLoaderVersion loader; public IntermediaryVersion intermediary; - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public static class WithMeta extends FabricVersionLoaderInfo { public LauncherMeta launcherMeta; - @GSerializable - public static class LauncherMeta { - public int version; - public Libraries libraries; - public MainClass mainClass; - - @GSerializable - public static class Libraries { - public List client; - public List common; - public List server; - - @GSerializable - public static class Library { - public String name; - public String url; + @GSerializable(configure = GsonPreset.Api.class) + public record LauncherMeta(int version, Libraries libraries, MainClass mainClass) { + @GSerializable(configure = GsonPreset.Api.class) + public record Libraries(List client, List common, List server) { + @GSerializable(configure = GsonPreset.Api.class) + public record Library(String name, String url) { } } - @GSerializable - public static class MainClass { - public String client; - public String server; + @GSerializable(configure = GsonPreset.Api.class) + public record MainClass(String client, String server) { } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/IntermediaryVersion.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/IntermediaryVersion.java index b89808f..6c65629 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/IntermediaryVersion.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/fabric/IntermediaryVersion.java @@ -1,10 +1,8 @@ package io.gitlab.jfronny.inceptum.launcher.model.fabric; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -@GSerializable -public class IntermediaryVersion { - public String maven; - public String version; - public boolean stable; +@GSerializable(configure = GsonPreset.Api.class) +public record IntermediaryVersion(String maven, String version, boolean stable) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ArtifactInfo.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ArtifactInfo.java index 5f7fa11..d8d955a 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ArtifactInfo.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ArtifactInfo.java @@ -2,18 +2,8 @@ package io.gitlab.jfronny.inceptum.launcher.model.inceptum; import io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionInfo; -public class ArtifactInfo { - public final String path; - public final String sha1; - public final int size; - public final String url; - public final boolean isNative; - +public record ArtifactInfo(String path, String sha1, int size, String url, boolean isNative) { public ArtifactInfo(VersionInfo.Library.Downloads.Artifact artifact, boolean isNative) { - path = artifact.path; - sha1 = artifact.sha1; - size = artifact.size; - url = artifact.url; - this.isNative = isNative; + this(artifact.path, artifact.sha1, artifact.size, artifact.url, isNative); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/InstanceMeta.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/InstanceMeta.java index 3e3e0a8..76c0e69 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/InstanceMeta.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/InstanceMeta.java @@ -1,6 +1,7 @@ package io.gitlab.jfronny.inceptum.launcher.model.inceptum; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; import java.util.Objects; @@ -14,42 +15,37 @@ public class InstanceMeta { public Long lastLaunched; public Arguments arguments; - @GSerializable - public static class Arguments { - public List jvm; - public List client; - public List server; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Arguments arguments = (Arguments) o; - return Objects.equals(jvm, arguments.jvm) - && Objects.equals(client, arguments.client) - && Objects.equals(server, arguments.server); - } - - @Override - public int hashCode() { - return Objects.hash(jvm, client, server); - } - } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - InstanceMeta that = (InstanceMeta) o; - return Objects.equals(version, that.version) - && Objects.equals(java, that.java) - && Objects.equals(minMem, that.minMem) - && Objects.equals(maxMem, that.maxMem) - && Objects.equals(arguments, that.arguments); + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (InstanceMeta) obj; + return Objects.equals(this.version, that.version) && + Objects.equals(this.java, that.java) && + Objects.equals(this.minMem, that.minMem) && + Objects.equals(this.maxMem, that.maxMem) && + Objects.equals(this.lastLaunched, that.lastLaunched) && + Objects.equals(this.arguments, that.arguments); } @Override public int hashCode() { - return Objects.hash(version, java, minMem, maxMem, arguments); + return Objects.hash(version, java, minMem, maxMem, lastLaunched, arguments); + } + + + @GSerializable(configure = GsonPreset.Config.class) + public record Arguments(List jvm, List client, List server) { + public Arguments withJvm(List jvm) { + return new Arguments(jvm, client, server); + } + + public Arguments withClient(List client) { + return new Arguments(jvm, client, server); + } + + public Arguments withServer(List server) { + return new Arguments(jvm, client, server); + } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta$Sources.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta$Sources.java index 137c161..e0cc080 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta$Sources.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta$Sources.java @@ -1,6 +1,7 @@ package io.gitlab.jfronny.inceptum.launcher.model.inceptum; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.gson.ModMetaSourcesAdapter; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; import org.jetbrains.annotations.NotNull; @@ -8,7 +9,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -@GSerializable(with = ModMetaSourcesAdapter.class) +@GSerializable(with = ModMetaSourcesAdapter.class, configure = GsonPreset.Config.class) public class ModMeta$Sources implements Map> { private Map> delegate = new LinkedHashMap<>(); @@ -34,7 +35,7 @@ public class ModMeta$Sources implements Map> { @Override public Optional get(Object o) { - return delegate.get(o); + return delegate[o]; } @Nullable diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java index a2634af..5905767 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/inceptum/ModMeta.java @@ -3,6 +3,7 @@ package io.gitlab.jfronny.inceptum.launcher.model.inceptum; import io.gitlab.jfronny.commons.HashUtils; import io.gitlab.jfronny.gson.compile.annotations.GPrefer; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.common.Utils; import io.gitlab.jfronny.inceptum.launcher.api.CurseforgeApi; import io.gitlab.jfronny.inceptum.launcher.api.ModrinthApi; @@ -17,17 +18,52 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -@GSerializable -public class ModMeta { - public ModMeta$Sources sources; //key: source, value: update - public String sha1; - public Long murmur2; - public List dependents; // by file name - public List dependencies; // by file name - public boolean explicit = true; - +@GSerializable(configure = GsonPreset.Config.class) +public record ModMeta( + ModMeta$Sources sources, //key: source, value: update + String sha1, + Long murmur2, + List dependents, // by file name + List dependencies, // by file name + boolean explicit +) { @GPrefer - public ModMeta() { + public ModMeta {} + + public static ModMeta of(Path mod) { + String sha1 = null; + Long murmur2 = null; + if (!Files.isDirectory(mod)) { + try { + byte[] data = Files.readAllBytes(mod); + sha1 = HashUtils.sha1(data); + murmur2 = HashUtils.murmur2(data); + } catch (IOException e) { + Utils.LOGGER.error("Could not read file hash", e); + } + } + return new ModMeta( + new ModMeta$Sources(), + sha1, + murmur2, + new ArrayList<>(), + new ArrayList<>(), + true + ); + } + + public static ModMeta of(String sha1, Long murmur2, @Nullable ModSource knownSource, String gameVersion) { + ModMeta res = new ModMeta( + new ModMeta$Sources(), + sha1, + murmur2, + new ArrayList<>(), + new ArrayList<>(), + true + ); + if (knownSource != null) res.addSource(knownSource, gameVersion); + res.initialize(gameVersion); + return res; } public boolean initialize(String gameVersion) { @@ -50,7 +86,8 @@ public class ModMeta { if (!curseforge) { try { FingerprintMatchesResponse.Result cf = CurseforgeApi.checkFingerprint(murmur2); - if (!cf.exactMatches.isEmpty()) { + if (!cf.exactMatches.isEmpty) { + // TODO use array access once fixed FingerprintMatchesResponse.Result.Match f = cf.exactMatches.get(0); addSource(new CurseforgeModSource(f.id, f.file.id), gameVersion); changed = true; @@ -62,40 +99,12 @@ public class ModMeta { return changed; } - public static ModMeta of(Path mod) { - ModMeta res = new ModMeta(); - res.sources = new ModMeta$Sources(); - if (!Files.isDirectory(mod)) { - try { - byte[] data = Files.readAllBytes(mod); - res.sha1 = HashUtils.sha1(data); - res.murmur2 = HashUtils.murmur2(data); - } catch (IOException e) { - Utils.LOGGER.error("Could not read file hash", e); - } - } - res.dependents = new ArrayList<>(); - res.dependencies = new ArrayList<>(); - return res; - } - - public static ModMeta of(String sha1, Long murmur2, @Nullable ModSource knownSource, String gameVersion) { - ModMeta res = new ModMeta(); - res.sources = new ModMeta$Sources(); - res.sha1 = sha1; - res.murmur2 = murmur2; - res.dependents = new ArrayList<>(); - res.dependencies = new ArrayList<>(); - if (knownSource != null) res.addSource(knownSource, gameVersion); - res.initialize(gameVersion); - return res; - } - public void addSource(ModSource source, String gameVersion) { try { + // TODO use array access once fixed sources.put(source, source.getUpdate(gameVersion)); } catch (IOException e) { - Utils.LOGGER.error("Could not check " + source.getName() + " for updates", e); + Utils.LOGGER.error("Could not check " + source.name + " for updates", e); } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Entitlements.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Entitlements.java index 3947acb..91aa541 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Entitlements.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Entitlements.java @@ -1,17 +1,13 @@ package io.gitlab.jfronny.inceptum.launcher.model.microsoft; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; -@GSerializable -public class Entitlements { - public List items; - public String signature; - - @GSerializable - public static class StoreItem { - public String name; - public String signature; +@GSerializable(configure = GsonPreset.Api.class) +public record Entitlements(List items, String signature) { + @GSerializable(configure = GsonPreset.Api.class) + public record StoreItem(String name, String signature) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/OauthTokenResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/OauthTokenResponse.java deleted file mode 100644 index 6929ac2..0000000 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/OauthTokenResponse.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.gitlab.jfronny.inceptum.launcher.model.microsoft; - -import io.gitlab.jfronny.gson.annotations.SerializedName; -import io.gitlab.jfronny.gson.compile.annotations.GPrefer; -import io.gitlab.jfronny.gson.compile.annotations.GSerializable; - -import java.util.Date; - -@GSerializable -public class OauthTokenResponse { - @SerializedName("token_type") - public String tokenType; - - @SerializedName("expires_in") - public Integer expiresIn; - - @SerializedName("expires_at") - public Date expiresAt; - - public String scope; - - @SerializedName("access_token") - public String accessToken; - - @SerializedName("refresh_token") - public String refreshToken; - - @SerializedName("user_id") - public String userId; - - public String foci; - - @GPrefer - public OauthTokenResponse(String tokenType, Integer expiresIn, Date expiresAt, String scope, String accessToken, String refreshToken, String userId, String foci) { - this.tokenType = tokenType; - this.expiresIn = expiresIn; - this.expiresAt = expiresAt; - this.scope = scope; - this.accessToken = accessToken; - this.refreshToken = refreshToken; - this.userId = userId; - this.foci = foci; - if (this.expiresAt == null) { - this.expiresAt = new Date(); - this.expiresAt.setTime(this.expiresAt.getTime() + this.expiresIn * 1000); - } - } -} diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Profile.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Profile.java index 70ea8a1..0097fd1 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Profile.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/Profile.java @@ -1,27 +1,17 @@ package io.gitlab.jfronny.inceptum.launcher.model.microsoft; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; -@GSerializable -public class Profile { - public String id; - public String name; - public List skins; - public List capes; - - @GSerializable - public static class Skin { - public String id; - public String state; - public String url; - public String variant; - public String alias; +@GSerializable(configure = GsonPreset.Api.class) +public record Profile(String id, String name, List skins, List capes) { + @GSerializable(configure = GsonPreset.Api.class) + public record Skin(String id, String state, String url, String variant, String alias) { } - @GSerializable - public static class Cape { - public String id; + @GSerializable(configure = GsonPreset.Api.class) + public record Cape(String id) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/LoginRequest.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/LoginRequest.java new file mode 100644 index 0000000..90ca351 --- /dev/null +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/LoginRequest.java @@ -0,0 +1,8 @@ +package io.gitlab.jfronny.inceptum.launcher.model.microsoft.request; + +import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; + +@GSerializable(configure = GsonPreset.Api.class) +public record LoginRequest(String xtoken, String platform) { +} diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/XblTokenRequest.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/XblTokenRequest.java similarity index 73% rename from launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/XblTokenRequest.java rename to launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/XblTokenRequest.java index 531d8db..3f732bd 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/XblTokenRequest.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/XblTokenRequest.java @@ -1,13 +1,14 @@ -package io.gitlab.jfronny.inceptum.launcher.api.account.request; +package io.gitlab.jfronny.inceptum.launcher.model.microsoft.request; import io.gitlab.jfronny.gson.annotations.SerializedName; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public record XblTokenRequest(@SerializedName("Properties") Properties properties, @SerializedName("RelyingParty") String relyingParty, @SerializedName("TokenType") String tokenType) { - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public record Properties(@SerializedName("AuthMethod") String authMethod, @SerializedName("SiteName") String siteName, @SerializedName("RpsTicket") String rpsTicket) { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/XstsTokenRequest.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/XstsTokenRequest.java similarity index 70% rename from launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/XstsTokenRequest.java rename to launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/XstsTokenRequest.java index 5d10895..798ee0f 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/api/account/request/XstsTokenRequest.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/request/XstsTokenRequest.java @@ -1,15 +1,16 @@ -package io.gitlab.jfronny.inceptum.launcher.api.account.request; +package io.gitlab.jfronny.inceptum.launcher.model.microsoft.request; import io.gitlab.jfronny.gson.annotations.SerializedName; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public record XstsTokenRequest(@SerializedName("Properties") Properties properties, @SerializedName("RelyingParty") String relyingParty, @SerializedName("TokenType") String tokenType) { - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public record Properties(@SerializedName("SandboxId") String sandboxId, @SerializedName("UserTokens") List userTokens) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/LoginResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/LoginResponse.java similarity index 70% rename from launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/LoginResponse.java rename to launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/LoginResponse.java index a25738c..3a0a549 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/LoginResponse.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/LoginResponse.java @@ -1,10 +1,10 @@ -package io.gitlab.jfronny.inceptum.launcher.model.microsoft; +package io.gitlab.jfronny.inceptum.launcher.model.microsoft.response; import io.gitlab.jfronny.gson.annotations.SerializedName; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -//TODO test SerializedName -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public record LoginResponse(String username, @SerializedName("access_token") String accessToken, @SerializedName("token_type") String tokenType, diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/OauthTokenResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/OauthTokenResponse.java new file mode 100644 index 0000000..89e51b3 --- /dev/null +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/OauthTokenResponse.java @@ -0,0 +1,39 @@ +package io.gitlab.jfronny.inceptum.launcher.model.microsoft.response; + +import io.gitlab.jfronny.gson.annotations.SerializedName; +import io.gitlab.jfronny.gson.compile.annotations.GPrefer; +import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; + +import java.util.Date; + +@GSerializable(configure = GsonPreset.Api.class) +public record OauthTokenResponse( + @SerializedName("token_type") String tokenType, + @SerializedName("expires_in") int expiresIn, + @SerializedName("expires_at") Date expiresAt, + String scope, + @SerializedName("access_token") String accessToken, + @SerializedName("refresh_token") String refreshToken, + @SerializedName("user_id") String userId, + String foci) { + @GPrefer + public OauthTokenResponse(String tokenType, int expiresIn, Date expiresAt, String scope, String accessToken, String refreshToken, String userId, String foci) { + this.tokenType = tokenType; + this.expiresIn = expiresIn; + this.expiresAt = getExpiresAt(expiresAt, expiresIn); + this.scope = scope; + this.accessToken = accessToken; + this.refreshToken = refreshToken; + this.userId = userId; + this.foci = foci; + } + + private static Date getExpiresAt(Date expiresAt, long expiresIn) { + if (expiresAt == null) { + expiresAt = new Date(); + expiresAt.time += expiresIn * 1000; + } + return expiresAt; + } +} diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/XboxLiveAuthResponse.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/XboxLiveAuthResponse.java similarity index 68% rename from launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/XboxLiveAuthResponse.java rename to launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/XboxLiveAuthResponse.java index 211657c..3fcc04e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/XboxLiveAuthResponse.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/microsoft/response/XboxLiveAuthResponse.java @@ -1,20 +1,20 @@ -package io.gitlab.jfronny.inceptum.launcher.model.microsoft; +package io.gitlab.jfronny.inceptum.launcher.model.microsoft.response; import io.gitlab.jfronny.gson.annotations.SerializedName; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; import java.util.List; -//TODO test SerializedName -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public record XboxLiveAuthResponse(@SerializedName("IssueInstant") Date issueInstant, @SerializedName("NotAfter") Date notAfter, @SerializedName("Token") String token, @SerializedName("DisplayClaims") DisplayClaims displayClaims) { - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public record DisplayClaims(List xui) { - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public record XUIClaim(String uhs) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthHashes.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthHashes.java index edc1d53..db8cd08 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthHashes.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthHashes.java @@ -1,9 +1,8 @@ package io.gitlab.jfronny.inceptum.launcher.model.modrinth; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -@GSerializable -public class ModrinthHashes { //TODO ensure this can parse with additional hashes - public String sha1; - public String sha512; +@GSerializable(configure = GsonPreset.Api.class) +public record ModrinthHashes(String sha1, String sha512) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthModpackManifest.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthModpackManifest.java index 8428a8d..e104025 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthModpackManifest.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthModpackManifest.java @@ -2,39 +2,33 @@ package io.gitlab.jfronny.inceptum.launcher.model.modrinth; import io.gitlab.jfronny.gson.annotations.SerializedName; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; +import org.jetbrains.annotations.Nullable; import java.util.List; -@GSerializable -public class ModrinthModpackManifest { - public Integer formatVersion; // 1 - public String game; // "minecraft" - public String versionId; - public String name; - public String summary; // optional - public List files; - public Dependencies dependencies; - - @GSerializable - public static class File { - public String path; - public ModrinthHashes hashes; - public Env env; // optional - public List downloads; - public Long fileSize; - - @GSerializable - public static class Env { - public ModrinthDependencyType client; - public ModrinthDependencyType server; +@GSerializable(configure = GsonPreset.Api.class) +public record ModrinthModpackManifest( + int formatVersion, // 1 + String game, // "minecraft" + String versionId, + String name, + String summary, + List files, + Dependencies dependencies +) { + @GSerializable(configure = GsonPreset.Api.class) + public record File(String path, ModrinthHashes hashes, @Nullable Env env, List downloads, long fileSize) { + @GSerializable(configure = GsonPreset.Api.class) + public record Env(ModrinthDependencyType client, ModrinthDependencyType server) { } } - @GSerializable - public static class Dependencies { // All are nullable - public String minecraft; - public String forge; - @SerializedName("fabric-loader") public String fabricLoader; - @SerializedName("quilt-loader") public String quiltLoader; + // All are nullable + @GSerializable(configure = GsonPreset.Api.class) + public record Dependencies(String minecraft, + String forge, + @SerializedName("fabric-loader") String fabricLoader, + @SerializedName("quilt-loader") String quiltLoader) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthProject.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthProject.java index 99059a4..777d4ba 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthProject.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthProject.java @@ -1,58 +1,48 @@ package io.gitlab.jfronny.inceptum.launcher.model.modrinth; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; import java.util.List; -@GSerializable -public class ModrinthProject { - public String id; - public String slug; - public ModrinthProjectType project_type; - public String team; - public String title; - public String description; - public String body; - public String body_url; - public Date publish; - public Date updated; - public String status; - public License license; - public ModrinthDependencyType client_side; - public ModrinthDependencyType server_side; - public Long downloads; - public Long follows; - public List categories; - public List versions; - public String icon_url; - public String issues_url; - public String source_url; - public String wiki_url; - public String discord_url; - public List donation_urls; - public List gallery; - - @GSerializable - public static class DonationUrl { - public String id; - public String platform; - public String url; +@GSerializable(configure = GsonPreset.Api.class) +public record ModrinthProject( + String id, + String slug, + ModrinthProjectType project_type, + String team, + String title, + String description, + String body, + String body_url, + Date publish, + Date updated, + String status, + License license, + ModrinthDependencyType client_side, + ModrinthDependencyType server_side, + long downloads, + long follows, + List categories, + List versions, + String icon_url, + String issues_url, + String source_url, + String wiki_url, + String discord_url, + List donation_urls, + List gallery +) { + @GSerializable(configure = GsonPreset.Api.class) + public record DonationUrl(String id, String platform, String url) { } - @GSerializable - public static class License { - public String id; - public String name; - public String url; + @GSerializable(configure = GsonPreset.Api.class) + public record License(String id, String name, String url) { } - @GSerializable - public static class GalleryItem { - public String url; - public Boolean featured; - public String title; - public String description; - public Date created; + @GSerializable(configure = GsonPreset.Api.class) + public record GalleryItem(String url, boolean featured, String title, String description, Date created) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthSearchResult.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthSearchResult.java index 6efec87..fcc9d7f 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthSearchResult.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthSearchResult.java @@ -1,36 +1,33 @@ package io.gitlab.jfronny.inceptum.launcher.model.modrinth; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; import java.util.List; -@GSerializable -public class ModrinthSearchResult { - public List hits; - public Integer offset; - public Integer limit; - public Integer total_hits; - - @GSerializable - public static class ModResult { - public String project_id; - public ModrinthProjectType project_type; - public String slug; - public String author; - public String title; - public String description; - public List categories; - public List versions; - public Long downloads; - public Long follows; - public String icon_url; - public Date date_created; - public Date date_modified; - public String latest_version; - public String license; - public String client_side; - public String server_side; - public List gallery; +@GSerializable(configure = GsonPreset.Api.class) +public record ModrinthSearchResult(List hits, int offset, int limit, int total_hits) { + @GSerializable(configure = GsonPreset.Api.class) + public record ModResult( + String project_id, + ModrinthProjectType project_type, + String slug, + String author, + String title, + String description, + List categories, + List versions, + long downloads, + long follows, + String icon_url, + Date date_created, + Date date_modified, + String latest_version, + String license, + String client_side, + String server_side, + List gallery + ) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthVersion.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthVersion.java index c38b43f..54b2f86 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthVersion.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/modrinth/ModrinthVersion.java @@ -1,46 +1,39 @@ package io.gitlab.jfronny.inceptum.launcher.model.modrinth; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; import java.util.List; -@GSerializable -public class ModrinthVersion { - public String id; - public String project_id; - public String author_id; - public Boolean featured; - public String name; - public String version_number; - public String changelog; - public String changelog_url; - public Date date_published; - public Long downloads; - public VersionType version_type; - public List files; - public List dependencies; - public List game_versions; - public List loaders; - +@GSerializable(configure = GsonPreset.Api.class) +public record ModrinthVersion( + String id, + String project_id, + String author_id, + boolean featured, + String name, + String version_number, + String changelog, + String changelog_url, + Date date_published, + long downloads, + VersionType version_type, + List files, + List dependencies, + List game_versions, + List loaders +) { public enum VersionType { alpha, beta, release } - @GSerializable - public static class File { - public ModrinthHashes hashes; - public String url; - public String filename; - public Boolean primary; + @GSerializable(configure = GsonPreset.Api.class) + public record File(ModrinthHashes hashes, String url, String filename, boolean primary) { } - @GSerializable - public static class Dependency { - public String version_id; - public String project_id; - public DependencyType dependency_type; - + @GSerializable(configure = GsonPreset.Api.class) + public record Dependency(String version_id, String project_id, DependencyType dependency_type) { public enum DependencyType { required, optional, diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/AssetIndex.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/AssetIndex.java index 188412e..5575ab9 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/AssetIndex.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/AssetIndex.java @@ -1,16 +1,13 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Map; -@GSerializable -public class AssetIndex { - public Map objects; - - @GSerializable - public static class Asset { - public String hash; - public int size; +@GSerializable(configure = GsonPreset.Api.class) +public record AssetIndex(Map objects) { + @GSerializable(configure = GsonPreset.Api.class) + public record Asset(String hash, int size) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmFileInfo.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmFileInfo.java index 950e767..6dc8a37 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmFileInfo.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmFileInfo.java @@ -1,23 +1,16 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Map; -@GSerializable -public class JvmFileInfo { - public Map files; - - @GSerializable - public static class File { - public Downloads downloads; - public boolean executable; - public String type; - - @GSerializable - public static class Downloads { - public MojangFileDownload lzma; - public MojangFileDownload raw; +@GSerializable(configure = GsonPreset.Api.class) +public record JvmFileInfo(Map files) { + @GSerializable(configure = GsonPreset.Api.class) + public record File(Downloads downloads, boolean executable, String type) { + @GSerializable(configure = GsonPreset.Api.class) + public record Downloads(MojangFileDownload lzma, MojangFileDownload raw) { } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmInfo.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmInfo.java index be3f77e..2d9c716 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmInfo.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/JvmInfo.java @@ -2,34 +2,23 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.annotations.SerializedName; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; import java.util.Map; -@GSerializable -public class JvmInfo { - public Map> linux; - @SerializedName("mac-os") - public Map> macOs; - @SerializedName("windows-x64") - public Map> windowsX64; - - @GSerializable - public static class Jvm { - public Availability availability; - public MojangFileDownload manifest; - public Version version; - - @GSerializable - public static class Availability { - public int group; - public int progress; +@GSerializable(configure = GsonPreset.Api.class) +public record JvmInfo(Map> linux, + @SerializedName("mac-os") Map> macOs, + @SerializedName("windows-x64") Map> windowsX64) { + @GSerializable(configure = GsonPreset.Api.class) + public record Jvm(Availability availability, MojangFileDownload manifest, Version version) { + @GSerializable(configure = GsonPreset.Api.class) + public record Availability(int group, int progress) { } - @GSerializable - public static class Version { - public String name; - public String released; + @GSerializable(configure = GsonPreset.Api.class) + public record Version(String name, String released) { } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MinecraftArgument.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MinecraftArgument.java index 85eef3e..47e4c0c 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MinecraftArgument.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MinecraftArgument.java @@ -1,12 +1,13 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.gson.MinecraftArgumentAdapter; import java.util.LinkedHashSet; import java.util.Set; -@GSerializable(with = MinecraftArgumentAdapter.class) +@GSerializable(with = MinecraftArgumentAdapter.class, configure = GsonPreset.Api.class) public record MinecraftArgument(Set arg) implements Cloneable { @Override protected MinecraftArgument clone() { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MojangFileDownload.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MojangFileDownload.java index 17e2c01..1ce506d 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MojangFileDownload.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/MojangFileDownload.java @@ -1,8 +1,9 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public class MojangFileDownload implements Cloneable { public String sha1; public int size; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/Rules.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/Rules.java index d912d08..9bce278 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/Rules.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/Rules.java @@ -1,9 +1,10 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.launcher.gson.RulesAdapter; -@GSerializable(with = RulesAdapter.class) +@GSerializable(with = RulesAdapter.class, configure = GsonPreset.Api.class) public record Rules(boolean allow) implements Cloneable { @Override protected Rules clone() { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionInfo.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionInfo.java index b2a8f67..c9033b2 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionInfo.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionInfo.java @@ -1,11 +1,13 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; +import io.gitlab.jfronny.gson.compile.annotations.GPrefer; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.*; @SuppressWarnings("MethodDoesntCallSuperMethod") -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public class VersionInfo extends VersionsListInfo implements Cloneable { public Arguments arguments; public AssetIndex assetIndex; @@ -34,23 +36,18 @@ public class VersionInfo extends VersionsListInfo implements Cloneable { return clone; } - @GSerializable - public static class Arguments implements Cloneable { - public List game; - public List jvm; - + @GSerializable(configure = GsonPreset.Api.class) + public record Arguments(List game, List jvm) implements Cloneable { @Override public Arguments clone() { - Arguments clone = new Arguments(); - clone.game = new LinkedList<>(); + Arguments clone = new Arguments(new LinkedList<>(), new LinkedList<>()); if (game != null) game.forEach(argument -> clone.game.add(argument.clone())); - clone.jvm = new LinkedList<>(); if (jvm != null) jvm.forEach(argument -> clone.jvm.add(argument.clone())); return clone; } } - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public static class AssetIndex extends MojangFileDownload { public String id; public int totalSize; @@ -65,74 +62,67 @@ public class VersionInfo extends VersionsListInfo implements Cloneable { } } - @GSerializable - public static class Downloads implements Cloneable { - public MojangFileDownload client; - public MojangFileDownload client_mappings; - public MojangFileDownload server; - public MojangFileDownload server_mappings; - + @GSerializable(configure = GsonPreset.Api.class) + public record Downloads(MojangFileDownload client, + MojangFileDownload client_mappings, + MojangFileDownload server, + MojangFileDownload server_mappings) implements Cloneable { @Override public Downloads clone() { - Downloads clone = new Downloads(); - clone.client = client.clone(); - if (client_mappings != null) clone.client_mappings = client_mappings.clone(); - clone.server = server.clone(); - if (server_mappings != null) clone.server_mappings = server_mappings.clone(); - return clone; + return new Downloads( + client == null ? null : client.clone(), + client_mappings == null ? null : client_mappings.clone(), + server == null ? null : server.clone(), + server_mappings == null ? null : server_mappings.clone() + ); } } - @GSerializable - public static class JavaVersion implements Cloneable { - public String component; - public int majorVersion; - + @GSerializable(configure = GsonPreset.Api.class) + public record JavaVersion(String component, int majorVersion) implements Cloneable { @Override public JavaVersion clone() { - JavaVersion clone = new JavaVersion(); - clone.component = component; - clone.majorVersion = majorVersion; - return clone; + return new JavaVersion(component, majorVersion); } } - @GSerializable - public static class Library implements Cloneable { - public Downloads downloads; - public String name; - public Map natives; - public Rules rules; - + @GSerializable(configure = GsonPreset.Api.class) + public record Library(Downloads downloads, String name, Map natives, Rules rules) implements Cloneable { @Override public Library clone() { - Library clone = new Library(); - if (downloads != null) clone.downloads = downloads.clone(); - clone.name = name; - clone.natives = new LinkedHashMap<>(); + Library clone = new Library( + downloads == null ? null : downloads.clone(), + name, + new LinkedHashMap<>(), + rules == null ? null : rules.clone() + ); if (natives != null) clone.natives.putAll(natives); - if (rules != null) clone.rules = rules.clone(); return clone; } - @GSerializable - public static class Downloads implements Cloneable { - public Artifact artifact; - public Map classifiers; - + @GSerializable(configure = GsonPreset.Api.class) + public record Downloads(Artifact artifact, Map classifiers) implements Cloneable { @Override public Downloads clone() { - Downloads clone = new Downloads(); - if (artifact != null) clone.artifact = artifact.clone(); - clone.classifiers = new LinkedHashMap<>(); + Downloads clone = new Downloads(artifact == null ? null : artifact.clone(), new LinkedHashMap<>()); if (classifiers != null) classifiers.forEach((key, value) -> clone.classifiers.put(key, value.clone())); return clone; } - @GSerializable + @GSerializable(configure = GsonPreset.Api.class) public static class Artifact extends MojangFileDownload implements Cloneable { public String path; + @GPrefer + public Artifact() {} + + public Artifact(String path, int size, String sha1, String url) { + this.path = path; + this.size = size; + this.sha1 = sha1; + this.url = url; + } + @Override public Artifact clone() { Artifact clone = new Artifact(); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsList.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsList.java index 0f35419..0d38ffe 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsList.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsList.java @@ -1,17 +1,13 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; -@GSerializable -public class VersionsList { - public Latest latest; - public List versions; - - @GSerializable - public static class Latest { - public String release; - public String snapshot; +@GSerializable(configure = GsonPreset.Api.class) +public record VersionsList(Latest latest, List versions) { + @GSerializable(configure = GsonPreset.Api.class) + public record Latest(String release, String snapshot) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsListInfo.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsListInfo.java index 3cce42e..9ff2cd9 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsListInfo.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/mojang/VersionsListInfo.java @@ -1,10 +1,11 @@ package io.gitlab.jfronny.inceptum.launcher.model.mojang; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.Date; -@GSerializable +@GSerializable(configure = GsonPreset.Api.class) public class VersionsListInfo { public String id; public String type; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/multimc/MMCPackMeta.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/multimc/MMCPackMeta.java index 26ac56e..d718aa4 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/multimc/MMCPackMeta.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/model/multimc/MMCPackMeta.java @@ -1,19 +1,13 @@ package io.gitlab.jfronny.inceptum.launcher.model.multimc; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import java.util.List; -@GSerializable -public class MMCPackMeta { - public List components; - public Integer formatVersion; - - @GSerializable - public static class Component { - public Boolean dependencyOnly; - public Boolean important; - public String uid; - public String version; +@GSerializable(configure = GsonPreset.Api.class) +public record MMCPackMeta(List components, int formatVersion) { + @GSerializable(configure = GsonPreset.Api.class) + public record Component(boolean dependencyOnly, boolean important, String uid, String version) { } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CleanupFileVisitor.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CleanupFileVisitor.java index 9a51530..5e61fbd 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CleanupFileVisitor.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CleanupFileVisitor.java @@ -9,7 +9,7 @@ import java.nio.file.attribute.BasicFileAttributes; public class CleanupFileVisitor implements FileVisitor { @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 { @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; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java index 40462a7..8b6637b 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/CurseForgeExporter.java @@ -12,7 +12,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.LinkedHashSet; -import java.util.Set; public class CurseForgeExporter extends Exporter { private static final String OVERRIDES_DIR_DEFAULT = "overrides"; @@ -23,21 +22,24 @@ public class CurseForgeExporter extends Exporter { @Override protected CurseforgeModpackManifest generateManifests(Path root, Instance instance, String version) throws IOException { - CurseforgeModpackManifest manifest = new CurseforgeModpackManifest(); - manifest.minecraft = new CurseforgeModpackManifest.Minecraft(); - manifest.minecraft.version = instance.getGameVersion(); - manifest.manifestType = "minecraftModpack"; - manifest.manifestVersion = 1; - manifest.name = instance.getName(); - manifest.version = version; - manifest.author = InceptumConfig.authorName; - manifest.overrides = OVERRIDES_DIR_DEFAULT; - manifest.minecraft.modLoaders = new LinkedHashSet<>(); - if (instance.isFabric()) { - CurseforgeModpackManifest.Minecraft.ModLoader loader = new CurseforgeModpackManifest.Minecraft.ModLoader(); - loader.id = "fabric-" + instance.getLoaderVersion(); - loader.primary = true; - manifest.minecraft.modLoaders.add(loader); + CurseforgeModpackManifest manifest = new CurseforgeModpackManifest( + new CurseforgeModpackManifest.Minecraft( + instance.gameVersion, + new LinkedHashSet<>() + ), + "minecraftModpack", + 1, + instance.name, + version, + InceptumConfig.authorName, + null, // files + OVERRIDES_DIR_DEFAULT + ); + if (instance.isFabric) { + manifest.minecraft.modLoaders.add(new CurseforgeModpackManifest.Minecraft.ModLoader( + "fabric-" + instance.loaderVersion, + true + )); } GC_CurseforgeModpackManifest.write(root.resolve("manifest.json"), manifest); return manifest; @@ -46,9 +48,8 @@ public class CurseForgeExporter extends Exporter { @Override protected void addMods(Path root, Instance instance, Iterable mods, CurseforgeModpackManifest manifest, Path modsOverrides) throws IOException { modsLoop: for (Mod mod : mods) { - if (mod.needsInject()) { - Set sources = mod.getMetadata().sources.keySet(); - for (ModSource source : sources) { + if (mod.needsInject) { + for (ModSource source : mod.metadata.sources.keySet()) { if (source instanceof CurseforgeModSource cms) { manifest.files.add(cms.toManifest()); continue modsLoop; @@ -57,7 +58,7 @@ public class CurseForgeExporter extends Exporter { } // Not available on CF Files.createDirectories(modsOverrides); - Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString())); + Files.copy(mod.jarPath, modsOverrides.resolve(mod.jarPath.fileName.toString())); } GC_CurseforgeModpackManifest.write(root.resolve("manifest.json"), manifest); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java index 54bae53..8b22493 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/Exporter.java @@ -1,6 +1,5 @@ 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; @@ -9,7 +8,9 @@ import io.gitlab.jfronny.inceptum.launcher.util.gitignore.IgnoringWalk; import java.io.IOException; import java.net.URISyntaxException; -import java.nio.file.*; +import java.nio.file.FileSystem; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Objects; public abstract class Exporter { @@ -34,17 +35,17 @@ public abstract class Exporter { Path overrides = fs.getPath(overridesDirName); state.incrementStep("Preparing manifests"); Manifest manifest = generateManifests(root, instance, version); - if (instance.isFabric()) { + if (instance.isFabric) { state.incrementStep("Adding mods"); - addMods(root, instance, new StreamIterable<>(instance.getMods().stream().filter(mod -> { - if (!mod.isEnabled()) return false; - state.updateStep(mod.getName()); + addMods(root, instance, instance.mods.stream().filter(mod -> { + if (!mod.isEnabled) return false; + state.updateStep(mod.name); return true; - })), manifest, overrides.resolve("mods")); + }), manifest, overrides.resolve("mods")); } state.incrementStep("Adding files"); - filesLoop: for (Path path : new StreamIterable<>(IgnoringWalk.walk(instance.path()))) { - Path relativePath = instance.path().relativize(path).normalize(); + filesLoop: for (Path path : 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; @@ -52,7 +53,7 @@ public abstract class Exporter { target = target.resolve(segment.toString()); } state.updateStep(relativePath.toString()); - Files.createDirectories(target.getParent()); + Files.createDirectories(target.parent); Files.copy(path, target); } state.incrementStep("Cleaning up"); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java index 6cedbd0..3ccf903 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/ModrinthExporter.java @@ -20,17 +20,20 @@ public class ModrinthExporter extends Exporter { @Override protected ModrinthModpackManifest generateManifests(Path root, Instance instance, String version) throws IOException { - ModrinthModpackManifest manifest = new ModrinthModpackManifest(); - manifest.formatVersion = 1; - manifest.game = "minecraft"; - manifest.versionId = version; - manifest.name = instance.getName(); - manifest.files = new ArrayList<>(); - manifest.dependencies = new ModrinthModpackManifest.Dependencies(); - manifest.dependencies.minecraft = instance.getGameVersion(); - if (instance.isFabric()) { - manifest.dependencies.fabricLoader = instance.getLoaderVersion(); - } + ModrinthModpackManifest manifest = new ModrinthModpackManifest( + 1, + "minecraft", + version, + instance.name, + null, // summary + new ArrayList<>(), + new ModrinthModpackManifest.Dependencies( + instance.gameVersion, + null, + instance.isFabric ? instance.loaderVersion : null, + null + ) + ); GC_ModrinthModpackManifest.write(root.resolve("modrinth.index.json"), manifest); return manifest; } @@ -38,9 +41,8 @@ public class ModrinthExporter extends Exporter { @Override protected void addMods(Path root, Instance instance, Iterable mods, ModrinthModpackManifest manifest, Path modsOverrides) throws IOException { modsLoop: for (Mod mod : mods) { - if (mod.needsInject()) { - Set sources = mod.getMetadata().sources.keySet(); - for (ModSource source : sources) { + if (mod.needsInject) { + for (ModSource source : mod.metadata.sources.keySet()) { if (source instanceof ModrinthModSource cms) { manifest.files.add(cms.toManifest()); continue modsLoop; @@ -49,7 +51,7 @@ public class ModrinthExporter extends Exporter { } // Not available on modrinth Files.createDirectories(modsOverrides); - Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString())); + Files.copy(mod.jarPath, modsOverrides.resolve(mod.jarPath.fileName.toString())); } GC_ModrinthModpackManifest.write(root.resolve("modrinth.index.json"), manifest); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java index f702873..ca6220d 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/exporter/MultiMCExporter.java @@ -43,32 +43,16 @@ public class MultiMCExporter extends Exporter { name=%s notes= totalTimePlayed=0 - """, Instant.now().toEpochMilli(), instance.getName())); + """, Instant.now().toEpochMilli(), instance.name)); } { - MMCPackMeta manifest = new MMCPackMeta(); - manifest.formatVersion = 1; - manifest.components = new ArrayList<>(); - MMCPackMeta.Component lwjgl = new MMCPackMeta.Component(); - lwjgl.dependencyOnly = true; - lwjgl.uid = "org.lwjgl3"; - lwjgl.version = "3.2.2"; //TODO get automatically - manifest.components.add(lwjgl); - MMCPackMeta.Component minecraft = new MMCPackMeta.Component(); - minecraft.important = true; - minecraft.uid = "net.minecraft"; - minecraft.version = instance.getGameVersion(); - manifest.components.add(minecraft); + 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)); if (instance.isFabric()) { - MMCPackMeta.Component intermediary = new MMCPackMeta.Component(); - intermediary.dependencyOnly = true; - intermediary.uid = "net.fabricmc.intermediary"; - intermediary.version = instance.getGameVersion(); - manifest.components.add(intermediary); - MMCPackMeta.Component fabric = new MMCPackMeta.Component(); - fabric.uid = "net.fabricmc.fabric-loader"; - fabric.version = instance.getLoaderVersion(); - manifest.components.add(fabric); + 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)); } GC_MMCPackMeta.write(root.resolve("mmc-pack.json"), manifest); return manifest; @@ -78,6 +62,6 @@ public class MultiMCExporter extends Exporter { @Override protected void addMods(Path root, Instance instance, Iterable mods, MMCPackMeta mmcPackMeta, Path modsOverrides) throws IOException { Files.createDirectories(modsOverrides); - for (Mod mod : mods) Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString())); + for (Mod mod : mods) Files.copy(mod.jarPath, modsOverrides.resolve(mod.jarPath.fileName.toString())); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java index ef16160..5b80669 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/CurseForgeImporter.java @@ -24,30 +24,32 @@ public class CurseForgeImporter extends Importer { 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.modLoaders == null) manifest.minecraft.modLoaders = Set.of(); if (manifest.minecraft.version == null) throw new IOException("Modpack missing minecraft version"); - if (manifest.files == null) manifest.files = Set.of(); String fabric = 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 (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()); + } } return new IntermediaryManifest(manifest.name, manifest.overrides, manifest.minecraft.version, fabric); } @Override protected void downloadMods(CurseforgeModpackManifest manifest, Path instanceDir, ProcessState state) throws IOException { - 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.getName()); - ModDownload download = source.download(); - ModMeta imod = ModMeta.of(download.sha1(), download.murmur2(), source, manifest.minecraft.version); - Files.createDirectories(modsPath); - GC_ModMeta.write(modsPath.resolve(source.getShortName() + ModPath.EXT_IMOD), imod); + 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); + ModDownload download = source.download(); + ModMeta imod = ModMeta.of(download.sha1, download.murmur2, source, manifest.minecraft.version); + Files.createDirectories(modsPath); + GC_ModMeta.write(modsPath.resolve(source.shortName + ModPath.EXT_IMOD), imod); + } } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/Importer.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/Importer.java index baff5c6..2658b7c 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/Importer.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/Importer.java @@ -38,7 +38,7 @@ public abstract class Importer { 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) { @@ -53,13 +53,13 @@ public abstract class Importer { 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.version = createVersionString(man.gameVersion(), man.fabricVersion()); + meta.version = createVersionString(man.gameVersion, man.fabricVersion); GC_InstanceMeta.write(iDir.resolve("instance.json"), meta); state.incrementStep("Downloading mods"); @@ -67,9 +67,9 @@ public abstract class Importer { 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.getFileName().toString())); + JFiles.copyRecursive(path, iDir.resolve(path.fileName.toString())); }); } Instance.setSetupLock(iDir, false); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/ModrinthImporter.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/ModrinthImporter.java index 82b9931..569970e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/ModrinthImporter.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/importer/ModrinthImporter.java @@ -19,8 +19,7 @@ public class ModrinthImporter extends Importer { 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.files == null) manifest.files = new ArrayList<>(); - if (manifest.dependencies == null) manifest.dependencies = new ModrinthModpackManifest.Dependencies(); + 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) { @@ -32,25 +31,32 @@ public class ModrinthImporter extends Importer { } } } - return new IntermediaryManifest(manifest.name, "overrides", manifest.dependencies.minecraft, manifest.dependencies.fabricLoader); + return new IntermediaryManifest( + manifest.name, + "overrides", + manifest.dependencies.minecraft, + manifest.dependencies.fabricLoader + ); } @Override protected void downloadMods(ModrinthModpackManifest manifest, Path instanceDir, ProcessState state) throws IOException { - 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; - IOException failedDownload = new IOException("Could not download file"); - for (String url : file.downloads) { - try { - Net.downloadFile(url, sha1, path); - continue filesLoop; - } catch (IOException | URISyntaxException e) { - failedDownload.addSuppressed(e); + if (manifest.files != null) { + filesLoop: for (ModrinthModpackManifest.File file : manifest.files) { + Path path = instanceDir.parent.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; + IOException failedDownload = new IOException("Could not download file"); + for (String url : file.downloads) { + try { + Net.downloadFile(url, sha1, path); + continue filesLoop; + } catch (IOException | URISyntaxException e) { + failedDownload.addSuppressed(e); + } } + throw failedDownload; } - throw failedDownload; } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java index cfc6850..99940d0 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Instance.java @@ -20,7 +20,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m private static final String INCEPTUM_SETUP_LOCK = "inceptum.setup.lock"; public Instance(Path path, InstanceMeta meta) throws IOException { - this(generateId(path.getFileName().toString()), path, meta, ModsDirScanner.get(path.resolve("mods"), meta)); + this(generateId(path.fileName.toString()), path, meta, ModsDirScanner.get(path.resolve("mods"), meta)); } public Instance(String id, Path path, InstanceMeta meta, ModsDirScanner mds) { @@ -53,7 +53,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.getFileName().toString().compareTo(entry.path.getFileName().toString()); + if (time2 == 0) return path.fileName.toString().compareTo(entry.path.fileName.toString()); return -1; } if (time2 == 0) return 1; @@ -62,14 +62,14 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m @Override public String toString() { - return path.getFileName().toString(); + return path.fileName.toString(); } - public Path modsDir() { + public Path getModsDir() { return path.resolve("mods"); } - public Path configDir() { + public Path getConfigDir() { return path.resolve("config"); } @@ -79,7 +79,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m } public String getName() { - return path.getFileName().toString(); + return path.fileName.toString(); } public boolean isFabric() { @@ -117,7 +117,7 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m return true; Files.delete(path.resolve(INCEPTUM_LOCK)); } catch (IOException e) { - Utils.LOGGER.error("Could not read running lock of " + getName(), e); + Utils.LOGGER.error("Could not read running lock of " + name, e); } return false; } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/InstanceList.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/InstanceList.java index 132dcfa..c7622b7 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/InstanceList.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/InstanceList.java @@ -19,9 +19,9 @@ public class InstanceList { public static void reset() { synchronized (metas) { - for (IEntry value : metas.values()) { + for (var entry : metas) { try { - value.close(); + entry.value.close(); } catch (IOException e) { Utils.LOGGER.error("Could not close reference to instance meta", e); } @@ -52,19 +52,19 @@ 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 Instance read(Path instancePath) throws IOException { Objects.requireNonNull(instancePath); synchronized (metas) { if (!metas.containsKey(instancePath)) { - metas.put(instancePath, new IEntry( + metas[instancePath] = new IEntry( instancePath, new FileBackedRef<>(instancePath.resolve("instance.json"), GC_InstanceMeta::read) - )); + ); } - return metas.get(instancePath).toPub(); + return metas[instancePath].toPub(); } } @@ -75,7 +75,7 @@ public class InstanceList { private record IEntry(Path path, FileBackedRef meta) implements Closeable { @Override public String toString() { - return path.getFileName().toString(); + return path.fileName.toString(); } public Instance toPub() throws IOException { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java index 35cc53d..0e89b8f 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/Mod.java @@ -11,7 +11,7 @@ import java.util.Set; public abstract class Mod implements Comparable { public abstract String getName(); public abstract String[] getDescription(); - public abstract boolean needsInject(); + public abstract boolean getNeedsInject(); public abstract Path getJarPath(); public abstract Path getMetadataPath(); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java index acfe1eb..089d71d 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModManager.java @@ -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.getMods()) { - for (ModSource source : value.getMetadata().sources.keySet()) { + for (Mod value : mds.mods) { + for (ModSource source : value.metadata.sources.keySet()) { if (ms.equals(source)) { - return new DownloadMeta(new ModDownload(value.getMetadata().sha1, value.getMetadata().murmur2, value.getJarPath()), value.getMetadata(), source, metaFile); + return new DownloadMeta(new ModDownload(value.metadata.sha1, value.metadata.murmur2, value.jarPath), value.metadata, source, metaFile); } } } ModDownload md = ms.download(); - 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()); + 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()); depMeta.write(); } return new DownloadMeta(md, manifest, ms, metaFile); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModPath.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModPath.java index 8906b9d..d0a4d41 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModPath.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/instance/ModPath.java @@ -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.getParent().resolve(fileName); + return p.parent.resolve(fileName); } public static boolean hasImod(Path mod) { - Path parent = mod.getParent(); + Path parent = mod.parent; 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.getParent().resolve(fn(p) + EXT_IMOD); + return p.parent.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.getParent().resolve(fileName); + return p.parent.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.getParent().resolve(fileName); + return p.parent.resolve(fileName); } public static Path toggle(Path p) { @@ -69,6 +69,6 @@ public class ModPath { } private static String fn(Path p) { - return p.getFileName().toString(); + return p.fileName.toString(); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java index 221e50c..e56d23f 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/launch/InstanceLauncher.java @@ -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.getSelectedAccount(); + AuthInfo authInfo = AccountManager.selectedAccount; 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.getGameVersion()); + VersionsListInfo versionDataSimple = getVersion(instance.gameVersion); VersionInfo versionInfo = McApi.getVersionInfo(versionDataSimple); // Add fabric metadata if using fabric - if (instance.isFabric()) { - versionInfo = FabricMetaApi.addFabric(versionInfo, instance.getLoaderVersion(), launchType.fabricMetaType); + if (instance.isFabric) { + versionInfo = FabricMetaApi.addFabric(versionInfo, instance.loaderVersion, launchType.fabricMetaType); } // Ensure libs/assets are present DownloadLibrariesStep.execute(versionInfo, new AtomicBoolean(false), new ProcessState()); @@ -70,7 +70,7 @@ 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))) @@ -85,24 +85,24 @@ public class InstanceLauncher { Path gameJar = MetaHolder.LIBRARIES_DIR.resolve("net/minecraft/" + launchType.name).resolve(versionDataSimple.id + ".jar"); classPath.append(gameJar); classPath.append(File.pathSeparatorChar); - classPath.append(DownloadLibrariesStep.getLaunchWrapperArtifact().getLocalPath()); + classPath.append(DownloadLibrariesStep.launchWrapperArtifact.localPath); // 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); + 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.getMods()) { - if (mod.isEnabled() && mod.needsInject()) { - fabricAddMods.append(mod.getJarPath()); + for (Mod mod : instance.mods) { + if (mod.isEnabled && mod.needsInject) { + fabricAddMods.append(mod.jarPath); fabricAddMods.append(File.pathSeparatorChar); } } @@ -126,22 +126,22 @@ public class InstanceLauncher { switch (launchType) { case Client -> { if (instance.meta().arguments.client != null) - args.addAll(instance.meta().arguments.client); + args.addAll(instance.meta.arguments.client); } case Server -> { if (instance.meta().arguments.server != null) - args.addAll(instance.meta().arguments.server); + 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 proc = new AtomicReference<>(); @@ -164,7 +164,7 @@ public class InstanceLauncher { } Utils.LOGGER.info("Restarting server"); starterRunner.run(); - if (!proc.get().isAlive()) { + if (!proc.get().isAlive) { Utils.LOGGER.error("Could not restart server"); return; } @@ -174,7 +174,7 @@ public class InstanceLauncher { } 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)) { @@ -210,19 +210,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.getGameVersion()).toString()) + .replace("${natives_directory}", MetaHolder.NATIVES_DIR.resolve(instance.gameVersion).toString()) .replace("${launcher_name}", "Inceptum") .replace("${launcher_version}", BuildMetadata.VERSION) .replace("${classpath}", classPath) diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/FileScanTask.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/FileScanTask.java index 35f83f7..4e095b7 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/FileScanTask.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/FileScanTask.java @@ -27,12 +27,12 @@ public record FileScanTask(ProtoInstance instance, Path file, BiConsumer dependency.equals(instance.mds.get(instance.modsDir.resolve(s)))) + .filter(s -> dependency.equals(instance.mds[instance.modsDir.resolve(s)])) .findFirst() .orElseThrow(FileNotFoundException::new)); write(); @@ -113,11 +113,11 @@ 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.get(instance.modsDir.resolve(s)))) + .filter(s -> dependent.equals(instance.mds[instance.modsDir.resolve(s)])) .findFirst() .orElseThrow(FileNotFoundException::new)); write(); - if (!meta.explicit && meta.dependents.isEmpty()) delete(); + if (!meta.explicit && meta.dependents.isEmpty) delete(); } @Override diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScannerImpl.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScannerImpl.java index 6907c68..64f8a96 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScannerImpl.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ModsDirScannerImpl.java @@ -19,7 +19,7 @@ import static java.nio.file.StandardWatchEventKinds.*; class ModsDirScannerImpl implements ModsDirScanner { private static final Map SCANNERS = new HashMap<>(); - private static final ExecutorService POOL = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new NamedThreadFactory("mds")); + private static final ExecutorService POOL = Executors.newFixedThreadPool(Runtime.runtime.availableProcessors(), new NamedThreadFactory("mds")); private final Map descriptions = new HashMap<>(); private final Set scannedPaths = new HashSet<>(); private final Thread th; @@ -29,19 +29,19 @@ 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.getParent().getFileName()); + this.th = new Thread(this::scanTaskInternal, "mds-" + modsDir.parent.fileName); 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.get(modsDir); + ModsDirScannerImpl mds = SCANNERS[modsDir]; if (mds.instance.meta.equals(instance)) return mds; mds.close(); } ModsDirScannerImpl mds = new ModsDirScannerImpl(modsDir, instance); - SCANNERS.put(modsDir, mds); + SCANNERS[modsDir] = mds; return mds; } @@ -60,8 +60,7 @@ class ModsDirScannerImpl implements ModsDirScanner { @Override public void start() { - if (!th.isAlive()) - th.start(); + if (!th.isAlive()) th.start(); } @Override @@ -86,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.get(path); + return descriptions[path]; } @Override @@ -97,7 +96,7 @@ class ModsDirScannerImpl implements ModsDirScanner { public boolean hasScanned(Path path) { return scannedPaths.contains(path) - || scannedPaths.contains(path.getParent().resolve(path.getFileName().toString() + ".imod")); + || scannedPaths.contains(path.parent.resolve(path.fileName.toString() + ".imod")); } private void scanTaskInternal() { @@ -115,10 +114,10 @@ class ModsDirScannerImpl implements ModsDirScanner { Set> tasks = new HashSet<>(); discovered = discovered.andThen((path, iwModDescription) -> { scannedPaths.add(path); - descriptions.put(path, iwModDescription); + descriptions[path] = iwModDescription; }); Set toScan; - if (descriptions.isEmpty()) { + if (descriptions.isEmpty) { toScan = Set.copyOf(JFiles.list(instance.modsDir)); } else { toScan = new HashSet<>(); @@ -137,7 +136,7 @@ class ModsDirScannerImpl implements ModsDirScanner { }); } for (Path p : toScan) { - tasks.add(POOL.submit(new FileScanTask(instance, p, discovered, getGameVersion()))); + tasks.add(POOL.submit(new FileScanTask(instance, p, discovered, gameVersion))); } for (Future task : tasks) { try { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/NamedThreadFactory.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/NamedThreadFactory.java index 6923dd7..98af033 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/NamedThreadFactory.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/NamedThreadFactory.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.inceptum.launcher.system.mds; +import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; @@ -11,20 +12,14 @@ public class NamedThreadFactory implements ThreadFactory { private final String namePrefix; public NamedThreadFactory(String name) { - this.group = Thread.currentThread().getThreadGroup(); + this.group = Thread.currentThread().threadGroup; 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.setDaemon(false); - } - - if (t.getPriority() != 5) { - t.setPriority(5); - } - + if (t.isDaemon) t.isDaemon = false; + if (t.priority != 5) t.priority = 5; return t; } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ProtoInstance.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ProtoInstance.java index fb0adc0..cdb30a4 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ProtoInstance.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/ProtoInstance.java @@ -3,21 +3,6 @@ package io.gitlab.jfronny.inceptum.launcher.system.mds; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta; import java.nio.file.Path; -import java.util.Objects; -public class ProtoInstance { - public final Path modsDir; - public final ModsDirScanner mds; - public final InstanceMeta meta; - - public ProtoInstance(Path modsDir, ModsDirScanner mds, InstanceMeta meta) { - this.modsDir = modsDir; - this.mds = mds; - this.meta = meta; - } - - @Override - public int hashCode() { - return Objects.hash(modsDir, mds, meta); - } +public record ProtoInstance(Path modsDir, ModsDirScanner mds, InstanceMeta meta) { } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java index f6a2d7e..0734a7b 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/mds/noop/NoopMod.java @@ -19,7 +19,7 @@ public class NoopMod extends Mod { @Override public String getName() { - return path.getFileName().toString(); + return path.fileName.toString(); } @Override @@ -31,7 +31,7 @@ public class NoopMod extends Mod { } @Override - public boolean needsInject() { + public boolean getNeedsInject() { return false; } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/Steps.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/Steps.java index e58f94a..a00c133 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/Steps.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/Steps.java @@ -29,24 +29,24 @@ 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.getGameVersion())) { + if (version.id.equals(instance.gameVersion)) { found = true; VersionInfo vi = McApi.getVersionInfo(version); - if (instance.isFabric()) - vi = FabricMetaApi.addFabric(vi, instance.getLoaderVersion(), FabricMetaApi.FabricVersionInfoType.Both); - LoaderInfo li = instance.isFabric() - ? new LoaderInfo(LoaderInfo.Type.Fabric, instance.getLoaderVersion()) + if (instance.isFabric) + vi = FabricMetaApi.addFabric(vi, instance.loaderVersion, FabricMetaApi.FabricVersionInfoType.Both); + LoaderInfo li = instance.isFabric + ? new LoaderInfo(LoaderInfo.Type.Fabric, instance.loaderVersion) : LoaderInfo.NONE; - SetupStepInfo info = new SetupStepInfo(vi, li, instance.getName(), state); + SetupStepInfo info = new SetupStepInfo(vi, li, instance.name, state); for (Step step : Steps.STEPS) { state.incrementStep("Starting " + step.getClass().getSimpleName()); step.execute(info, new AtomicBoolean(false)); } } } - if (!found) throw new IOException("Could not identify minecraft version " + instance.getGameVersion()); + if (!found) throw new IOException("Could not identify minecraft version " + instance.gameVersion); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadAssetsStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadAssetsStep.java index 30e2f07..d0cb9f5 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadAssetsStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadAssetsStep.java @@ -18,14 +18,14 @@ public class DownloadAssetsStep implements Step { public void execute(SetupStepInfo info, AtomicBoolean stopThread) throws IOException { Path o = MetaHolder.ASSETS_DIR.resolve("objects"); try { - for (Map.Entry entry : McApi.getAssetIndex(info.version()).objects.entrySet()) { + for (var entry : McApi.getAssetIndex(info.version).objects) { if (stopThread.get()) return; - Path fPath = o.resolve(entry.getValue().hash.substring(0, 2)); + Path fPath = o.resolve(entry.value.hash.substring(0, 2)); if (!Files.exists(fPath)) Files.createDirectories(fPath); - fPath = fPath.resolve(entry.getValue().hash); + fPath = fPath.resolve(entry.value.hash); if (Files.exists(fPath)) continue; - info.setState("Downloading asset: " + entry.getKey()); - McApi.downloadAsset(entry.getValue(), fPath); + info.setState("Downloading asset: " + entry.key); + McApi.downloadAsset(entry.value, fPath); } } catch (URISyntaxException e) { throw new IOException("Could not download assets", e); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadClientStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadClientStep.java index cee3b76..a03d485 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadClientStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadClientStep.java @@ -19,18 +19,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"); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadJavaStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadJavaStep.java index f8adcdf..c40ba83 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadJavaStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadJavaStep.java @@ -17,25 +17,24 @@ import java.util.concurrent.atomic.AtomicBoolean; public class DownloadJavaStep implements Step { @Override public void execute(SetupStepInfo info, AtomicBoolean stopThread) throws IOException { - VersionInfo.JavaVersion ver = info.version().javaVersion; + 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 (Map.Entry entry : McApi.getJvm(ver.component, ver.majorVersion).entrySet()) { - Path tPath = jvmDir.resolve(entry.getKey()); - switch (entry.getValue().type) { + for (var entry : McApi.getJvm(ver.component, ver.majorVersion)) { + Path tPath = jvmDir.resolve(entry.key); + switch (entry.value.type) { case "file" -> { - MojangFileDownload mf = entry.getValue().downloads.raw; + MojangFileDownload mf = entry.value.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.getValue().executable) { - if (!tPath.toFile().setExecutable(true)) - info.setState("Could not set executable bit for " + tPath); + if (entry.value.executable) { + if (!tPath.toFile().setExecutable(true)) info.setState("Could not set executable bit for " + tPath); } } case "directory" -> Files.createDirectories(tPath); diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadLibrariesStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadLibrariesStep.java index 8aa2eae..6907189 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadLibrariesStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/DownloadLibrariesStep.java @@ -20,7 +20,7 @@ import java.util.concurrent.atomic.AtomicBoolean; public class DownloadLibrariesStep implements Step { @Override public void execute(SetupStepInfo info, AtomicBoolean stopThread) throws IOException { - execute(info.version(), stopThread, info.currentState()); + execute(info.version, stopThread, info.currentState); } public static void execute(VersionInfo version, AtomicBoolean stopThread, ProcessState currentState) throws IOException { @@ -29,7 +29,7 @@ public class DownloadLibrariesStep implements Step { Path path = MetaHolder.LIBRARIES_DIR.resolve(artifact.path); if (!Files.exists(path)) { currentState.updateStep("Downloading library: " + artifact.path); - if (!Files.exists(path.getParent())) Files.createDirectories(path.getParent()); + 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); continue; @@ -52,9 +52,9 @@ public class DownloadLibrariesStep implements Step { } ArtifactMeta artifact = getLaunchWrapperArtifact(); - if (!Files.exists(artifact.getLocalPath())) { + if (!Files.exists(artifact.localPath)) { try { - MavenApi.downloadLibrary(Updater.PROJECT_MAVEN, MavenApi.getMetadata(Updater.PROJECT_MAVEN, artifact.getMavenNotation())); + MavenApi.downloadLibrary(Updater.PROJECT_MAVEN, MavenApi.getMetadata(Updater.PROJECT_MAVEN, artifact.mavenNotation)); } catch (URISyntaxException | SAXException e) { throw new IOException("Could not download launchwrapper", e); } @@ -62,16 +62,12 @@ public class DownloadLibrariesStep implements Step { } public static ArtifactMeta getLaunchWrapperArtifact() throws FileNotFoundException { - ArtifactMeta meta = new ArtifactMeta(); - meta.groupId = "io.gitlab.jfronny.inceptum"; - meta.artifactId = "launchwrapper"; String version = BuildMetadata.IS_PUBLIC ? BuildMetadata.VERSION : null; try { 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"); - meta.version = version; - return meta; + return new ArtifactMeta("io.gitlab.jfronny.inceptum", "launchwrapper", version); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java index 74fb3bb..1261b3e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/RunMdsStep.java @@ -14,7 +14,7 @@ public class RunMdsStep implements Step { @Override public void execute(SetupStepInfo info, AtomicBoolean stopThread) 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.json"))) .runOnce((path, iwModDescription) -> info.setState("Scanned " + path)); } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/SetupDirsStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/SetupDirsStep.java index 59cd687..7e7b0d0 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/SetupDirsStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/SetupDirsStep.java @@ -16,14 +16,14 @@ public class SetupDirsStep implements Step { @Override public void execute(SetupStepInfo info, AtomicBoolean stopThread) 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"))) @@ -33,6 +33,6 @@ 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))); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/WriteMetadataStep.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/WriteMetadataStep.java index e9830d3..c3958ff 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/WriteMetadataStep.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/setup/steps/WriteMetadataStep.java @@ -16,11 +16,11 @@ public class WriteMetadataStep implements Step { @Override public void execute(SetupStepInfo info, AtomicBoolean stopThread) 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.json"); if (!Files.exists(metaPath)) { InstanceMeta meta = new InstanceMeta(); - meta.version = info.version().id; + meta.version = info.version.id; GC_InstanceMeta.write(metaPath, meta); } Instance.setSetupLock(instance, false); @@ -40,8 +40,7 @@ public class WriteMetadataStep implements Step { realms_persistence.json"""); } if (!Files.exists(instance.resolve(".iceignore"))) { - Files.writeString(instance.resolve(".iceignore"), """ - instance.json"""); + Files.writeString(instance.resolve(".iceignore"), "instance.json"); } } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/CurseforgeModSource.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/CurseforgeModSource.java index 014fa6e..a14a38e 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/CurseforgeModSource.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/CurseforgeModSource.java @@ -89,12 +89,12 @@ public final class CurseforgeModSource implements ModSource { @Override public String getName() { - return "curseforge/" + getShortName() + '/' + current.id; + return "curseforge/" + shortName + '/' + current.id; } @Override public String getShortName() { - return mod.slug == null ? mod.id.toString() : mod.slug; + return mod.slug == null ? Integer.toString(mod.id) : mod.slug; } @Override @@ -116,10 +116,6 @@ public final class CurseforgeModSource implements ModSource { } public CurseforgeModpackManifest.File toManifest() { - CurseforgeModpackManifest.File f = new CurseforgeModpackManifest.File(); - f.projectID = getProjectId(); - f.fileID = getFileId(); - f.required = true; - return f; + return new CurseforgeModpackManifest.File(projectId, fileId, true); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/DirectModSource.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/DirectModSource.java index ead6ccd..f500ef7 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/DirectModSource.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/DirectModSource.java @@ -17,7 +17,7 @@ public record DirectModSource(String fileName, String url, Set depend @Override public ModDownload download() throws IOException { - Path p = getJarPath(); + Path p = jarPath; try { Net.downloadFile(url, p); //TODO test } catch (URISyntaxException e) { diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModSource.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModSource.java index 1185823..552bc21 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModSource.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModSource.java @@ -1,6 +1,7 @@ package io.gitlab.jfronny.inceptum.launcher.system.source; import io.gitlab.jfronny.gson.compile.annotations.GSerializable; +import io.gitlab.jfronny.inceptum.common.GsonPreset; import io.gitlab.jfronny.inceptum.common.MetaHolder; import io.gitlab.jfronny.inceptum.launcher.gson.ModSourceAdapter; @@ -9,7 +10,7 @@ import java.nio.file.Path; import java.util.Optional; import java.util.Set; -@GSerializable(with = ModSourceAdapter.class) +@GSerializable(with = ModSourceAdapter.class, configure = GsonPreset.Api.class) public interface ModSource { ModDownload download() throws IOException; @@ -28,6 +29,6 @@ public interface ModSource { boolean equals(ModSource other); default Path getJarPath() { - return MetaHolder.LIBRARIES_DIR.resolve("com").resolve(getName()).resolve(getFileName()); + return MetaHolder.LIBRARIES_DIR.resolve("com").resolve(name).resolve(fileName); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModrinthModSource.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModrinthModSource.java index b0e3f32..4eac8c6 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModrinthModSource.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/system/source/ModrinthModSource.java @@ -25,13 +25,13 @@ public final class ModrinthModSource implements ModSource { public ModrinthModSource(String versionId) throws IOException { this.versionId = versionId; this.current = ModrinthApi.getVersion(versionId); - this.mod = ModrinthApi.getMod(getModId()); + this.mod = ModrinthApi.getMod(modId); } @Override public ModDownload download() throws IOException { - ModrinthVersion.File file = current.files.get(0); - Path path = getJarPath(); + ModrinthVersion.File file = current.files[0]; + Path path = jarPath; try { Net.downloadFile(file.url, file.hashes.sha1, path); } catch (URISyntaxException e) { @@ -59,7 +59,7 @@ public final class ModrinthModSource implements ModSource { ModrinthVersion stable = null; ModrinthVersion beta = null; ModrinthVersion latest = null; - for (ModrinthVersion version : ModrinthApi.getVersions(getModId())) { + for (ModrinthVersion version : ModrinthApi.getVersions(modId)) { 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) @@ -86,7 +86,7 @@ public final class ModrinthModSource implements ModSource { @Override public String getName() { - return "modrinth/" + getShortName() + '/' + current.version_number; + return "modrinth/" + shortName + '/' + current.version_number; } @Override @@ -96,12 +96,12 @@ public final class ModrinthModSource implements ModSource { @Override public String getFileName() { - return current.files.get(0).filename; + return current.files[0].filename; } @Override public boolean equals(ModSource other) { - return other instanceof ModrinthModSource ms && ms.getModId().equals(getModId()) && ms.versionId.equals(versionId); + return other instanceof ModrinthModSource ms && ms.modId.equals(modId) && ms.versionId.equals(versionId); } public String getVersionId() { @@ -113,14 +113,16 @@ public final class ModrinthModSource implements ModSource { } public ModrinthModpackManifest.File toManifest() throws IOException { - ModrinthVersion.File orig = current.files.get(0); - ModrinthModpackManifest.File f = new ModrinthModpackManifest.File(); - f.path = "mods/" + orig.filename; - f.hashes = new ModrinthHashes(); - f.hashes.sha1 = orig.hashes.sha1; - f.hashes.sha512 = orig.hashes.sha512; - f.downloads = List.of(orig.url); - f.fileSize = Files.size(getJarPath()); - return f; + ModrinthVersion.File orig = current.files[0]; + return new ModrinthModpackManifest.File( + "mods/" + orig.filename, + new ModrinthHashes( + orig.hashes.sha1, + orig.hashes.sha512 + ), + null, // env + List.of(orig.url), + Files.size(jarPath) + ); } } diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/ProcessUtils.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/ProcessUtils.java index d5f81d8..9ac15d5 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/ProcessUtils.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/ProcessUtils.java @@ -18,12 +18,13 @@ public class ProcessUtils { Runtime rt = Runtime.getRuntime(); Process pr = rt.exec(command); - InputStreamReader isReader = new InputStreamReader(pr.getInputStream()); - BufferedReader bReader = new BufferedReader(isReader); - String strLine; - while ((strLine = bReader.readLine()) != null) { - if (strLine.contains(" " + pid + " ")) { - return true; + try (InputStreamReader isReader = new InputStreamReader(pr.inputStream); + BufferedReader bReader = new BufferedReader(isReader)) { + String strLine; + while ((strLine = bReader.readLine()) != null) { + if (strLine.contains(" " + pid + " ")) { + return true; + } } } return false; diff --git a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/VersionInfoLibraryResolver.java b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/VersionInfoLibraryResolver.java index c08c37c..8c0d146 100644 --- a/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/VersionInfoLibraryResolver.java +++ b/launcher/src/main/java/io/gitlab/jfronny/inceptum/launcher/util/VersionInfoLibraryResolver.java @@ -12,9 +12,9 @@ public class VersionInfoLibraryResolver { public static Set getRelevant(VersionInfo version) { Set 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.getMojName())) { - artifacts.add(new ArtifactInfo(library.downloads.classifiers.get(library.natives.get(OSUtils.TYPE.getMojName())), true)); + 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.downloads.artifact == null) { Utils.LOGGER.info("Null library artifact @ " + library.name);