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