package io.gitlab.jfronny.inceptum.util; import io.gitlab.jfronny.commons.ComparableVersion; import io.gitlab.jfronny.commons.OSUtils; import io.gitlab.jfronny.commons.serialize.gson.ComparableVersionAdapter; import io.gitlab.jfronny.gson.GsonBuilder; import io.gitlab.jfronny.inceptum.model.inceptum.InceptumVersion; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class MetaHolder { public static final InceptumVersion VERSION; public static final Path BASE_PATH; static { try (InputStream is = MetaHolder.class.getClassLoader().getResourceAsStream("version.json"); InputStreamReader isr = new InputStreamReader(is)) { VERSION = new GsonBuilder() .registerTypeAdapter(ComparableVersion.class, new ComparableVersionAdapter()) .create() .fromJson(isr, InceptumVersion.class); if (System.getProperty("inceptum.base") == null) { Path runDir = getRunDir(); BASE_PATH = VERSION.isRelease && !Files.exists(runDir) ? getConfigPath().resolve("Inceptum") : runDir; } else { BASE_PATH = Paths.get(System.getProperty("inceptum.base")); } } catch (IOException e) { throw new RuntimeException("Could not get version info", e); } } public static final Path ACCOUNTS_PATH = BASE_PATH.resolve("accounts.json"); public static final Path CONFIG_PATH = BASE_PATH.resolve("inceptum.json"); public static final Path NATIVES_DIR = BASE_PATH.resolve("natives"); public static final Path FORCE_LOAD_PATH = NATIVES_DIR.resolve("forceload"); public static final Path LIBRARIES_DIR = BASE_PATH.resolve("libraries"); public static final Path ASSETS_DIR = BASE_PATH.resolve("assets"); public static final Path INSTANCE_DIR = BASE_PATH.resolve("instances"); public static final Path CACHE_DIR = BASE_PATH.resolve("cache"); private static Path getConfigPath() { return switch (OSUtils.TYPE) { case WINDOWS -> Paths.get(System.getenv("APPDATA")); case MAC_OS -> Paths.get(System.getProperty("user.home")).resolve("Library").resolve("Application Support"); case LINUX -> { String s = System.getenv().get("XDG_CONFIG_HOME"); if (s == null) yield Paths.get(System.getProperty("user.home")).resolve(".config"); else yield Paths.get(s); } }; } private static Path getRunDir() { Path simpleRunDir = Path.of(".").resolve("run"); if (Files.exists(simpleRunDir)) return simpleRunDir; URL url = MetaHolder.class.getProtectionDomain().getCodeSource().getLocation(); String p = url.getPath(); if (p.endsWith(".jar") && !p.endsWith("/build/libs/wrapper-" + VERSION.version + ".jar")) { try { return new File(url.toURI()).toPath().getParent().resolve("run"); } catch (URISyntaxException e) { Utils.LOGGER.error("Could not resolve dev env run dir"); return simpleRunDir; } } else { System.out.println("Not running in a jar, using ./run"); return simpleRunDir; } } }