diff options
| author | CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> | 2024-06-04 04:16:22 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-03 20:16:22 +0200 |
| commit | aa66334dba2c2c086b94eab1767abd4765e006f7 (patch) | |
| tree | 42c9cc1d76f1d331a42c0bee2e55830168e6f85a /src/main/java/at/hannibal2/skyhanni/utils | |
| parent | fde5544ca7a49f8315318a249607769aee87661c (diff) | |
| download | skyhanni-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')
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 + } +} |
