aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java
blob: 915710f7b3a17f23753851a80a71c9d06c6ce134 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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.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 final int VERSION = 2;

	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) == 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) {
		DataFixerBuilder builder = new DataFixerBuilder(VERSION);
		builder.addSchema(1, ConfigSchema::new);
		Schema schema2 = builder.addSchema(2, Schema::new);
		builder.addFixer(new ConfigFix1(schema2, true));
		DataFixer dataFixer = builder.buildUnoptimized();

		long start = System.currentTimeMillis();

		JsonObject newConfig = dataFixer.update(CONFIG_TYPE, new Dynamic<>(JsonOps.INSTANCE, oldConfig), JsonHelper.getInt(oldConfig, "version").orElse(1), VERSION).getValue().getAsJsonObject();

		long end = System.currentTimeMillis();
		LOGGER.info("[Skyblocker Config Data Fixer] Applied datafixers in {} ms!", (end - start));
		return newConfig;
	}

	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;
	}
}