diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-05-13 16:11:24 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-13 16:11:24 -0400 |
commit | 2d1b82d02257548fde4aeac350ae3a200975e295 (patch) | |
tree | decb87987d8a4246007e1cfff89d53a3b4970d1c /src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java | |
parent | 5eb9d273d2eb56cebaf0be0f90716b362916400b (diff) | |
parent | 5591340b63c1abfd2f3657ee423ba16005503704 (diff) | |
download | Skyblocker-2d1b82d02257548fde4aeac350ae3a200975e295.tar.gz Skyblocker-2d1b82d02257548fde4aeac350ae3a200975e295.tar.bz2 Skyblocker-2d1b82d02257548fde4aeac350ae3a200975e295.zip |
Merge pull request #701 from SkyblockerMod/datafixer
Config Data Fixer
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java new file mode 100644 index 00000000..97261c76 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java @@ -0,0 +1,90 @@ +package de.hysky.skyblocker.config.datafixer; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.datafixers.DSL; +import com.mojang.datafixers.DataFixer; +import com.mojang.datafixers.DataFixerBuilder; +import com.mojang.datafixers.schemas.Schema; +import com.mojang.logging.LogUtils; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.datafixer.JsonHelper; +import net.fabricmc.loader.api.FabricLoader; +import org.slf4j.Logger; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.nio.file.Files; +import java.nio.file.Path; + +public class ConfigDataFixer { + protected static final Logger LOGGER = LogUtils.getLogger(); + private static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir(); + public static final DSL.TypeReference CONFIG_TYPE = () -> "config"; + + public static void apply() { + apply(CONFIG_DIR.resolve("skyblocker.json"), CONFIG_DIR.resolve("skyblocker.json.old")); + } + + public static void apply(Path configDir, Path backupDir) { + //User is new - has no config file (or maybe config folder) + if (!Files.exists(CONFIG_DIR) || !Files.exists(configDir)) return; + + //Should never be null if the file exists unless its malformed JSON or something in which case well it gets reset + JsonObject oldConfig = loadConfig(configDir); + if (oldConfig == null || JsonHelper.getInt(oldConfig, "version").orElse(1) == SkyblockerConfigManager.CONFIG_VERSION) return; + + JsonObject newConfig = apply(oldConfig); + + //Write the updated file + if (!writeConfig(configDir, newConfig)) { + LOGGER.error(LogUtils.FATAL_MARKER, "[Skyblocker Config Data Fixer] Failed to fix up config file!"); + writeConfig(backupDir, oldConfig); + } + } + + public static JsonObject apply(JsonObject oldConfig) { + long start = System.currentTimeMillis(); + + JsonObject newConfig = build().update(CONFIG_TYPE, new Dynamic<>(JsonOps.INSTANCE, oldConfig), JsonHelper.getInt(oldConfig, "version").orElse(1), SkyblockerConfigManager.CONFIG_VERSION).getValue().getAsJsonObject(); + + long end = System.currentTimeMillis(); + LOGGER.info("[Skyblocker Config Data Fixer] Applied datafixers in {} ms!", end - start); + return newConfig; + } + + private static DataFixer build() { + DataFixerBuilder builder = new DataFixerBuilder(SkyblockerConfigManager.CONFIG_VERSION); + + builder.addSchema(1, ConfigSchema::new); + Schema schema2 = builder.addSchema(2, Schema::new); + builder.addFixer(new ConfigFix1(schema2, true)); + + return builder.buildUnoptimized(); + } + + private static JsonObject loadConfig(Path path) { + try (BufferedReader reader = Files.newBufferedReader(path)) { + return JsonParser.parseReader(reader).getAsJsonObject(); + } catch (Throwable t) { + LOGGER.error("[Skyblocker Config Data Fixer] Failed to load config file!", t); + } + + return null; + } + + private static boolean writeConfig(Path path, JsonObject config) { + try (BufferedWriter writer = Files.newBufferedWriter(path)) { + SkyblockerMod.GSON.toJson(config, writer); + + return true; + } catch (Throwable t) { + LOGGER.error("[Skyblocker Config Data Fixer] Failed to save config file at {}!", path, t); + } + + return false; + } +} |