HTTPS
https://git.nageyqma.icu/nageyqma/odin_next.git
SSH
git@git.nageyqma.icu:nageyqma/odin_next.git
HTTPS 链接可直接 git clone;推送代码请使用 SSH。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
@file:Suppress("unused")
package com.odtheking.odin.config
import com.google.gson.*
import com.odtheking.odin.OdinMod
import com.odtheking.odin.OdinMod.logger
import com.odtheking.odin.clickgui.settings.Saving
import com.odtheking.odin.features.Module
import java.io.File
/**
* # ModuleConfig
*
* This class handles saving Modules, and their settings, into a JSON format.
*/
class ModuleConfig internal constructor(file: File) {
/**
* Main constructor for Addons. (config/odin/addons/{fileName})
*/
constructor(fileName: String) : this(File(OdinMod.configFile, "addons/$fileName"))
// key is module name in lowercase
internal val modules: HashMap<String, Module> = hashMapOf()
private val file: File = file.apply {
try {
parentFile.mkdirs()
createNewFile()
} catch (e: Exception) {
logger.error("Error initializing module config", e)
}
}
/**
* Loads configuration from file, into [modules].
*/
fun load() {
try {
with(file.bufferedReader().use { it.readText() }) {
if (isEmpty()) return
val jsonArray = JsonParser.parseString(this).asJsonArray ?: return
for (modules in jsonArray) {
val moduleObj = modules?.asJsonObject ?: continue
val module = this@ModuleConfig.modules[moduleObj.get("name").asString.lowercase()] ?: continue
if (moduleObj.get("enabled").asBoolean != module.enabled) module.toggle()
val settingObj = moduleObj.get("settings")?.takeIf { it.isJsonObject }?.asJsonObject?.entrySet() ?: continue
for ((key, value) in settingObj) {
(module.settings[key] as? Saving)?.apply { read(value ?: continue, gson) }
}
}
}
} catch (e: Exception) {
logger.error("Error initializing module config", e)
}
}
/**
* Saves configuration to files, from [modules].
*/
fun save() {
try {
// reason doing this is better is that
// using like a custom serializer leaves 'null' in settings that don't save
// code looks hideous tho, but it fully works
val jsonArray = JsonArray().apply {
for ((_, module) in modules) {
add(JsonObject().apply {
add("name", JsonPrimitive(module.name))
add("enabled", JsonPrimitive(module.enabled))
add("settings", JsonObject().apply {
for ((name, setting) in module.settings) {
if (setting is Saving) add(name, setting.write(gson))
}
})
})
}
}
file.bufferedWriter().use { it.write(gson.toJson(jsonArray)) }
} catch (e: Exception) {
logger.error("Error saving module config.", e)
}
}
private companion object {
private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
}
override fun toString(): String {
return "ModuleConfig(file=$file)"
}
}