diff --git a/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java b/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java index 62d659a..e5e9822 100644 --- a/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java +++ b/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java @@ -1,13 +1,13 @@ package net.vinrobot.mcemote.client; import net.fabricmc.api.ClientModInitializer; +import net.vinrobot.mcemote.MinecraftEmote; import net.vinrobot.mcemote.MinecraftEmoteMod; import net.vinrobot.mcemote.client.font.Emote; import net.vinrobot.mcemote.client.helpers.ListHelper; import net.vinrobot.mcemote.client.providers.IEmoteProvider; import net.vinrobot.mcemote.client.text.EmotesManager; import net.vinrobot.mcemote.config.Configuration; -import net.vinrobot.mcemote.config.ConfigurationService; import webpdecoderjn.WebPLoader; import java.io.IOException; @@ -27,7 +27,7 @@ public void onInitializeClient() { MinecraftEmoteMod.LOGGER.error("Failed to initialize WebPDecoder", e); } - final Configuration config = loadConfiguration(MinecraftEmoteMod.getConfigService()); + final Configuration config = MinecraftEmote.getInstance().getConfigManager().getConfig(); final ServiceLoader serviceLoader = ServiceLoader.load(IEmoteProvider.class); final List providers = ListHelper.sort(serviceLoader); @@ -52,14 +52,4 @@ public void onInitializeClient() { } } } - - private Configuration loadConfiguration(final ConfigurationService service) { - try { - MinecraftEmoteMod.LOGGER.info("Loading config"); - return service.load(); - } catch (final IOException e) { - MinecraftEmoteMod.LOGGER.error("Failed to load config", e); - return service.create(); - } - } } diff --git a/src/main/java/net/vinrobot/mcemote/MinecraftEmote.java b/src/main/java/net/vinrobot/mcemote/MinecraftEmote.java new file mode 100644 index 0000000..913d967 --- /dev/null +++ b/src/main/java/net/vinrobot/mcemote/MinecraftEmote.java @@ -0,0 +1,27 @@ +package net.vinrobot.mcemote; + +import net.fabricmc.loader.api.FabricLoader; +import net.vinrobot.mcemote.config.ConfigurationManager; +import net.vinrobot.mcemote.config.ConfigurationService; +import net.vinrobot.mcemote.config.impl.file.FileConfigurationService; + +import java.nio.file.Path; + +public class MinecraftEmote { + public static MinecraftEmote getInstance() { + return MinecraftEmoteMod.getMinecraftEmote(); + } + + private final ConfigurationManager configManager; + + protected MinecraftEmote() { + final Path configDir = FabricLoader.getInstance().getConfigDir(); + final Path configFile = configDir.resolve("mcemote.json"); + final ConfigurationService configService = new FileConfigurationService(configFile); + this.configManager = new ConfigurationManager(configService); + } + + public ConfigurationManager getConfigManager() { + return this.configManager; + } +} diff --git a/src/main/java/net/vinrobot/mcemote/MinecraftEmoteMod.java b/src/main/java/net/vinrobot/mcemote/MinecraftEmoteMod.java index 39e3754..cf5e308 100644 --- a/src/main/java/net/vinrobot/mcemote/MinecraftEmoteMod.java +++ b/src/main/java/net/vinrobot/mcemote/MinecraftEmoteMod.java @@ -1,26 +1,21 @@ package net.vinrobot.mcemote; import net.fabricmc.api.ModInitializer; -import net.fabricmc.loader.api.FabricLoader; -import net.vinrobot.mcemote.config.ConfigurationService; -import net.vinrobot.mcemote.config.impl.file.FileConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.nio.file.Path; - public class MinecraftEmoteMod implements ModInitializer { // This logger is used to write text to the console and the log file. // It is considered best practice to use your mod id as the logger's name. // That way, it's clear which mod wrote info, warnings, and errors. public static final Logger LOGGER = LoggerFactory.getLogger("MCEmote"); - private static ConfigurationService configService; + private static MinecraftEmote MINECRAFT_EMOTE; - public static ConfigurationService getConfigService() { - ConfigurationService ret = configService; + public static MinecraftEmote getMinecraftEmote() { + final MinecraftEmote ret = MINECRAFT_EMOTE; if (ret == null) { - throw new RuntimeException("Configuration service not yet available!"); + throw new RuntimeException("Minecraft Emote not yet available!"); } return ret; } @@ -32,9 +27,6 @@ public void onInitialize() { // Proceed with mild caution. LOGGER.info("Hello Fabric world!"); - - final Path configDir = FabricLoader.getInstance().getConfigDir(); - final Path configFile = configDir.resolve("mcemote.json"); - configService = new FileConfigurationService(configFile); + MINECRAFT_EMOTE = new MinecraftEmote(); } } diff --git a/src/main/java/net/vinrobot/mcemote/config/ConfigurationManager.java b/src/main/java/net/vinrobot/mcemote/config/ConfigurationManager.java new file mode 100644 index 0000000..4ca0212 --- /dev/null +++ b/src/main/java/net/vinrobot/mcemote/config/ConfigurationManager.java @@ -0,0 +1,45 @@ +package net.vinrobot.mcemote.config; + +import java.io.IOException; + +import static net.vinrobot.mcemote.MinecraftEmoteMod.LOGGER; + +public class ConfigurationManager { + private final ConfigurationService configService; + private Configuration configuration; + + public ConfigurationManager(final ConfigurationService configService) { + this.configService = configService; + } + + public Configuration getConfig() { + final Configuration config = this.configuration; + return config != null ? config : this.load(); + } + + public Configuration load() { + final ConfigurationService service = this.configService; + try { + LOGGER.info("Loading config"); + return this.configuration = service.load(); + } catch (final IOException e) { + LOGGER.error("Failed to load config", e); + return this.configuration = service.create(); + } + } + + public void save() { + final Configuration config = this.configuration; + if (config != null) { + try { + this.configService.save(config); + } catch (final IOException e) { + LOGGER.error("Failed to save config", e); + } + } + } + + public void reset() { + this.configuration = this.configService.create(); + } +}