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