summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/utils
diff options
context:
space:
mode:
authorCalMWolfs <94038482+CalMWolfs@users.noreply.github.com>2024-06-04 04:16:22 +1000
committerGitHub <noreply@github.com>2024-06-03 20:16:22 +0200
commitaa66334dba2c2c086b94eab1767abd4765e006f7 (patch)
tree42c9cc1d76f1d331a42c0bee2e55830168e6f85a /src/main/java/at/hannibal2/skyhanni/utils
parentfde5544ca7a49f8315318a249607769aee87661c (diff)
downloadskyhanni-aa66334dba2c2c086b94eab1767abd4765e006f7.tar.gz
skyhanni-aa66334dba2c2c086b94eab1767abd4765e006f7.tar.bz2
skyhanni-aa66334dba2c2c086b94eab1767abd4765e006f7.zip
Fix: Config resetting on wrong value (#1979)
Co-authored-by: Brady <brady@thatgravyboat.tech>
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt4
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/BaseGsonBuilder.kt37
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/FeatureTogglesByDefaultAdapter.kt (renamed from src/main/java/at/hannibal2/skyhanni/utils/FeatureTogglesByDefaultAdapter.kt)2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/ItemStackTypeAdapter.kt (renamed from src/main/java/at/hannibal2/skyhanni/utils/ItemStackTypeAdapter.kt)2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/JsonUtils.kt (renamed from src/main/java/at/hannibal2/skyhanni/utils/JsonUtils.kt)2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/NBTTypeAdapter.kt (renamed from src/main/java/at/hannibal2/skyhanni/utils/NBTTypeAdapter.kt)2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/SimpleStringTypeAdapter.kt29
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/SkippingTypeAdapterFactory.kt32
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/json/SkyHanniTypeAdapters.kt79
9 files changed, 184 insertions, 5 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt b/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt
index b3d92e68f..297a40585 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/NEUItems.kt
@@ -15,6 +15,8 @@ import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import at.hannibal2.skyhanni.utils.NumberUtil.isInt
import at.hannibal2.skyhanni.utils.PrimitiveItemStack.Companion.makePrimitiveStack
+import at.hannibal2.skyhanni.utils.json.BaseGsonBuilder
+import at.hannibal2.skyhanni.utils.json.fromJson
import com.google.gson.JsonObject
import com.google.gson.JsonPrimitive
import com.google.gson.TypeAdapter
@@ -51,7 +53,7 @@ object NEUItems {
private val ingredientsCache = mutableMapOf<NeuRecipe, Set<Ingredient>>()
private val hypixelApiGson by lazy {
- ConfigManager.createBaseGsonBuilder()
+ BaseGsonBuilder.gson()
.registerTypeAdapter(HypixelApiTrophyFish::class.java, object : TypeAdapter<HypixelApiTrophyFish>() {
override fun write(out: JsonWriter, value: HypixelApiTrophyFish) {}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/json/BaseGsonBuilder.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/BaseGsonBuilder.kt
new file mode 100644
index 000000000..d73edc0b0
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/BaseGsonBuilder.kt
@@ -0,0 +1,37 @@
+package at.hannibal2.skyhanni.utils.json
+
+import at.hannibal2.skyhanni.data.IslandType
+import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity
+import at.hannibal2.skyhanni.utils.KotlinTypeAdapterFactory
+import at.hannibal2.skyhanni.utils.LorenzRarity
+import at.hannibal2.skyhanni.utils.LorenzVec
+import at.hannibal2.skyhanni.utils.NEUInternalName
+import at.hannibal2.skyhanni.utils.SimpleTimeMark
+import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker
+import com.google.gson.GsonBuilder
+import io.github.notenoughupdates.moulconfig.observer.PropertyTypeAdapterFactory
+import net.minecraft.item.ItemStack
+import java.util.UUID
+
+object BaseGsonBuilder {
+ fun gson(): GsonBuilder = GsonBuilder().setPrettyPrinting()
+ .excludeFieldsWithoutExposeAnnotation()
+ .serializeSpecialFloatingPointValues()
+ .registerTypeAdapterFactory(PropertyTypeAdapterFactory())
+ .registerTypeAdapterFactory(KotlinTypeAdapterFactory())
+ .registerTypeAdapter(UUID::class.java, SkyHanniTypeAdapters.UUID.nullSafe())
+ .registerTypeAdapter(LorenzVec::class.java, SkyHanniTypeAdapters.VEC_STRING.nullSafe())
+ .registerTypeAdapter(TrophyRarity::class.java, SkyHanniTypeAdapters.TROPHY_RARITY.nullSafe())
+ .registerTypeAdapter(ItemStack::class.java, SkyHanniTypeAdapters.NEU_ITEMSTACK.nullSafe())
+ .registerTypeAdapter(NEUInternalName::class.java, SkyHanniTypeAdapters.INTERNAL_NAME.nullSafe())
+ .registerTypeAdapter(LorenzRarity::class.java, SkyHanniTypeAdapters.RARITY.nullSafe())
+ .registerTypeAdapter(IslandType::class.java, SkyHanniTypeAdapters.ISLAND_TYPE.nullSafe())
+ .registerTypeAdapter(
+ SkyHanniTracker.DefaultDisplayMode::class.java,
+ SkyHanniTypeAdapters.TRACKER_DISPLAY_MODE.nullSafe()
+ )
+ .registerTypeAdapter(SimpleTimeMark::class.java, SkyHanniTypeAdapters.TIME_MARK.nullSafe())
+ .enableComplexMapKeySerialization()
+
+ fun lenientGson(): GsonBuilder = gson().registerTypeAdapterFactory(SkippingTypeAdapterFactory)
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/FeatureTogglesByDefaultAdapter.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/FeatureTogglesByDefaultAdapter.kt
index f78a0c4dc..bcc9c2edf 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/FeatureTogglesByDefaultAdapter.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/FeatureTogglesByDefaultAdapter.kt
@@ -1,4 +1,4 @@
-package at.hannibal2.skyhanni.utils
+package at.hannibal2.skyhanni.utils.json
import at.hannibal2.skyhanni.config.FeatureToggle
import at.hannibal2.skyhanni.utils.ReflectionUtils.getDeclaredFieldOrNull
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/ItemStackTypeAdapter.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/ItemStackTypeAdapter.kt
index 602bffa2d..1940b03c0 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/ItemStackTypeAdapter.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/ItemStackTypeAdapter.kt
@@ -1,4 +1,4 @@
-package at.hannibal2.skyhanni.utils
+package at.hannibal2.skyhanni.utils.json
import com.google.gson.Gson
import com.google.gson.TypeAdapter
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/JsonUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/JsonUtils.kt
index cc3dda044..750bd96aa 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/JsonUtils.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/JsonUtils.kt
@@ -1,4 +1,4 @@
-package at.hannibal2.skyhanni.utils
+package at.hannibal2.skyhanni.utils.json
import com.google.gson.Gson
import com.google.gson.JsonArray
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/NBTTypeAdapter.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/NBTTypeAdapter.kt
index 4e0762895..e2e782636 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/NBTTypeAdapter.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/NBTTypeAdapter.kt
@@ -1,4 +1,4 @@
-package at.hannibal2.skyhanni.utils
+package at.hannibal2.skyhanni.utils.json
import com.google.gson.TypeAdapter
import com.google.gson.stream.JsonReader
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/json/SimpleStringTypeAdapter.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/SimpleStringTypeAdapter.kt
new file mode 100644
index 000000000..21f601932
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/SimpleStringTypeAdapter.kt
@@ -0,0 +1,29 @@
+package at.hannibal2.skyhanni.utils.json
+
+import com.google.gson.TypeAdapter
+import com.google.gson.stream.JsonReader
+import com.google.gson.stream.JsonWriter
+
+class SimpleStringTypeAdapter<T>(
+ val serializer: T.() -> String,
+ val deserializer: String.() -> T
+) : TypeAdapter<T>() {
+
+ override fun write(writer: JsonWriter, value: T) {
+ writer.value(serializer(value))
+ }
+
+ override fun read(reader: JsonReader): T {
+ return deserializer(reader.nextString())
+ }
+
+ companion object {
+
+ inline fun <reified T : Enum<T>> forEnum(): SimpleStringTypeAdapter<T> {
+ return SimpleStringTypeAdapter(
+ { name },
+ { enumValueOf(this.replace(" ", "_").uppercase()) }
+ )
+ }
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/json/SkippingTypeAdapterFactory.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/SkippingTypeAdapterFactory.kt
new file mode 100644
index 000000000..a926976ca
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/SkippingTypeAdapterFactory.kt
@@ -0,0 +1,32 @@
+package at.hannibal2.skyhanni.utils.json
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import com.google.gson.Gson
+import com.google.gson.TypeAdapter
+import com.google.gson.TypeAdapterFactory
+import com.google.gson.reflect.TypeToken
+import com.google.gson.stream.JsonReader
+import com.google.gson.stream.JsonWriter
+
+object SkippingTypeAdapterFactory : TypeAdapterFactory {
+
+ override fun <T : Any?> create(gson: Gson, type: TypeToken<T>): TypeAdapter<T> {
+ return SafeTypeAdapter(gson.getDelegateAdapter(this, type))
+ }
+
+ private class SafeTypeAdapter<T>(val parent: TypeAdapter<T>) : TypeAdapter<T>() {
+ override fun write(writer: JsonWriter, value: T) {
+ parent.write(writer, value)
+ }
+
+ override fun read(reader: JsonReader): T? {
+ return try {
+ parent.read(reader)
+ } catch (e: Exception) {
+ SkyHanniMod.logger.warn("Failed to read value from JSON, skipping", e)
+ reader.skipValue()
+ null
+ }
+ }
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/json/SkyHanniTypeAdapters.kt b/src/main/java/at/hannibal2/skyhanni/utils/json/SkyHanniTypeAdapters.kt
new file mode 100644
index 000000000..dc50eef74
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/json/SkyHanniTypeAdapters.kt
@@ -0,0 +1,79 @@
+package at.hannibal2.skyhanni.utils.json
+
+import at.hannibal2.skyhanni.data.IslandType
+import at.hannibal2.skyhanni.features.fishing.trophy.TrophyRarity
+import at.hannibal2.skyhanni.features.garden.CropType
+import at.hannibal2.skyhanni.features.garden.pests.PestType
+import at.hannibal2.skyhanni.utils.LorenzRarity
+import at.hannibal2.skyhanni.utils.LorenzVec
+import at.hannibal2.skyhanni.utils.NEUInternalName
+import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
+import at.hannibal2.skyhanni.utils.NEUItems
+import at.hannibal2.skyhanni.utils.SimpleTimeMark
+import at.hannibal2.skyhanni.utils.SimpleTimeMark.Companion.asTimeMark
+import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker
+import com.google.gson.GsonBuilder
+import com.google.gson.TypeAdapter
+import com.google.gson.stream.JsonReader
+import com.google.gson.stream.JsonWriter
+import net.minecraft.item.ItemStack
+import java.util.UUID
+
+object SkyHanniTypeAdapters {
+ val NEU_ITEMSTACK: TypeAdapter<ItemStack> = SimpleStringTypeAdapter(NEUItems::saveNBTData, NEUItems::loadNBTData)
+
+ val UUID: TypeAdapter<UUID> = SimpleStringTypeAdapter(
+ { this.toString() },
+ { java.util.UUID.fromString(this) }
+ )
+
+ val INTERNAL_NAME: TypeAdapter<NEUInternalName> = SimpleStringTypeAdapter(
+ { this.asString() },
+ { this.asInternalName() }
+ )
+
+ val VEC_STRING: TypeAdapter<LorenzVec> = SimpleStringTypeAdapter(
+ { "$x:$y:$z" },
+ { LorenzVec.decodeFromString(this) }
+ )
+
+ val TROPHY_RARITY: TypeAdapter<TrophyRarity> = SimpleStringTypeAdapter(
+ { name },
+ { TrophyRarity.getByName(this) ?: error("Could not parse TrophyRarity from '$this'") }
+ )
+
+ val TIME_MARK: TypeAdapter<SimpleTimeMark> = object : TypeAdapter<SimpleTimeMark>() {
+ override fun write(out: JsonWriter, value: SimpleTimeMark) {
+ out.value(value.toMillis())
+ }
+
+ override fun read(reader: JsonReader): SimpleTimeMark {
+ return reader.nextString().toLong().asTimeMark()
+ }
+ }
+
+ val CROP_TYPE: TypeAdapter<CropType> = SimpleStringTypeAdapter(
+ { name },
+ { CropType.getByName(this) }
+ )
+
+ val PEST_TYPE: TypeAdapter<PestType> = SimpleStringTypeAdapter(
+ { name },
+ { PestType.getByName(this) }
+ )
+
+ val TRACKER_DISPLAY_MODE = SimpleStringTypeAdapter.forEnum<SkyHanniTracker.DefaultDisplayMode>()
+ val ISLAND_TYPE = SimpleStringTypeAdapter.forEnum<IslandType>()
+ val RARITY = SimpleStringTypeAdapter.forEnum<LorenzRarity>()
+
+ inline fun <reified T> GsonBuilder.registerTypeAdapter(
+ crossinline write: (JsonWriter, T) -> Unit,
+ crossinline read: (JsonReader) -> T,
+ ): GsonBuilder {
+ this.registerTypeAdapter(T::class.java, object : TypeAdapter<T>() {
+ override fun write(out: JsonWriter, value: T) = write(out, value)
+ override fun read(reader: JsonReader) = read(reader)
+ }.nullSafe())
+ return this
+ }
+}