From b6480365ad220b511ad6a2022063dfa3ed9292e8 Mon Sep 17 00:00:00 2001 From: axolotlmaid Date: Sat, 29 Jun 2024 14:38:18 +0100 Subject: [PATCH] Add profile configuration --- .../optionsprofiles/OptionsProfilesMod.java | 3 + .../gui/EditProfileScreen.java | 2 +- .../profiles/ProfileConfiguration.java | 60 +++++++++++++++++++ .../optionsprofiles/profiles/Profiles.java | 50 ++++++++++++---- 4 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/ProfileConfiguration.java diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java index fb36377..a8a719a 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/OptionsProfilesMod.java @@ -1,5 +1,6 @@ package com.axolotlmaid.optionsprofiles; +import com.axolotlmaid.optionsprofiles.profiles.Profiles; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -22,5 +23,7 @@ public class OptionsProfilesMod { LOGGER.error("An error occurred when creating the 'options-profiles' directory.", e); } } + + Profiles.updateProfiles(); } } diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java index 8565521..02707cb 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/gui/EditProfileScreen.java @@ -27,7 +27,7 @@ public class EditProfileScreen extends Screen { this.addWidget(this.profileNameEdit); this.addRenderableWidget(Button.builder(Component.translatable("gui.optionsprofiles.overwrite-options"), (button) -> { - Profiles.writeProfile(profileName.getString()); + Profiles.writeProfile(profileName.getString(), true); this.minecraft.setScreen(this.lastScreen); }).size(100, 20).pos(this.width / 2 - 50, 145).build()); diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/ProfileConfiguration.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/ProfileConfiguration.java new file mode 100644 index 0000000..9573746 --- /dev/null +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/ProfileConfiguration.java @@ -0,0 +1,60 @@ +package com.axolotlmaid.optionsprofiles.profiles; + +import com.axolotlmaid.optionsprofiles.OptionsProfilesMod; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class ProfileConfiguration { + private static final Path profilesDirectory = Profiles.PROFILES_DIRECTORY; + + private boolean keybindingsOnly = false; + + public ProfileConfiguration save(String profileName) { + ProfileConfiguration configuration = new ProfileConfiguration(); + + Path profile = profilesDirectory.resolve(profileName); + Path configurationFile = profile.resolve("configuration.json"); + + Gson gson = new GsonBuilder() + .setPrettyPrinting() + .create(); + + try (BufferedWriter writer = Files.newBufferedWriter(configurationFile)) { + gson.toJson(this, writer); + } catch (IOException e) { + OptionsProfilesMod.LOGGER.error("Unable to write configuration.json to profile!", e); + } + + return configuration; + } + + public static ProfileConfiguration get(String profileName) { + ProfileConfiguration configuration = new ProfileConfiguration(); + + Path profile = profilesDirectory.resolve(profileName); + Path configurationFile = profile.resolve("configuration.json"); + + try (BufferedReader reader = Files.newBufferedReader(configurationFile)) { + Gson gson = new Gson(); + configuration = gson.fromJson(reader, ProfileConfiguration.class); + } catch (IOException e) { + OptionsProfilesMod.LOGGER.error("[Profile '{}']: An error occurred when reading configuration.json", profileName, e); + } + + return configuration; + } + + public boolean isKeybindingsOnly() { + return keybindingsOnly; + } + + public void setKeybindingsOnly(boolean keybindingsOnly) { + this.keybindingsOnly = keybindingsOnly; + } +} diff --git a/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java index 10314ab..b3e1a97 100644 --- a/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java +++ b/common/src/main/java/com/axolotlmaid/optionsprofiles/profiles/Profiles.java @@ -12,13 +12,34 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Consumer; +import java.util.stream.Stream; public class Profiles { - private static final Path PROFILES_DIRECTORY = Paths.get("options-profiles"); - private static final Path OPTIONS_FILE = Paths.get("options.txt"); - private static final Path OPTIFINE_OPTIONS_FILE = Paths.get("optionsof.txt"); - private static final Path SODIUM_OPTIONS_FILE = Paths.get("config/sodium-options.json"); - private static final Path SODIUM_EXTRA_OPTIONS_FILE = Paths.get("config/sodium-extra-options.json"); + public static final Path PROFILES_DIRECTORY = Paths.get("options-profiles/"); + public static final Path OPTIONS_FILE = Paths.get("options.txt"); + public static final Path OPTIFINE_OPTIONS_FILE = Paths.get("optionsof.txt"); + public static final Path SODIUM_OPTIONS_FILE = Paths.get("config/sodium-options.json"); + public static final Path SODIUM_EXTRA_OPTIONS_FILE = Paths.get("config/sodium-extra-options.json"); + + // This function goes through every profile and adds a configuration file if it doesn't exist + public static void updateProfiles() { + try (Stream paths = Files.list(PROFILES_DIRECTORY)) { + paths.filter(Files::isDirectory) + .forEach(path -> { + Path configurationFile = path.resolve("configuration.json"); + if (!Files.exists(configurationFile)) { + String profileName = path.getFileName().toString(); + + // Create configuration.json + new ProfileConfiguration().save(profileName); + + OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Profile updated", profileName); + } + }); + } catch (IOException e) { + OptionsProfilesMod.LOGGER.error("An error occurred when updating profiles", e); + } + } public static void createProfile() { String profileName = "Profile 1"; @@ -35,7 +56,7 @@ public class Profiles { if (Files.exists(profile)) { OptionsProfilesMod.LOGGER.info("[Profile '{}']: created", profileName); - writeProfile(profileName); + writeProfile(profileName, false); } else { OptionsProfilesMod.LOGGER.warn("[Profile '{}']: Profile already exists?", profileName); } @@ -56,14 +77,19 @@ public class Profiles { } } - public static void writeProfile(String profileName) { + public static void writeProfile(String profileName, boolean overwriting) { Path profile = PROFILES_DIRECTORY.resolve(profileName); - try { - // Removes old option files - FileUtils.cleanDirectory(profile.toFile()); - } catch (IOException e) { - OptionsProfilesMod.LOGGER.error("[Profile '{}']: An error occurred when clearing old options files", profileName, e); + if (overwriting) { + try { + // Removes old option files + FileUtils.cleanDirectory(profile.toFile()); + } catch (IOException e) { + OptionsProfilesMod.LOGGER.error("[Profile '{}']: An error occurred when clearing old options files", profileName, e); + } + } else { + // Create configuration.json + new ProfileConfiguration().save(profileName); } copyOptionFile(profile, OPTIONS_FILE);