From 73836131ec1ee35a5ca800b9a0101d155253249f Mon Sep 17 00:00:00 2001
From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com>
Date: Tue, 21 Mar 2023 15:14:38 +0100
Subject: [PATCH] added more Abstraction for file saving
---
.../viafabricplus/ViaFabricPlus.java | 4 +-
.../bedrock/BedrockAccountHandler.java | 70 ++++++++++++++++
.../bedrock/BedrockAccountManager.java | 78 ------------------
.../MixinClientPlayerInteractionManager.java | 2 +-
.../screen/MixinConnectScreen_1.java | 4 +-
.../ViaFabricPlusHandItemProvider.java | 2 +-
.../usage}/ItemTranslator.java | 2 +-
.../screen/ProtocolSelectionScreen.java | 11 ---
.../settings/SettingsSystem.java | 79 +++++++------------
.../settings/groups/BedrockSettings.java | 9 +--
.../viafabricplus/util/FileSaver.java | 68 ++++++++++++++++
11 files changed, 179 insertions(+), 150 deletions(-)
create mode 100644 src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountHandler.java
delete mode 100644 src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java
rename src/main/java/de/florianmichael/viafabricplus/{util => protocolhack/usage}/ItemTranslator.java (97%)
create mode 100644 src/main/java/de/florianmichael/viafabricplus/util/FileSaver.java
diff --git a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
index 7a608949..82eb64d1 100644
--- a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
+++ b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
@@ -22,7 +22,7 @@ import com.google.gson.GsonBuilder;
import de.florianmichael.viafabricplus.definition.ChatLengthDefinition;
import de.florianmichael.viafabricplus.definition.ItemReleaseVersionDefinition;
import de.florianmichael.viafabricplus.definition.PackFormatsDefinition;
-import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountManager;
+import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
import de.florianmichael.viafabricplus.definition.c0_30.ClassicItemSelectionScreen;
import de.florianmichael.viafabricplus.definition.c0_30.protocol.CustomClassicProtocolExtensions;
import de.florianmichael.viafabricplus.definition.c0_30.command.ClassicProtocolCommands;
@@ -66,7 +66,7 @@ public class ViaFabricPlus {
ArmorPointsDefinition.load();
// Bedrock Stuff
- BedrockAccountManager.INSTANCE.load();
+ BedrockAccountHandler.create();
});
}
diff --git a/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountHandler.java b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountHandler.java
new file mode 100644
index 00000000..ff2e7fc5
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountHandler.java
@@ -0,0 +1,70 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/EnZaXD and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus.definition.bedrock;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import de.florianmichael.viafabricplus.util.FileSaver;
+import net.raphimc.mcauth.MinecraftAuth;
+import net.raphimc.mcauth.step.bedrock.StepMCChain;
+import net.raphimc.mcauth.util.MicrosoftConstants;
+import org.apache.http.impl.client.CloseableHttpClient;
+
+import java.util.Map;
+
+public class BedrockAccountHandler extends FileSaver {
+ public static BedrockAccountHandler INSTANCE;
+
+ public static void create() {
+ BedrockAccountHandler.INSTANCE = new BedrockAccountHandler();
+ BedrockAccountHandler.INSTANCE.init();
+ }
+
+ private StepMCChain.MCChain account;
+
+ public BedrockAccountHandler() {
+ super("bedrock.account");
+ }
+
+ @Override
+ public void write(JsonObject object) {
+ for (Map.Entry entry : account.toJson().entrySet()) {
+ object.add(entry.getKey(), entry.getValue());
+ }
+ }
+
+ @Override
+ public void read(JsonObject object) {
+ try {
+ account = MinecraftAuth.Bedrock.Title.MC_CHAIN.fromJson(object);
+ try (final CloseableHttpClient httpClient = MicrosoftConstants.createHttpClient()) {
+ account = MinecraftAuth.Bedrock.Title.MC_CHAIN.refresh(httpClient, account);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public StepMCChain.MCChain getAccount() {
+ return account;
+ }
+
+ public void setAccount(StepMCChain.MCChain account) {
+ this.account = account;
+ }
+}
diff --git a/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java
deleted file mode 100644
index e7809177..00000000
--- a/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
- * Copyright (C) 2021-2023 FlorianMichael/EnZaXD and contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-package de.florianmichael.viafabricplus.definition.bedrock;
-
-import com.google.gson.JsonObject;
-import de.florianmichael.viafabricplus.ViaFabricPlus;
-import net.raphimc.mcauth.MinecraftAuth;
-import net.raphimc.mcauth.step.bedrock.StepMCChain;
-import net.raphimc.mcauth.util.MicrosoftConstants;
-import org.apache.http.impl.client.CloseableHttpClient;
-
-import java.io.*;
-
-public class BedrockAccountManager {
- public final static BedrockAccountManager INSTANCE = new BedrockAccountManager();
-
- private final File ACCOUNT_FILE = new File(ViaFabricPlus.RUN_DIRECTORY, "bedrock.account");
- private StepMCChain.MCChain account;
-
- public void load() {
- if (ACCOUNT_FILE.exists()) {
- final JsonObject mcChain;
- try {
- mcChain = ViaFabricPlus.GSON.fromJson(new FileReader(ACCOUNT_FILE), JsonObject.class).getAsJsonObject();
- account = MinecraftAuth.Bedrock.Title.MC_CHAIN.fromJson(mcChain);
-
- try (final CloseableHttpClient httpClient = MicrosoftConstants.createHttpClient()) {
- account = MinecraftAuth.Bedrock.Title.MC_CHAIN.refresh(httpClient, account);
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- Runtime.getRuntime().addShutdownHook(new Thread(this::save));
- }
-
- public void save() {
- if (account != null) {
- ACCOUNT_FILE.delete();
- try {
- ACCOUNT_FILE.createNewFile();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- try (final FileWriter fw = new FileWriter(ACCOUNT_FILE)) {
- fw.write(ViaFabricPlus.GSON.toJson(account.toJson()));
- fw.flush();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- public StepMCChain.MCChain getAccount() {
- return account;
- }
-
- public void setAccount(StepMCChain.MCChain account) {
- this.account = account;
- }
-}
diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/MixinClientPlayerInteractionManager.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/MixinClientPlayerInteractionManager.java
index 77333855..1d99c5d2 100644
--- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/MixinClientPlayerInteractionManager.java
+++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/MixinClientPlayerInteractionManager.java
@@ -26,7 +26,7 @@ import de.florianmichael.viafabricplus.injection.access.IClientPlayerEntity;
import de.florianmichael.viafabricplus.injection.access.IScreenHandler;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.protocolhack.provider.viaversion.ViaFabricPlusHandItemProvider;
-import de.florianmichael.viafabricplus.util.ItemTranslator;
+import de.florianmichael.viafabricplus.protocolhack.usage.ItemTranslator;
import de.florianmichael.vialoadingbase.ViaLoadingBase;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/screen/MixinConnectScreen_1.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/screen/MixinConnectScreen_1.java
index 77618bd6..af8538af 100644
--- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/screen/MixinConnectScreen_1.java
+++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/minecraft/screen/MixinConnectScreen_1.java
@@ -20,7 +20,7 @@ package de.florianmichael.viafabricplus.injection.mixin.fixes.minecraft.screen;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.ProfileKey;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountManager;
+import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
import de.florianmichael.viafabricplus.injection.access.IPublicKeyData;
import de.florianmichael.viafabricplus.definition.v1_19_0.storage.ChatSession1_19_0;
import de.florianmichael.viafabricplus.definition.v1_19_2.storage.ChatSession1_19_2;
@@ -85,7 +85,7 @@ public class MixinConnectScreen_1 {
return;
}
if (ViaLoadingBase.getClassWrapper().getTargetVersion().isEqualTo(BedrockProtocolVersion.bedrockLatest)) {
- final StepMCChain.MCChain account = BedrockAccountManager.INSTANCE.getAccount();
+ final StepMCChain.MCChain account = BedrockAccountHandler.INSTANCE.getAccount();
if (account != null) {
userConnection.put(new AuthChainData(userConnection, account.mojangJwt(), account.identityJwt(), account.publicKey(), account.privateKey()));
diff --git a/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/viaversion/ViaFabricPlusHandItemProvider.java b/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/viaversion/ViaFabricPlusHandItemProvider.java
index 78b5f148..06752088 100644
--- a/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/viaversion/ViaFabricPlusHandItemProvider.java
+++ b/src/main/java/de/florianmichael/viafabricplus/protocolhack/provider/viaversion/ViaFabricPlusHandItemProvider.java
@@ -21,7 +21,7 @@ import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.api.minecraft.item.Item;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
import com.viaversion.viaversion.protocols.protocol1_9to1_8.providers.HandItemProvider;
-import de.florianmichael.viafabricplus.util.ItemTranslator;
+import de.florianmichael.viafabricplus.protocolhack.usage.ItemTranslator;
import net.minecraft.item.ItemStack;
public class ViaFabricPlusHandItemProvider extends HandItemProvider {
diff --git a/src/main/java/de/florianmichael/viafabricplus/util/ItemTranslator.java b/src/main/java/de/florianmichael/viafabricplus/protocolhack/usage/ItemTranslator.java
similarity index 97%
rename from src/main/java/de/florianmichael/viafabricplus/util/ItemTranslator.java
rename to src/main/java/de/florianmichael/viafabricplus/protocolhack/usage/ItemTranslator.java
index 7bcc0566..550f329a 100644
--- a/src/main/java/de/florianmichael/viafabricplus/util/ItemTranslator.java
+++ b/src/main/java/de/florianmichael/viafabricplus/protocolhack/usage/ItemTranslator.java
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package de.florianmichael.viafabricplus.util;
+package de.florianmichael.viafabricplus.protocolhack.usage;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
diff --git a/src/main/java/de/florianmichael/viafabricplus/screen/ProtocolSelectionScreen.java b/src/main/java/de/florianmichael/viafabricplus/screen/ProtocolSelectionScreen.java
index 181d75fa..7a45a9e4 100644
--- a/src/main/java/de/florianmichael/viafabricplus/screen/ProtocolSelectionScreen.java
+++ b/src/main/java/de/florianmichael/viafabricplus/screen/ProtocolSelectionScreen.java
@@ -19,31 +19,20 @@ package de.florianmichael.viafabricplus.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
-import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountManager;
import de.florianmichael.viafabricplus.screen.settings.SettingsScreen;
-import de.florianmichael.viafabricplus.settings.groups.GeneralSettings;
import de.florianmichael.vialoadingbase.ViaLoadingBase;
import de.florianmichael.vialoadingbase.platform.InternalProtocolList;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.screen.NoticeScreen;
import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.TitleScreen;
-import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.sound.SoundEvents;
import net.minecraft.text.Text;
-import net.minecraft.util.Util;
-import net.raphimc.mcauth.MinecraftAuth;
import java.awt.*;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.concurrent.CompletableFuture;
@SuppressWarnings({"DataFlowIssue", "DuplicatedCode"})
public class ProtocolSelectionScreen extends Screen {
diff --git a/src/main/java/de/florianmichael/viafabricplus/settings/SettingsSystem.java b/src/main/java/de/florianmichael/viafabricplus/settings/SettingsSystem.java
index de7b4158..e36cd1d4 100644
--- a/src/main/java/de/florianmichael/viafabricplus/settings/SettingsSystem.java
+++ b/src/main/java/de/florianmichael/viafabricplus/settings/SettingsSystem.java
@@ -18,24 +18,26 @@
package de.florianmichael.viafabricplus.settings;
import com.google.gson.JsonObject;
-import de.florianmichael.viafabricplus.ViaFabricPlus;
import de.florianmichael.viafabricplus.event.InitializeSettingsCallback;
import de.florianmichael.viafabricplus.settings.base.AbstractSetting;
import de.florianmichael.viafabricplus.settings.base.SettingGroup;
import de.florianmichael.viafabricplus.settings.groups.*;
+import de.florianmichael.viafabricplus.util.FileSaver;
import de.florianmichael.vialoadingbase.ViaLoadingBase;
import de.florianmichael.vialoadingbase.platform.InternalProtocolList;
-import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-public class SettingsSystem {
- private final File CONFIG_FILE = new File(ViaFabricPlus.RUN_DIRECTORY, "settings.json");
-
+public class SettingsSystem extends FileSaver {
private final List groups = new ArrayList<>();
+ public SettingsSystem() {
+ super("settings.json");
+ }
+
+ @Override
public void init() {
addGroup(
GeneralSettings.INSTANCE,
@@ -48,56 +50,35 @@ public class SettingsSystem {
InitializeSettingsCallback.EVENT.invoker().onInitializeSettings();
- loadConfig();
- Runtime.getRuntime().addShutdownHook(new Thread(this::save));
+ super.init();
+ }
+
+ @Override
+ public void write(JsonObject object) {
+ object.addProperty("protocol", ViaLoadingBase.getClassWrapper().getTargetVersion().getVersion());
+ for (SettingGroup group : groups) {
+ for (AbstractSetting> setting : group.getSettings()) {
+ setting.write(object);
+ }
+ }
+ }
+
+ @Override
+ public void read(JsonObject object) {
+ if (object.has("protocol")) {
+ ViaLoadingBase.getClassWrapper().reload(InternalProtocolList.fromProtocolId(object.get("protocol").getAsInt()));
+ }
+ for (SettingGroup group : groups) {
+ for (AbstractSetting> setting : group.getSettings()) {
+ setting.read(object);
+ }
+ }
}
public void addGroup(final SettingGroup... groups) {
Collections.addAll(this.groups, groups);
}
- public void loadConfig() {
- if (CONFIG_FILE.exists()) {
- final JsonObject parentNode;
- try {
- parentNode = ViaFabricPlus.GSON.fromJson(new FileReader(CONFIG_FILE), JsonObject.class).getAsJsonObject();
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
- }
- if (parentNode.has("protocol")) {
- ViaLoadingBase.getClassWrapper().reload(InternalProtocolList.fromProtocolId(parentNode.get("protocol").getAsInt()));
- }
- for (SettingGroup group : groups) {
- for (AbstractSetting> setting : group.getSettings()) {
- setting.read(parentNode);
- }
- }
- }
- }
-
- public void save() {
- CONFIG_FILE.delete();
- try {
- CONFIG_FILE.createNewFile();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- try (final FileWriter fw = new FileWriter(CONFIG_FILE)) {
- final JsonObject parentNode = new JsonObject();
- parentNode.addProperty("protocol", ViaLoadingBase.getClassWrapper().getTargetVersion().getVersion());
- for (SettingGroup group : groups) {
- for (AbstractSetting> setting : group.getSettings()) {
- setting.write(parentNode);
- }
- }
- fw.write(ViaFabricPlus.GSON.toJson(parentNode));
- fw.flush();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
public List getGroups() {
return groups;
}
diff --git a/src/main/java/de/florianmichael/viafabricplus/settings/groups/BedrockSettings.java b/src/main/java/de/florianmichael/viafabricplus/settings/groups/BedrockSettings.java
index 762f68a7..98b8681f 100644
--- a/src/main/java/de/florianmichael/viafabricplus/settings/groups/BedrockSettings.java
+++ b/src/main/java/de/florianmichael/viafabricplus/settings/groups/BedrockSettings.java
@@ -17,7 +17,7 @@
*/
package de.florianmichael.viafabricplus.settings.groups;
-import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountManager;
+import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
import de.florianmichael.viafabricplus.screen.ProtocolSelectionScreen;
import de.florianmichael.viafabricplus.screen.settings.SettingsScreen;
import de.florianmichael.viafabricplus.settings.base.SettingGroup;
@@ -28,7 +28,6 @@ import net.minecraft.client.gui.screen.TitleScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
import net.minecraft.util.Util;
import net.raphimc.mcauth.MinecraftAuth;
@@ -41,7 +40,7 @@ public class BedrockSettings extends SettingGroup {
public final ButtonSetting BEDROCK_ACCOUNT = new ButtonSetting(this, Text.translatable("bedrock.viafabricplus.set"), () -> CompletableFuture.runAsync(() -> {
try {
- BedrockAccountManager.INSTANCE.setAccount(MinecraftAuth.requestBedrockLogin(msaDeviceCode -> {
+ BedrockAccountHandler.INSTANCE.setAccount(MinecraftAuth.requestBedrockLogin(msaDeviceCode -> {
MinecraftClient.getInstance().execute(() -> MinecraftClient.getInstance().setScreen(new NoticeScreen(() -> {
MinecraftClient.getInstance().setScreen(SettingsScreen.get(new MultiplayerScreen(new TitleScreen())));
Thread.currentThread().interrupt();
@@ -62,8 +61,8 @@ public class BedrockSettings extends SettingGroup {
})) {
@Override
public MutableText displayValue() {
- if (BedrockAccountManager.INSTANCE.getAccount() != null) {
- return Text.literal("Bedrock account: " + BedrockAccountManager.INSTANCE.getAccount().displayName());
+ if (BedrockAccountHandler.INSTANCE.getAccount() != null) {
+ return Text.literal("Bedrock account: " + BedrockAccountHandler.INSTANCE.getAccount().displayName());
}
return super.displayValue();
}
diff --git a/src/main/java/de/florianmichael/viafabricplus/util/FileSaver.java b/src/main/java/de/florianmichael/viafabricplus/util/FileSaver.java
new file mode 100644
index 00000000..c8f658ae
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/util/FileSaver.java
@@ -0,0 +1,68 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/EnZaXD and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus.util;
+
+import com.google.gson.JsonObject;
+import de.florianmichael.viafabricplus.ViaFabricPlus;
+
+import java.io.*;
+
+public abstract class FileSaver {
+ private final File file;
+
+ public FileSaver(final String name) {
+ file = new File(ViaFabricPlus.RUN_DIRECTORY, name);
+ }
+
+ public void init() {
+ if (file.exists()) {
+ final JsonObject parentNode;
+ try {
+ parentNode = ViaFabricPlus.GSON.fromJson(new FileReader(file), JsonObject.class).getAsJsonObject();
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ read(parentNode);
+ }
+
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ file.delete();
+ try {
+ file.createNewFile();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ try (final FileWriter fw = new FileWriter(file)) {
+ final JsonObject parentNode = new JsonObject();
+ write(parentNode);
+ fw.write(ViaFabricPlus.GSON.toJson(parentNode));
+ fw.flush();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }));
+ }
+
+ public abstract void write(final JsonObject object);
+ public abstract void read(final JsonObject object);
+
+ public File getFile() {
+ return file;
+ }
+}