From 51e0aff823f98ebfb4dba164b60eb9020a07c5e3 Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Sat, 8 Jan 2022 23:09:27 +0100 Subject: [PATCH] improve event-schema polymorphism with enums --- .../kafkatorio-schema/config-update.d.ts | 1 + .../kafkatorio-schema/object-data.d.ts | 17 +++++----- .../kafkatorio-schema/prototype.d.ts | 11 +++---- .../generated/kafkatorio-schema/schema.d.ts | 3 ++ .../handleConfigurationUpdate.ts | 1 + .../main/typescript/main/events/emitEvent.ts | 1 + .../events/schema/factorioConfiguration.kt | 6 +++- .../events/schema/factorioEvents.kt | 7 +++-- .../events/schema/factorioLuaObjects.kt | 26 +++++++++++----- .../events/schema/factorioPrototypes.kt | 11 ++++--- .../events/schema/kafkatorioPacket.kt | 21 +++++++------ .../adamko/kafkatorio/events/schema/kt2ts.kt | 14 +++++---- .../processor/FactorioEventsTopology.kt | 14 ++++++--- .../kafkatorio/processor/eventProcessor.kt | 1 + .../dev/adamko/kafkatorio/processor/serdes.kt | 11 +++---- .../dev/adamko/kafkatorio/webmap/App.kt | 1 - .../dev/adamko/kafkatorio/webmap/state.kt | 10 +++--- .../adamko/kafkatorio/webmap/websockets.kt | 31 +++++++++++++------ 18 files changed, 120 insertions(+), 67 deletions(-) diff --git a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/config-update.d.ts b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/config-update.d.ts index 1f8e37a..3302903 100644 --- a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/config-update.d.ts +++ b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/config-update.d.ts @@ -15,5 +15,6 @@ interface FactorioConfigurationUpdate extends KafkatorioPacket { allMods: FactorioModInfo[]; factorioData: FactorioGameDataUpdate; modVersion: string; + packetType: PacketType; prototypes: FactorioPrototype[]; } diff --git a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/object-data.d.ts b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/object-data.d.ts index f9d50fe..27d0907 100644 --- a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/object-data.d.ts +++ b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/object-data.d.ts @@ -1,13 +1,16 @@ // Generated by TypeScriptGenerator - do not edit this file manually +type ObjectName = "LuaPlayer" | "LuaEntity" | "LuaSurface" | "FactorioMapChunk" | "LuaTile" | "ConsoleChatMessage"; + interface FactorioObjectData { - objectName: string; + objectName: ObjectName; } interface FactorioEvent extends KafkatorioPacket { data: T; eventType: string; modVersion: string; + packetType: PacketType; tick: uint; } @@ -18,7 +21,7 @@ interface PlayerData extends FactorioObjectData { colour: Colour; lastOnline: uint; name: string; - objectName: string; + objectName: ObjectName; position: PositionData; } @@ -27,7 +30,7 @@ interface EntityData extends FactorioObjectData { health: double | null; healthRatio: double; name: string; - objectName: string; + objectName: ObjectName; playerIndex: uint | null; position: PositionData; surfaceIndex: int; @@ -39,23 +42,23 @@ interface SurfaceData extends FactorioObjectData { daytime: double; index: uint; name: string; - objectName: string; + objectName: ObjectName; } interface FactorioMapTile extends FactorioObjectData { - objectName: string; + objectName: ObjectName; position: PositionData; prototypeName: string; surfaceIndex: int; } interface FactorioMapChunk extends FactorioObjectData { - objectName: string; + objectName: ObjectName; tiles: FactorioMapTile[]; } interface ConsoleChatMessage extends FactorioObjectData { authorPlayerIndex: uint | null; content: string; - objectName: string; + objectName: ObjectName; } diff --git a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/prototype.d.ts b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/prototype.d.ts index f1d2052..fdb93b9 100644 --- a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/prototype.d.ts +++ b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/prototype.d.ts @@ -1,12 +1,9 @@ // Generated by TypeScriptGenerator - do not edit this file manually -interface FactorioPrototype { - objectName: string; -} +type PrototypeObjectName = "LuaTilePrototype"; -interface FactorioPrototypes extends KafkatorioPacket { - modVersion: string; - prototypes: T[]; +interface FactorioPrototype { + objectName: PrototypeObjectName; } interface FactorioMapTilePrototype extends FactorioPrototype { @@ -15,6 +12,6 @@ interface FactorioMapTilePrototype extends FactorioPrototype { layer: uint; mapColor: Colour; name: string; - objectName: string; + objectName: PrototypeObjectName; order: string; } diff --git a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/schema.d.ts b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/schema.d.ts index 9738c8c..18b91eb 100644 --- a/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/schema.d.ts +++ b/modules/events-mod/src/main/typescript/generated/kafkatorio-schema/schema.d.ts @@ -1,7 +1,10 @@ // Generated by TypeScriptGenerator - do not edit this file manually +type PacketType = "EVENT" | "CONFIG"; + interface KafkatorioPacket { modVersion: string; + packetType: PacketType; } interface Colour { diff --git a/modules/events-mod/src/main/typescript/main/config-update/handleConfigurationUpdate.ts b/modules/events-mod/src/main/typescript/main/config-update/handleConfigurationUpdate.ts index 89d5657..7298fb1 100644 --- a/modules/events-mod/src/main/typescript/main/config-update/handleConfigurationUpdate.ts +++ b/modules/events-mod/src/main/typescript/main/config-update/handleConfigurationUpdate.ts @@ -7,6 +7,7 @@ export function handleConfigurationUpdate(changeData: ConfigurationChangedData) emitPacket({ modVersion: global.MOD_VERSION, + packetType: "CONFIG", allMods: allMods(changeData), factorioData: factorioData(changeData), prototypes: convertPrototypes() diff --git a/modules/events-mod/src/main/typescript/main/events/emitEvent.ts b/modules/events-mod/src/main/typescript/main/events/emitEvent.ts index 4aad9ee..771b408 100644 --- a/modules/events-mod/src/main/typescript/main/events/emitEvent.ts +++ b/modules/events-mod/src/main/typescript/main/events/emitEvent.ts @@ -7,6 +7,7 @@ import {emitPacket} from "../emitKafkatorioPacket"; export function emitEvent(eventData: T, tick: uint, eventType: string) { emitPacket({ data: eventData, + packetType: "EVENT", eventType: eventType, modVersion: global.MOD_VERSION, tick: tick diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioConfiguration.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioConfiguration.kt index a3c829f..ad8844f 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioConfiguration.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioConfiguration.kt @@ -1,6 +1,7 @@ package dev.adamko.kafkatorio.events.schema import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @Serializable @@ -9,7 +10,10 @@ data class FactorioConfigurationUpdate( val factorioData: FactorioGameDataUpdate, val allMods: List, val prototypes: List, -) : KafkatorioPacket +) : KafkatorioPacket() { + @Transient + override val packetType = PacketType.CONFIG +} @Serializable data class FactorioGameDataUpdate( diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioEvents.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioEvents.kt index 12b0994..aaaf2a1 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioEvents.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioEvents.kt @@ -2,15 +2,18 @@ package dev.adamko.kafkatorio.events.schema import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient @Serializable data class FactorioEvent( override val modVersion: String, - /** the initial Factorio event (`defines.events`) trigger */ val eventType: String, /** game time */ val tick: UInt, val data: T, -) : KafkatorioPacket +) : KafkatorioPacket() { + @Transient + override val packetType: PacketType = PacketType.EVENT +} diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt index a8e1504..7d5d749 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt @@ -9,7 +9,8 @@ import kotlinx.serialization.json.JsonClassDiscriminator @JsonClassDiscriminator(FactorioObjectData.discriminatorKey) sealed class FactorioObjectData { - abstract val objectName: String + /** @see FactorioObjectData.discriminatorKey */ + abstract val objectName: ObjectName // workaround - https://github.com/Kotlin/kotlinx.serialization/issues/1664 // val objectName: String by lazy { @@ -28,12 +29,22 @@ sealed class FactorioObjectData { // } // } + enum class ObjectName { + LuaPlayer, + LuaEntity, + LuaSurface, + FactorioMapChunk, + LuaTile, + ConsoleChatMessage, + } + companion object { /** The [JsonClassDiscriminator] for [FactorioEvent] */ const val discriminatorKey: String = "objectName" } } + @Serializable @SerialName("LuaPlayer") data class PlayerData( @@ -47,7 +58,7 @@ data class PlayerData( val lastOnline: UInt, ) : FactorioObjectData() { @Transient - override val objectName: String = "LuaPlayer" + override val objectName = ObjectName.LuaPlayer } @Serializable @@ -64,7 +75,7 @@ data class EntityData( val playerIndex: UInt? = null, ) : FactorioObjectData() { @Transient - override val objectName: String = "LuaEntity" + override val objectName = ObjectName.LuaEntity } @Serializable @@ -75,16 +86,17 @@ data class SurfaceData( val name: String, ) : FactorioObjectData() { @Transient - override val objectName: String = "LuaSurface" + override val objectName = ObjectName.LuaSurface } +/** Quasi-object. This isn't a Factorio Lua type, but a helpful collection of [FactorioMapTile]s */ @Serializable @SerialName("FactorioMapChunk") data class FactorioMapChunk( val tiles: List, ) : FactorioObjectData() { @Transient - override val objectName: String = "FactorioMapChunk" + override val objectName = ObjectName.FactorioMapChunk } @Serializable @@ -95,7 +107,7 @@ data class FactorioMapTile( val surfaceIndex: Int, ) : FactorioObjectData() { @Transient - override val objectName: String = "LuaTile" + override val objectName = ObjectName.LuaTile } @Serializable @@ -104,5 +116,5 @@ data class ConsoleChatMessage( val content: String, ) : FactorioObjectData() { @Transient - override val objectName: String = "ConsoleChatMessage" + override val objectName = ObjectName.ConsoleChatMessage } diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt index 70404b9..82316f3 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt @@ -7,14 +7,17 @@ import kotlinx.serialization.json.JsonClassDiscriminator @Serializable class FactorioPrototypes( - override val modVersion: String, val prototypes: List, -) : KafkatorioPacket +) @Serializable @JsonClassDiscriminator(FactorioPrototype.discriminatorKey) sealed class FactorioPrototype { - abstract val objectName: String + abstract val objectName: PrototypeObjectName + + enum class PrototypeObjectName { + LuaTilePrototype + } companion object { const val discriminatorKey: String = "objectName" @@ -34,5 +37,5 @@ data class FactorioMapTilePrototype( val canBeMined: Boolean, ) : FactorioPrototype() { @Transient - override val objectName: String = "LuaTilePrototype" + override val objectName: PrototypeObjectName = PrototypeObjectName.LuaTilePrototype } diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt index 194f2c6..fa6d789 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt @@ -1,19 +1,22 @@ package dev.adamko.kafkatorio.events.schema; +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonClassDiscriminator -//@Serializable -sealed interface KafkatorioPacket { + +@Serializable +@JsonClassDiscriminator("packetType") +sealed class KafkatorioPacket { /** Schema versioning */ - val modVersion: String + abstract val modVersion: String + abstract val packetType: PacketType + + enum class PacketType { + EVENT, CONFIG, + } } -//enum class PacketDataType { -// EVENT, PROTOTYPE, CONFIG_DATA, -// ; -//} - - //@Serializable //@JsonClassDiscriminator(KafkatorioPacketData.discriminatorKey) //sealed class KafkatorioPacketData( diff --git a/modules/events-schema/src/jvmMain/kotlin/dev/adamko/kafkatorio/events/schema/kt2ts.kt b/modules/events-schema/src/jvmMain/kotlin/dev/adamko/kafkatorio/events/schema/kt2ts.kt index c1b48ab..3086333 100644 --- a/modules/events-schema/src/jvmMain/kotlin/dev/adamko/kafkatorio/events/schema/kt2ts.kt +++ b/modules/events-schema/src/jvmMain/kotlin/dev/adamko/kafkatorio/events/schema/kt2ts.kt @@ -48,7 +48,7 @@ fun main(args: Array) { .forEach { (defFile, def) -> val outFile = outPath.resolve(defFile).toFile() outFile.printWriter().use { - it.print(header) + it.println(header) it.print(def) } println("Generated file: $outFile") @@ -65,14 +65,16 @@ private fun splitDefinitions(definitions: String): Map { .groupBy { def -> when { "extends FactorioObjectData" in def || - "interface FactorioObjectData" in def -> "object-data.d.ts" + "interface FactorioObjectData" in def || + "type ObjectName" in def -> "object-data.d.ts" "extends FactorioPrototype" in def || - "interface FactorioPrototype" in def -> "prototype.d.ts" + "interface FactorioPrototype" in def || + "type PrototypeObjectName" in def -> "prototype.d.ts" "extends FactorioConfigurationUpdate" in def || "interface FactorioConfigurationUpdate" in def || "FactorioGameDataUpdate" in def || - "FactorioModInfo" in def -> "config-update.d.ts" - else -> "schema.d.ts" + "FactorioModInfo" in def -> "config-update.d.ts" + else -> "schema.d.ts" } } .mapValues { (_, def) -> @@ -86,7 +88,7 @@ private fun splitDefinitions(definitions: String): Map { val header = """ |// Generated by TypeScriptGenerator - do not edit this file manually | -""".trimMargin() + "\n" +""".trimMargin() //object PropertyNameTransformer : ClassTransformer { // override fun transformPropertyName( diff --git a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/FactorioEventsTopology.kt b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/FactorioEventsTopology.kt index d87339d..139bf1b 100644 --- a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/FactorioEventsTopology.kt +++ b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/FactorioEventsTopology.kt @@ -1,7 +1,8 @@ package dev.adamko.kafkatorio.processor +import dev.adamko.kafkatorio.events.schema.FactorioConfigurationUpdate import dev.adamko.kafkatorio.events.schema.FactorioEvent -import dev.adamko.kafkatorio.events.schema.FactorioObjectData +import dev.adamko.kafkatorio.events.schema.KafkatorioPacket import java.time.Duration import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString @@ -27,7 +28,7 @@ class FactorioEventsTopology( ) .mapValues { readOnlyKey, value -> println("Mapping $readOnlyKey:$value") - jsonMapper.decodeFromString>(value) + jsonMapper.decodeFromString(value) } .peek { _, value -> websocketServer.sendMessage(jsonMapper.encodeToString(value)) @@ -35,9 +36,14 @@ class FactorioEventsTopology( .to( { _, value, _ -> // println("[$key] sending event:${value.eventType} to topic:${value.data.objectName()}") - value.data.objectName + when (value) { + is FactorioEvent<*> -> + "kafkatorio.${value.packetType.name}.${value.data.objectName.name}" + is FactorioConfigurationUpdate -> + "kafkatorio.${value.packetType.name}" + } }, - Produced.with(Serdes.String(), JsonSerdes) + Produced.with(Serdes.String(), KafkatorioPacketSerde) ) val topology = builder.build() diff --git a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/eventProcessor.kt b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/eventProcessor.kt index ca3d7e2..0011293 100644 --- a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/eventProcessor.kt +++ b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/eventProcessor.kt @@ -16,4 +16,5 @@ fun main() = runBlocking { topology.build() wsServer.build().asServer(Undertow(9073)).start().block() + } diff --git a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/serdes.kt b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/serdes.kt index 14c40bf..3138db1 100644 --- a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/serdes.kt +++ b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/serdes.kt @@ -1,7 +1,6 @@ package dev.adamko.kafkatorio.processor -import dev.adamko.kafkatorio.events.schema.FactorioEvent -import dev.adamko.kafkatorio.events.schema.FactorioObjectData +import dev.adamko.kafkatorio.events.schema.KafkatorioPacket import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -14,12 +13,12 @@ import org.http4k.format.asConfigurable import org.http4k.format.withStandardMappings -object JsonSerdes : Serde> { - override fun serializer() = Serializer> { _, message -> - jsonMapper.encodeToString>(message).encodeToByteArray() +object KafkatorioPacketSerde : Serde { + override fun serializer() = Serializer { _, message -> + jsonMapper.encodeToString(message).encodeToByteArray() } - override fun deserializer() = Deserializer> { _, bytes -> + override fun deserializer() = Deserializer { _, bytes -> jsonMapper.decodeFromString(bytes.decodeToString()) } } diff --git a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/App.kt b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/App.kt index 762d111..7615b19 100644 --- a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/App.kt +++ b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/App.kt @@ -56,7 +56,6 @@ fun main() { "ws://localhost:9073/ws", reduxStore, ) - App( reduxStore = reduxStore, wsService = wsService diff --git a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/state.kt b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/state.kt index ec1c63d..8b1b823 100644 --- a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/state.kt +++ b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/state.kt @@ -2,9 +2,8 @@ package dev.adamko.kafkatorio.webmap import dev.adamko.kafkatorio.events.schema.FactorioEvent import dev.adamko.kafkatorio.events.schema.PlayerData -import externals.leaflet.geo.LatLng -import externals.leaflet.layer.overlay.Tooltip -import externals.leaflet.layer.vector.CircleMarker +import io.kvision.maps.externals.leaflet.layer.overlay.Tooltip +import io.kvision.maps.externals.leaflet.layer.vector.CircleMarker import io.kvision.maps.Maps import io.kvision.maps.Maps.Companion.L import io.kvision.redux.ReduxStore @@ -12,6 +11,7 @@ import io.kvision.redux.createReduxStore import io.kvision.utils.obj import redux.RAction + fun createFactorioReduxStore(): ReduxStore = createReduxStore( ::factorioGameReducer, @@ -21,6 +21,7 @@ fun createFactorioReduxStore(): ReduxStore = ) ) + data class FactorioGameState( val kvMaps: Maps, val players: Map, @@ -32,6 +33,7 @@ sealed class FactorioUpdate : RAction { FactorioUpdate() } + fun factorioGameReducer(state: FactorioGameState, update: FactorioUpdate): FactorioGameState = when (update) { is FactorioUpdate.PlayerUpdate -> { @@ -77,7 +79,7 @@ data class PlayerState( fillColor = color fillOpacity = 1f radius = 10 - className = playerData.objectName + className = playerData.objectName.name // interactive = false } diff --git a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/websockets.kt b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/websockets.kt index fdc7f95..0b05406 100644 --- a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/websockets.kt +++ b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/websockets.kt @@ -1,13 +1,20 @@ package dev.adamko.kafkatorio.webmap +import dev.adamko.kafkatorio.events.schema.ConsoleChatMessage +import dev.adamko.kafkatorio.events.schema.EntityData +import dev.adamko.kafkatorio.events.schema.FactorioConfigurationUpdate import dev.adamko.kafkatorio.events.schema.FactorioEvent -import dev.adamko.kafkatorio.events.schema.FactorioObjectData +import dev.adamko.kafkatorio.events.schema.FactorioMapChunk +import dev.adamko.kafkatorio.events.schema.FactorioMapTile +import dev.adamko.kafkatorio.events.schema.KafkatorioPacket import dev.adamko.kafkatorio.events.schema.PlayerData +import dev.adamko.kafkatorio.events.schema.SurfaceData import io.kvision.redux.ReduxStore import kotlinx.serialization.decodeFromString import org.w3c.dom.MessageEvent import org.w3c.dom.WebSocket + class WebsocketService( private val wsUrl: String, private val reduxStore: ReduxStore, @@ -24,22 +31,28 @@ class WebsocketService( if ( data != null - && data.trim().startsWith("{") - && data.trim().endsWith("}") + && data.trim().run { startsWith("{") && endsWith("}") } ) { println(data.replace('\n', ' ')) - val event: FactorioEvent = jsonMapper.decodeFromString(data) - when (val eventData = event.data) { - is PlayerData -> { - reduxStore.dispatch(FactorioUpdate.PlayerUpdate(event, eventData)) + when (val event: KafkatorioPacket = jsonMapper.decodeFromString(data)) { + is FactorioEvent<*> -> { + when (val eventData = event.data) { + is PlayerData -> + reduxStore.dispatch(FactorioUpdate.PlayerUpdate(event, eventData)) + is ConsoleChatMessage -> {} + is EntityData -> {} + is FactorioMapChunk -> {} + is FactorioMapTile -> {} + is SurfaceData -> {} + } } - else -> {} + is FactorioConfigurationUpdate -> {} } + } else { println(data) - } }