From e9dd5644e8b2cff984feac87ea4f890c73a05325 Mon Sep 17 00:00:00 2001 From: JFronny Date: Tue, 14 Mar 2023 20:58:21 +0100 Subject: [PATCH] Port to 1.19.4 and libjf-config. Also remove the unused API as mods can still use mixin --- build.gradle.kts | 2 + gradle.properties | 10 +- .../io/gitlab/jfronny/resclone/Resclone.java | 60 ++++------ .../jfronny/resclone/RescloneConfig.java | 111 ++++++++++++++++++ .../resclone/RescloneEntryDefault.java | 24 ---- .../jfronny/resclone/api/RescloneApi.java | 21 ---- .../jfronny/resclone/api/RescloneEntry.java | 5 - .../resclone/fetchers/BasePackFetcher.java | 1 - .../{api => fetchers}/PackFetcher.java | 2 +- .../{api => processors}/PackProcessor.java | 2 +- .../processors/PruneVanillaProcessor.java | 1 - .../processors/RemoveEmptyProcessor.java | 1 - .../processors/RootPathProcessor.java | 1 - .../resclone/util/config/ConfigLoader.java | 42 ------- .../resclone/util/config/RescloneConfig.java | 11 -- .../config/RescloneConfigTypeAdapter.java | 65 ---------- .../resources/assets/resclone/lang/en_us.json | 7 ++ src/main/resources/fabric.mod.json | 4 +- 18 files changed, 151 insertions(+), 219 deletions(-) create mode 100644 src/main/java/io/gitlab/jfronny/resclone/RescloneConfig.java delete mode 100644 src/main/java/io/gitlab/jfronny/resclone/RescloneEntryDefault.java delete mode 100644 src/main/java/io/gitlab/jfronny/resclone/api/RescloneApi.java delete mode 100644 src/main/java/io/gitlab/jfronny/resclone/api/RescloneEntry.java rename src/main/java/io/gitlab/jfronny/resclone/{api => fetchers}/PackFetcher.java (86%) rename src/main/java/io/gitlab/jfronny/resclone/{api => processors}/PackProcessor.java (71%) delete mode 100644 src/main/java/io/gitlab/jfronny/resclone/util/config/ConfigLoader.java delete mode 100644 src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfig.java delete mode 100644 src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfigTypeAdapter.java create mode 100644 src/main/resources/assets/resclone/lang/en_us.json diff --git a/build.gradle.kts b/build.gradle.kts index 7a21658..3f01d85 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,9 +6,11 @@ plugins { dependencies { include(modImplementation("io.gitlab.jfronny.libjf:libjf-base:${prop("libjf_version")}")!!) // for JfCommons + include(modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v1:${prop("libjf_version")}")!!) // for JfCommons include(modImplementation(fabricApi.module("fabric-resource-loader-v0", prop("fabric_version")))!!) // Dev env + modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-ui-tiny-v1:${prop("libjf_version")}") modLocalRuntime("io.gitlab.jfronny.libjf:libjf-devutil:${prop("libjf_version")}") modLocalRuntime("com.terraformersmc:modmenu:${prop("modmenu_version")}") } diff --git a/gradle.properties b/gradle.properties index 5fa8949..56f94bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # https://fabricmc.net/develop -minecraft_version=1.19.4-pre1 -yarn_mappings=build.6 +minecraft_version=1.19.4 +yarn_mappings=build.1 loader_version=0.14.17 maven_group=io.gitlab.jfronny @@ -8,6 +8,6 @@ archives_base_name=resclone modrinth_id=resclone -fabric_version=0.75.1+1.19.4 -libjf_version=3.5.0-SNAPSHOT -modmenu_version=6.1.0-beta.3 \ No newline at end of file +fabric_version=0.75.3+1.19.4 +libjf_version=3.6.0 +modmenu_version=6.1.0-rc.1 \ No newline at end of file diff --git a/src/main/java/io/gitlab/jfronny/resclone/Resclone.java b/src/main/java/io/gitlab/jfronny/resclone/Resclone.java index b6a2752..1feef5e 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/Resclone.java +++ b/src/main/java/io/gitlab/jfronny/resclone/Resclone.java @@ -2,11 +2,10 @@ package io.gitlab.jfronny.resclone; import io.gitlab.jfronny.commons.log.Logger; import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders; -import io.gitlab.jfronny.resclone.api.*; import io.gitlab.jfronny.resclone.data.PackMetaLoaded; import io.gitlab.jfronny.resclone.data.PackMetaUnloaded; -import io.gitlab.jfronny.resclone.processors.RemoveEmptyProcessor; -import io.gitlab.jfronny.resclone.processors.RootPathProcessor; +import io.gitlab.jfronny.resclone.fetchers.*; +import io.gitlab.jfronny.resclone.processors.*; import io.gitlab.jfronny.resclone.util.PackUrlCache; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; @@ -20,8 +19,7 @@ import java.util.concurrent.*; import java.util.stream.Collectors; import java.util.stream.Stream; -public class Resclone implements ModInitializer, RescloneApi { - public static final Set CONF = new LinkedHashSet<>(); +public class Resclone implements ModInitializer { public static final Map FETCHER_INSTANCES = new LinkedHashMap<>(); public static final Set PROCESSORS = new LinkedHashSet<>(); public static final Set DOWNLOADED_PACKS = new LinkedHashSet<>(); @@ -38,7 +36,6 @@ public class Resclone implements ModInitializer, RescloneApi { public static PackUrlCache urlCache; public static int packCount = 0; - private boolean pruneUnused = false; @Override public void onInitialize() { @@ -46,75 +43,66 @@ public class Resclone implements ModInitializer, RescloneApi { GsonHolders.registerSerializer(); urlCache = new PackUrlCache(getConfigPath().resolve("urlCache.properties")); - CONF.clear(); FETCHER_INSTANCES.clear(); PROCESSORS.clear(); DOWNLOADED_PACKS.clear(); addProcessor(new RootPathProcessor()); //This should be run before any other processor to make sure the path is valid - for (RescloneEntry entry : FabricLoader.getInstance().getEntrypoints(MOD_ID, RescloneEntry.class)) { - try { - entry.init(this); - } catch (Exception e) { - Resclone.LOGGER.error("Could not initialize resclone pack supplier", e); - } - } + addFetcher(new BasicFileFetcher()); + addFetcher(new GitHubFetcher()); + addFetcher(new CurseforgeFetcher()); + addFetcher(new ModrinthFetcher()); + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) addProcessor(new PruneVanillaProcessor()); addProcessor(new RemoveEmptyProcessor()); reload(); LOGGER.info("Installed {} resource pack{}.", packCount, packCount == 1 ? "" : "s"); } - @Override public void addFetcher(PackFetcher fetcher) { FETCHER_INSTANCES.put(fetcher.getSourceTypeName(), fetcher); } - @Override public void addProcessor(PackProcessor processor) { PROCESSORS.add(processor); } - @Override public void addPack(String fetcher, String pack, String name) { addPack(fetcher, pack, name, false); } - @Override public void addPack(String fetcher, String pack, String name, boolean forceRedownload) { addPack(fetcher, pack, name, forceRedownload, false); } - @Override public void addPack(String fetcher, String pack, String name, boolean forceRedownload, boolean forceEnable) { - CONF.add(new PackMetaUnloaded(fetcher, pack, name, forceRedownload, forceEnable)); + RescloneConfig.packs.add(new PackMetaUnloaded(fetcher, pack, name, forceRedownload, forceEnable)); } - @Override public void reload() { Set metas = new LinkedHashSet<>(); - try { - if (CONF.isEmpty()) { - LOGGER.info("No resclone pack was specified, add one"); - } - else { - ExecutorService pool = Executors.newFixedThreadPool(CONF.size()); - for (PackMetaUnloaded s : CONF) { + if (RescloneConfig.packs.isEmpty()) { + LOGGER.info("No resclone pack was specified, add one"); + } + else { + try { + ExecutorService pool = Executors.newFixedThreadPool(RescloneConfig.packs.size()); + for (PackMetaUnloaded s : RescloneConfig.packs) { pool.submit(generateTask(s, metas)); } pool.shutdown(); if (!pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS)) { LOGGER.error("Download timed out. This shouldn't be possible"); } + } catch (InterruptedException e) { + LOGGER.error("Could not execute pack download task", e); } - } catch (InterruptedException e) { - LOGGER.error("Could not execute pack download task", e); } urlCache.save(); DOWNLOADED_PACKS.clear(); DOWNLOADED_PACKS.addAll(metas); - if (pruneUnused) pruneCache(); + if (RescloneConfig.pruneUnused) pruneCache(); } private Runnable generateTask(PackMetaUnloaded meta, Set metas) { @@ -175,9 +163,8 @@ public class Resclone implements ModInitializer, RescloneApi { } } - @Override - public Path getConfigPath() { - Path configPath = FabricLoader.getInstance().getConfigDir().resolve("resclone"); + public static Path getConfigPath() { + Path configPath = FabricLoader.getInstance().getConfigDir().resolve(MOD_ID); if (!Files.isDirectory(configPath.resolve("cache"))) { try { Files.createDirectories(configPath.resolve("cache")); @@ -187,9 +174,4 @@ public class Resclone implements ModInitializer, RescloneApi { } return configPath; } - - @Override - public void setPruneUnused(boolean pruneUnused) { - this.pruneUnused = pruneUnused; - } } diff --git a/src/main/java/io/gitlab/jfronny/resclone/RescloneConfig.java b/src/main/java/io/gitlab/jfronny/resclone/RescloneConfig.java new file mode 100644 index 0000000..b55eb38 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/resclone/RescloneConfig.java @@ -0,0 +1,111 @@ +package io.gitlab.jfronny.resclone; + +import com.google.gson.reflect.TypeToken; +import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders; +import io.gitlab.jfronny.gson.JsonParseException; +import io.gitlab.jfronny.gson.stream.*; +import io.gitlab.jfronny.libjf.config.api.v1.JfCustomConfig; +import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL; +import io.gitlab.jfronny.resclone.data.PackMetaUnloaded; + +import java.io.*; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; + +public class RescloneConfig implements JfCustomConfig { + public static Set packs; + public static boolean pruneUnused; + + private static final String PACKS = "packs"; + private static final String PRUNE_UNUSED = "pruneUnused"; + private static final Type META_SET = new TypeToken>(){}.getType(); + + private static void load(Path path) throws IOException { + if (!Files.exists(path)) { + packs = new HashSet<>(); + pruneUnused = true; + write(path); + return; + } + + boolean updateRequired = false; + try (BufferedReader br = Files.newBufferedReader(path); + JsonReader reader = GsonHolders.CONFIG.getGson().newJsonReader(br)) { + if (reader.peek() == JsonToken.BEGIN_ARRAY) { + // Legacy format compatibility + packs = GsonHolders.CONFIG.getGson().fromJson(reader, META_SET); + updateRequired = true; + } else if (reader.peek() == JsonToken.BEGIN_OBJECT) { + // New format + reader.beginObject(); + Set packs = null; + Boolean pruneUnused = null; + while (reader.peek() != JsonToken.END_OBJECT) { + final String name = reader.nextName(); + switch (name) { + case PACKS -> { + if (packs != null) throw new JsonParseException("Unexpected duplicate \"" + PACKS + "\" in Resclone config"); + packs = GsonHolders.CONFIG.getGson().fromJson(reader, META_SET); + } + case PRUNE_UNUSED -> { + if (pruneUnused != null) throw new JsonParseException("Unexpected duplicate \"" + PRUNE_UNUSED + "\" in Resclone config"); + pruneUnused = reader.nextBoolean(); + } + default -> throw new JsonParseException("Unexpected element: \"" + name + "\" in Resclone config"); + } + } + reader.endObject(); + if (packs == null) throw new JsonParseException("Expected Resclone config object to contain packs"); + if (pruneUnused == null) { + pruneUnused = true; + updateRequired = true; + } + RescloneConfig.packs = packs; + RescloneConfig.pruneUnused = pruneUnused; + } else throw new JsonParseException("Expected Resclone config to be an object or array"); + } + if (updateRequired) write(path); + } + + private static void write(Path path) throws IOException { + try (BufferedWriter bw = Files.newBufferedWriter(path); + JsonWriter writer = GsonHolders.CONFIG.getGson().newJsonWriter(bw)) { + writer.beginObject() + .comment("The packs to be loaded by resclone") + .name(PACKS); + GsonHolders.CONFIG.getGson().toJson(packs, META_SET, writer); + writer.comment("Whether to prune unused packs from the cache") + .name(PRUNE_UNUSED) + .value(pruneUnused) + .endObject(); + } + } + + static { + Path path = Resclone.getConfigPath().resolve("config.json"); + DSL.create(Resclone.MOD_ID).register(builder -> + builder.setLoadMethod(configInstance -> { + try { + load(path); + } catch (IOException e) { + Resclone.LOGGER.error("Could not load config", e); + } + }).setWriteMethod(configInstance -> { + try { + write(path); + } catch (IOException e) { + Resclone.LOGGER.error("Could not write config", e); + } + }).setPath(path) + .>value(PACKS, new HashSet<>(), Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, io.gitlab.jfronny.libjf.config.api.v1.type.Type.ofClass(META_SET), 100, () -> packs, p -> packs = p) + .value(PRUNE_UNUSED, pruneUnused, () -> pruneUnused, p -> pruneUnused = p) + ).load(); + } + + @Override + public void register(DSL.Defaulted dsl) { + } +} diff --git a/src/main/java/io/gitlab/jfronny/resclone/RescloneEntryDefault.java b/src/main/java/io/gitlab/jfronny/resclone/RescloneEntryDefault.java deleted file mode 100644 index e71da02..0000000 --- a/src/main/java/io/gitlab/jfronny/resclone/RescloneEntryDefault.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.gitlab.jfronny.resclone; - -import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders; -import io.gitlab.jfronny.resclone.api.RescloneApi; -import io.gitlab.jfronny.resclone.api.RescloneEntry; -import io.gitlab.jfronny.resclone.fetchers.*; -import io.gitlab.jfronny.resclone.processors.PruneVanillaProcessor; -import io.gitlab.jfronny.resclone.util.config.*; -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.FabricLoader; - -public class RescloneEntryDefault implements RescloneEntry { - @Override - public void init(RescloneApi api) { - GsonHolders.registerTypeAdapter(RescloneConfig.class, new RescloneConfigTypeAdapter()); - api.addFetcher(new BasicFileFetcher()); - api.addFetcher(new GitHubFetcher()); - api.addFetcher(new CurseforgeFetcher()); - api.addFetcher(new ModrinthFetcher()); - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) - api.addProcessor(new PruneVanillaProcessor()); - ConfigLoader.load(api); - } -} diff --git a/src/main/java/io/gitlab/jfronny/resclone/api/RescloneApi.java b/src/main/java/io/gitlab/jfronny/resclone/api/RescloneApi.java deleted file mode 100644 index 26aa619..0000000 --- a/src/main/java/io/gitlab/jfronny/resclone/api/RescloneApi.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.gitlab.jfronny.resclone.api; - -import java.nio.file.Path; - -public interface RescloneApi { - void addFetcher(PackFetcher fetcher); - - void addProcessor(PackProcessor processor); - - void addPack(String fetcher, String pack, String name); - - void addPack(String fetcher, String pack, String name, boolean forceRedownload); - - void addPack(String fetcher, String pack, String name, boolean forceRedownload, boolean forceEnable); - - void reload(); - - Path getConfigPath(); - - void setPruneUnused(boolean pruneUnused); -} diff --git a/src/main/java/io/gitlab/jfronny/resclone/api/RescloneEntry.java b/src/main/java/io/gitlab/jfronny/resclone/api/RescloneEntry.java deleted file mode 100644 index 1c14397..0000000 --- a/src/main/java/io/gitlab/jfronny/resclone/api/RescloneEntry.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.gitlab.jfronny.resclone.api; - -public interface RescloneEntry { - void init(RescloneApi api) throws Exception; -} diff --git a/src/main/java/io/gitlab/jfronny/resclone/fetchers/BasePackFetcher.java b/src/main/java/io/gitlab/jfronny/resclone/fetchers/BasePackFetcher.java index 5cc87b7..ceb673e 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/fetchers/BasePackFetcher.java +++ b/src/main/java/io/gitlab/jfronny/resclone/fetchers/BasePackFetcher.java @@ -2,7 +2,6 @@ package io.gitlab.jfronny.resclone.fetchers; import io.gitlab.jfronny.commons.HttpUtils; import io.gitlab.jfronny.resclone.Resclone; -import io.gitlab.jfronny.resclone.api.PackFetcher; import java.io.*; import java.nio.file.Files; diff --git a/src/main/java/io/gitlab/jfronny/resclone/api/PackFetcher.java b/src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java similarity index 86% rename from src/main/java/io/gitlab/jfronny/resclone/api/PackFetcher.java rename to src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java index b7e3c3f..e8ee888 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/api/PackFetcher.java +++ b/src/main/java/io/gitlab/jfronny/resclone/fetchers/PackFetcher.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.resclone.api; +package io.gitlab.jfronny.resclone.fetchers; import java.nio.file.Path; diff --git a/src/main/java/io/gitlab/jfronny/resclone/api/PackProcessor.java b/src/main/java/io/gitlab/jfronny/resclone/processors/PackProcessor.java similarity index 71% rename from src/main/java/io/gitlab/jfronny/resclone/api/PackProcessor.java rename to src/main/java/io/gitlab/jfronny/resclone/processors/PackProcessor.java index a859dcb..8f9d4aa 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/api/PackProcessor.java +++ b/src/main/java/io/gitlab/jfronny/resclone/processors/PackProcessor.java @@ -1,4 +1,4 @@ -package io.gitlab.jfronny.resclone.api; +package io.gitlab.jfronny.resclone.processors; import java.nio.file.FileSystem; diff --git a/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java b/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java index f8b2072..361619a 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java +++ b/src/main/java/io/gitlab/jfronny/resclone/processors/PruneVanillaProcessor.java @@ -1,7 +1,6 @@ package io.gitlab.jfronny.resclone.processors; import io.gitlab.jfronny.resclone.Resclone; -import io.gitlab.jfronny.resclone.api.PackProcessor; import io.gitlab.jfronny.resclone.util.io.PathPruneVisitor; import net.minecraft.server.MinecraftServer; import org.apache.commons.io.IOUtils; diff --git a/src/main/java/io/gitlab/jfronny/resclone/processors/RemoveEmptyProcessor.java b/src/main/java/io/gitlab/jfronny/resclone/processors/RemoveEmptyProcessor.java index 464db97..9e36f87 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/processors/RemoveEmptyProcessor.java +++ b/src/main/java/io/gitlab/jfronny/resclone/processors/RemoveEmptyProcessor.java @@ -1,7 +1,6 @@ package io.gitlab.jfronny.resclone.processors; import io.gitlab.jfronny.resclone.Resclone; -import io.gitlab.jfronny.resclone.api.PackProcessor; import io.gitlab.jfronny.resclone.util.io.PathPruneVisitor; import java.io.IOException; diff --git a/src/main/java/io/gitlab/jfronny/resclone/processors/RootPathProcessor.java b/src/main/java/io/gitlab/jfronny/resclone/processors/RootPathProcessor.java index ae367bf..3e726ae 100644 --- a/src/main/java/io/gitlab/jfronny/resclone/processors/RootPathProcessor.java +++ b/src/main/java/io/gitlab/jfronny/resclone/processors/RootPathProcessor.java @@ -1,6 +1,5 @@ package io.gitlab.jfronny.resclone.processors; -import io.gitlab.jfronny.resclone.api.PackProcessor; import io.gitlab.jfronny.resclone.util.io.MoveDirVisitor; import java.io.IOException; diff --git a/src/main/java/io/gitlab/jfronny/resclone/util/config/ConfigLoader.java b/src/main/java/io/gitlab/jfronny/resclone/util/config/ConfigLoader.java deleted file mode 100644 index bb333a5..0000000 --- a/src/main/java/io/gitlab/jfronny/resclone/util/config/ConfigLoader.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.gitlab.jfronny.resclone.util.config; - -import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders; -import io.gitlab.jfronny.resclone.Resclone; -import io.gitlab.jfronny.resclone.api.RescloneApi; -import io.gitlab.jfronny.resclone.data.PackMetaUnloaded; - -import java.io.BufferedReader; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashSet; -import java.util.Set; - -public class ConfigLoader { - public static void load(RescloneApi api) { - Path configPath = api.getConfigPath().resolve("config.json"); - if (!Files.exists(configPath)) { - save(api, new HashSet<>(), true); - } - try (BufferedReader reader = Files.newBufferedReader(configPath)) { - RescloneConfig data = GsonHolders.CONFIG.getGson().fromJson(reader, RescloneConfig.class); - api.setPruneUnused(data.pruneUnused()); - for (PackMetaUnloaded meta : data.packs()) { - api.addPack(meta.fetcher, meta.source, meta.name, meta.forceDownload, meta.forceEnable); - } - if (data.updateRequired()) { - save(api, data.packs(), data.pruneUnused()); - } - } catch (IOException e) { - Resclone.LOGGER.error("Could not load config", e); - } - } - - public static void save(RescloneApi api, Set packs, boolean pruneUnused) { - try (var writer = Files.newBufferedWriter(api.getConfigPath().resolve("config.json"))) { - GsonHolders.CONFIG.getGson().toJson(new RescloneConfig(packs, pruneUnused), writer); - } catch (IOException e) { - Resclone.LOGGER.error("Could not write config", e); - } - } -} diff --git a/src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfig.java b/src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfig.java deleted file mode 100644 index 191348a..0000000 --- a/src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.gitlab.jfronny.resclone.util.config; - -import io.gitlab.jfronny.resclone.data.PackMetaUnloaded; - -import java.util.Set; - -public record RescloneConfig(Set packs, boolean pruneUnused, boolean updateRequired) { - public RescloneConfig(Set packs, boolean pruneUnused) { - this(packs, pruneUnused, false); - } -} diff --git a/src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfigTypeAdapter.java b/src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfigTypeAdapter.java deleted file mode 100644 index f658d23..0000000 --- a/src/main/java/io/gitlab/jfronny/resclone/util/config/RescloneConfigTypeAdapter.java +++ /dev/null @@ -1,65 +0,0 @@ -package io.gitlab.jfronny.resclone.util.config; - -import com.google.gson.reflect.TypeToken; -import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders; -import io.gitlab.jfronny.gson.JsonParseException; -import io.gitlab.jfronny.gson.TypeAdapter; -import io.gitlab.jfronny.gson.stream.*; -import io.gitlab.jfronny.resclone.data.PackMetaUnloaded; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.Set; - -public class RescloneConfigTypeAdapter extends TypeAdapter { - private static final String PACKS = "packs"; - private static final String PRUNE_UNUSED = "pruneUnused"; - private static final Type META_SET = new TypeToken>(){}.getType(); - - @Override - public RescloneConfig read(JsonReader jsonReader) throws IOException { - if (jsonReader.peek() == JsonToken.BEGIN_ARRAY) { - // Legacy format compatibility - return new RescloneConfig(GsonHolders.CONFIG.getGson().fromJson(jsonReader, META_SET), false, true); - } else if (jsonReader.peek() == JsonToken.BEGIN_OBJECT) { - // New format - jsonReader.beginObject(); - Set packs = null; - Boolean pruneUnused = null; - boolean updateRequired = false; - while (jsonReader.peek() != JsonToken.END_OBJECT) { - final String name = jsonReader.nextName(); - switch (name) { - case PACKS -> { - if (packs != null) throw new JsonParseException("Unexpected duplicate \"" + PACKS + "\" in Resclone config"); - packs = GsonHolders.CONFIG.getGson().fromJson(jsonReader, META_SET); - } - case PRUNE_UNUSED -> { - if (pruneUnused != null) throw new JsonParseException("Unexpected duplicate \"" + PRUNE_UNUSED + "\" in Resclone config"); - pruneUnused = jsonReader.nextBoolean(); - } - default -> throw new JsonParseException("Unexpected element: \"" + name + "\" in Resclone config"); - } - } - jsonReader.endObject(); - if (packs == null) throw new JsonParseException("Expected Resclone config object to contain packs"); - if (pruneUnused == null) { - pruneUnused = true; - updateRequired = true; - } - return new RescloneConfig(packs, pruneUnused, updateRequired); - } else throw new JsonParseException("Expected Resclone config to be an object or array"); - } - - @Override - public void write(JsonWriter jsonWriter, RescloneConfig rescloneConfig) throws IOException { - jsonWriter.beginObject() - .comment("The packs to be loaded by resclone") - .name(PACKS); - GsonHolders.CONFIG.getGson().toJson(rescloneConfig.packs(), META_SET, jsonWriter); - jsonWriter.comment("Whether to prune unused packs from the cache") - .name(PRUNE_UNUSED) - .value(rescloneConfig.pruneUnused()) - .endObject(); - } -} diff --git a/src/main/resources/assets/resclone/lang/en_us.json b/src/main/resources/assets/resclone/lang/en_us.json new file mode 100644 index 0000000..5010bc0 --- /dev/null +++ b/src/main/resources/assets/resclone/lang/en_us.json @@ -0,0 +1,7 @@ +{ + "resclone.jfconfig.title": "Resclone", + "resclone.jfconfig.packs": "Packs", + "resclone.jfconfig.packs.tooltip": "The packs to download and add", + "resclone.jfconfig.pruneUnused": "Prune Unused", + "resclone.jfconfig.pruneUnused.tooltip": "Automatically remove all downloaded packs that are not in the config to free up unneeded space" +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3be79af..d309576 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -16,7 +16,9 @@ "environment": "*", "entrypoints": { "main": ["io.gitlab.jfronny.resclone.Resclone"], - "resclone": ["io.gitlab.jfronny.resclone.RescloneEntryDefault"] + "libjf:config": [ + "io.gitlab.jfronny.resclone.RescloneConfig" + ] }, "mixins": [ "resclone.mixins.json",