blob: e32f1d8996503fafcc125fe9f306b307753751a7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
package at.hannibal2.skyhanni.config
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.ConfigLoadEvent
import at.hannibal2.skyhanni.features.garden.CropType
import at.hannibal2.skyhanni.features.misc.update.UpdateManager
import at.hannibal2.skyhanni.utils.LorenzLogger
import com.google.gson.GsonBuilder
import io.github.moulberry.moulconfig.observer.PropertyTypeAdapterFactory
import io.github.moulberry.moulconfig.processor.BuiltinMoulConfigGuis
import io.github.moulberry.moulconfig.processor.ConfigProcessorDriver
import io.github.moulberry.moulconfig.processor.MoulConfigProcessor
import java.io.*
import java.nio.charset.StandardCharsets
import kotlin.concurrent.fixedRateTimer
class ConfigManager {
companion object {
val gson = GsonBuilder().setPrettyPrinting()
.excludeFieldsWithoutExposeAnnotation()
.serializeSpecialFloatingPointValues()
.registerTypeAdapterFactory(PropertyTypeAdapterFactory())
.create()
}
lateinit var features: Features
private set
private val logger = LorenzLogger("config_manager")
var configDirectory = File("config/skyhanni")
private var configFile: File? = null
lateinit var processor: MoulConfigProcessor<Features>
fun firstLoad() {
if (::features.isInitialized) {
logger.log("Loading config despite config being already loaded?")
}
configDirectory.mkdir()
configFile = File(configDirectory, "config.json")
fixedRateTimer(name = "skyhanni-config-auto-save", period = 60_000L, initialDelay = 60_000L) {
saveConfig("auto-save-60s")
}
logger.log("Trying to load config from $configFile")
if (configFile!!.exists()) {
try {
val inputStreamReader = InputStreamReader(FileInputStream(configFile!!), StandardCharsets.UTF_8)
val bufferedReader = BufferedReader(inputStreamReader)
val builder = StringBuilder()
for (line in bufferedReader.lines()) {
val result = fixConfig(line)
builder.append(result)
builder.append("\n")
}
logger.log("load-config-now")
features = gson.fromJson(
builder.toString(),
Features::class.java
)
logger.log("Loaded config from file")
} catch (e: Exception) {
println("config error")
e.printStackTrace()
val backupFile = configFile!!.resolveSibling("config-${System.currentTimeMillis()}-backup.json")
logger.log("Exception while reading $configFile. Will load blank config and save backup to $backupFile")
e.printStackTrace()
try {
configFile!!.copyTo(backupFile)
} catch (e: Exception) {
logger.log("Could not create backup for config file")
e.printStackTrace()
}
}
}
if (!::features.isInitialized) {
logger.log("Creating blank config and saving to file")
features = Features()
saveConfig("blank config")
}
ConfigLoadEvent().postAndCatch()
val features = SkyHanniMod.feature
processor = MoulConfigProcessor(SkyHanniMod.feature)
BuiltinMoulConfigGuis.addProcessors(processor)
UpdateManager.injectConfigProcessor(processor)
ConfigProcessorDriver.processConfig(
features.javaClass,
features,
processor
)
}
private fun fixConfig(line: String): String {
var result = line
for (type in CropType.values()) {
val normal = "\"${type.cropName}\""
val enumName = "\"${type.name}\""
while (result.contains(normal)) {
result = result.replace(normal, enumName)
}
}
return result
}
fun saveConfig(reason: String) {
logger.log("saveConfig: $reason")
val file = configFile ?: throw Error("Can not save config, configFile is null!")
try {
logger.log("Saving config file")
file.parentFile.mkdirs()
file.createNewFile()
BufferedWriter(OutputStreamWriter(FileOutputStream(file), StandardCharsets.UTF_8)).use { writer ->
writer.write(gson.toJson(SkyHanniMod.feature))
}
} catch (e: IOException) {
logger.log("Could not save config file to $file")
e.printStackTrace()
}
}
}
|