diff --git a/src/main/java/dev/vixid/vsm/config/VSMConfig.java b/src/main/java/dev/vixid/vsm/config/VSMConfig.java index f35616b..823feab 100644 --- a/src/main/java/dev/vixid/vsm/config/VSMConfig.java +++ b/src/main/java/dev/vixid/vsm/config/VSMConfig.java @@ -1,6 +1,7 @@ package dev.vixid.vsm.config; import com.google.gson.annotations.Expose; +import dev.vixid.vsm.VSM; import dev.vixid.vsm.config.features.SpotifyConfig; import io.github.notenoughupdates.moulconfig.Config; import io.github.notenoughupdates.moulconfig.Social; @@ -15,7 +16,7 @@ public class VSMConfig extends Config { @Override public List getSocials() { return Collections.singletonList( - Social.forLink("GitHub", GITHUB, "https://github.com/VixidDev") + Social.forLink("GitHub", GITHUB, "https://github.com/VixidDev/VSM") ); } @@ -26,7 +27,7 @@ public String getTitle() { @Override public void saveNow() { - ConfigManager.INSTANCE.saveConfig(); + VSM.getConfig().saveToFile(); } @Expose diff --git a/src/main/java/dev/vixid/vsm/config/core/VSMGsonMapper.java b/src/main/java/dev/vixid/vsm/config/core/VSMGsonMapper.java new file mode 100644 index 0000000..a446449 --- /dev/null +++ b/src/main/java/dev/vixid/vsm/config/core/VSMGsonMapper.java @@ -0,0 +1,46 @@ +package dev.vixid.vsm.config.core; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import io.github.notenoughupdates.moulconfig.ChromaColour; +import io.github.notenoughupdates.moulconfig.LegacyStringChromaColourTypeAdapter; +import io.github.notenoughupdates.moulconfig.managed.DataMapper; +import io.github.notenoughupdates.moulconfig.observer.PropertyTypeAdapterFactory; +import java.lang.reflect.InvocationTargetException; +import org.jetbrains.annotations.NotNull; + +public class VSMGsonMapper implements DataMapper { + + public Class clazz; + + public Gson gson = new GsonBuilder() + .registerTypeAdapterFactory(new PropertyTypeAdapterFactory()) + .registerTypeAdapter(ChromaColour.class, new LegacyStringChromaColourTypeAdapter(true)) + .excludeFieldsWithoutExposeAnnotation() + .setPrettyPrinting() + .create(); + + public VSMGsonMapper(Class clazz) { + this.clazz = clazz; + } + + @NotNull + @Override + public String serialize(T value) { + return gson.toJson(value); + } + + @Override + public T createDefault() { + try { + return clazz.getDeclaredConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + @Override + public T deserialize(@NotNull String string) { + return gson.fromJson(string, clazz); + } +} diff --git a/src/main/kotlin/dev/vixid/vsm/VSM.kt b/src/main/kotlin/dev/vixid/vsm/VSM.kt index d23874d..7222ee9 100644 --- a/src/main/kotlin/dev/vixid/vsm/VSM.kt +++ b/src/main/kotlin/dev/vixid/vsm/VSM.kt @@ -2,11 +2,13 @@ package dev.vixid.vsm import com.github.kwhat.jnativehook.GlobalScreen import dev.vixid.vsm.commands.Commands -import dev.vixid.vsm.config.ConfigManager import dev.vixid.vsm.config.VSMConfig +import dev.vixid.vsm.config.core.VSMGsonMapper import dev.vixid.vsm.features.SpotifyDisplay import dev.vixid.vsm.jnativehook.VSMLibraryLocator import dev.vixid.vsm.overlays.OverlayPositions +import io.github.notenoughupdates.moulconfig.managed.ManagedConfig +import java.io.File import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -30,8 +32,6 @@ class VSM { @Mod.EventHandler fun init(event: FMLInitializationEvent) { - ConfigManager.firstLoad() - MinecraftForge.EVENT_BUS.register(this) SpotifyDisplay.initialise() @@ -56,7 +56,9 @@ class VSM { companion object { @JvmStatic - val config: VSMConfig get() = ConfigManager.config + val config = ManagedConfig.create(File("config/vsm/config.json"), VSMConfig::class.java) { + mapper = VSMGsonMapper(this.clazz) + } private val globalJob: Job = Job(null) val coroutineScope = CoroutineScope(CoroutineName("VSM") + SupervisorJob(globalJob)) diff --git a/src/main/kotlin/dev/vixid/vsm/commands/Commands.kt b/src/main/kotlin/dev/vixid/vsm/commands/Commands.kt index 239b818..e02dfde 100644 --- a/src/main/kotlin/dev/vixid/vsm/commands/Commands.kt +++ b/src/main/kotlin/dev/vixid/vsm/commands/Commands.kt @@ -1,13 +1,13 @@ package dev.vixid.vsm.commands -import dev.vixid.vsm.config.ConfigGuiManager +import dev.vixid.vsm.VSM import net.minecraft.command.ICommandSender import net.minecraftforge.client.ClientCommandHandler object Commands { fun initCommands() { - registerCommand("vsm") { ConfigGuiManager.openConfig() } + registerCommand("vsm") { VSM.screenToOpen = VSM.config.getGui() } } private fun registerCommand(name: String, function: (Array) -> Unit) { diff --git a/src/main/kotlin/dev/vixid/vsm/config/ConfigGuiManager.kt b/src/main/kotlin/dev/vixid/vsm/config/ConfigGuiManager.kt deleted file mode 100644 index 966d428..0000000 --- a/src/main/kotlin/dev/vixid/vsm/config/ConfigGuiManager.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.vixid.vsm.config - -import dev.vixid.vsm.VSM -import io.github.notenoughupdates.moulconfig.gui.GuiScreenElementWrapper -import io.github.notenoughupdates.moulconfig.gui.MoulConfigEditor - -object ConfigGuiManager { - private var editor: MoulConfigEditor? = null - - private fun getEditorInstance() = editor ?: MoulConfigEditor(ConfigManager.configProcessor).also { editor = it } - - fun openConfig() { - val editor = getEditorInstance() - VSM.screenToOpen = GuiScreenElementWrapper(editor) - } -} \ No newline at end of file diff --git a/src/main/kotlin/dev/vixid/vsm/config/ConfigManager.kt b/src/main/kotlin/dev/vixid/vsm/config/ConfigManager.kt deleted file mode 100644 index 38cec98..0000000 --- a/src/main/kotlin/dev/vixid/vsm/config/ConfigManager.kt +++ /dev/null @@ -1,78 +0,0 @@ -package dev.vixid.vsm.config - -import com.google.gson.Gson -import com.google.gson.GsonBuilder -import dev.vixid.vsm.VSM -import io.github.notenoughupdates.moulconfig.processor.BuiltinMoulConfigGuis -import io.github.notenoughupdates.moulconfig.processor.ConfigProcessorDriver -import io.github.notenoughupdates.moulconfig.processor.MoulConfigProcessor -import java.io.BufferedReader -import java.io.BufferedWriter -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStreamReader -import java.io.OutputStreamWriter -import java.nio.charset.StandardCharsets -import java.nio.file.Files -import java.nio.file.StandardCopyOption - -object ConfigManager { - private val gson: Gson = GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create() - - val configDirectory = File("config/vsm") - val configFile by lazy { File(configDirectory, "config.json") } - - lateinit var configProcessor: MoulConfigProcessor - lateinit var config: VSMConfig - - fun firstLoad() { - configDirectory.mkdirs() - - if (!configFile.exists()) { - if (!configFile.createNewFile()) { - throw Error("Could not create config file") - } else { - BufferedWriter(OutputStreamWriter(FileOutputStream(configFile), StandardCharsets.UTF_8)).use { writer -> - writer.write(gson.toJson(VSMConfig())) - } - } - } - - try { - BufferedReader(InputStreamReader(FileInputStream(configFile), StandardCharsets.UTF_8)).use { reader -> - config = gson.fromJson(reader.readText(), VSMConfig::class.java) - } - } catch (error: Exception) { - error.printStackTrace() - } - - configProcessor = MoulConfigProcessor(config) - BuiltinMoulConfigGuis.addProcessors(configProcessor) - ConfigProcessorDriver(configProcessor).processConfig(config) - } - - fun saveConfig() { - try { - configFile.parentFile.mkdirs() - val unit = configFile.parentFile.resolve("config.json.write") - unit.createNewFile() - BufferedWriter(OutputStreamWriter(FileOutputStream(unit), StandardCharsets.UTF_8)).use { writer -> - writer.write(gson.toJson(VSM.config)) - } - try { - Files.move( - unit.toPath(), - configFile.toPath(), - StandardCopyOption.REPLACE_EXISTING, - StandardCopyOption.ATOMIC_MOVE - ) - } catch (e: AccessDeniedException) { - e.printStackTrace() - } - } catch (e: IOException) { - e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/dev/vixid/vsm/features/SpotifyDisplay.kt b/src/main/kotlin/dev/vixid/vsm/features/SpotifyDisplay.kt index 11325b8..a4decdd 100644 --- a/src/main/kotlin/dev/vixid/vsm/features/SpotifyDisplay.kt +++ b/src/main/kotlin/dev/vixid/vsm/features/SpotifyDisplay.kt @@ -18,7 +18,7 @@ import net.minecraftforge.fml.common.gameevent.TickEvent object SpotifyDisplay : Overlay() { - private val config: SpotifyConfig get() = VSM.config.spotifyConfig + private val config: SpotifyConfig get() = VSM.config.instance.spotifyConfig private var songName: String = "§cCannot detect song name!" private var totalTicks = 0 diff --git a/src/main/kotlin/dev/vixid/vsm/overlays/PositionEditor.kt b/src/main/kotlin/dev/vixid/vsm/overlays/PositionEditor.kt index 34890d8..f52905e 100644 --- a/src/main/kotlin/dev/vixid/vsm/overlays/PositionEditor.kt +++ b/src/main/kotlin/dev/vixid/vsm/overlays/PositionEditor.kt @@ -61,7 +61,7 @@ class PositionEditor(private val editorOverlays: MutableMap