From 6fe3132f23aa457afa41f9bd5acb213375857392 Mon Sep 17 00:00:00 2001 From: Adam <897017+aSemy@users.noreply.github.com> Date: Wed, 19 Jan 2022 18:40:07 +0100 Subject: [PATCH] more tiles stuff working... --- modules/events-server/.gitignore | 1 - .../processor/KafkatorioTopology.kt | 34 ++++++++++++------- .../kafkatorio/processor/WebsocketServer.kt | 7 ++-- .../kafkatorio/processor/eventProcessor.kt | 10 +++++- .../processor/tileserver/WebMapTileServer.kt | 19 +++++++++++ .../src/main/resources/.gitignore | 1 + .../src/main/resources/logback.xml | 4 +-- .../dev/adamko/kafkatorio/webmap/map.kt | 11 +++++- 8 files changed, 66 insertions(+), 21 deletions(-) delete mode 100644 modules/events-server/.gitignore create mode 100644 modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/tileserver/WebMapTileServer.kt create mode 100644 modules/events-server/src/main/resources/.gitignore diff --git a/modules/events-server/.gitignore b/modules/events-server/.gitignore deleted file mode 100644 index 9ad4db8..0000000 --- a/modules/events-server/.gitignore +++ /dev/null @@ -1 +0,0 @@ -**/kafkatorio-web-map/** diff --git a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/KafkatorioTopology.kt b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/KafkatorioTopology.kt index 6083bd9..13a5290 100644 --- a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/KafkatorioTopology.kt +++ b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/KafkatorioTopology.kt @@ -49,6 +49,7 @@ import org.apache.kafka.streams.TopologyDescription import org.apache.kafka.streams.kstream.Consumed import org.apache.kafka.streams.kstream.KStream import org.apache.kafka.streams.kstream.KTable +import org.apache.kafka.streams.kstream.Suppressed import org.apache.kafka.streams.processor.RecordContext import org.apache.kafka.streams.state.QueryableStoreTypes import org.apache.kafka.streams.state.ReadOnlyKeyValueStore @@ -120,11 +121,11 @@ class KafkatorioTopology( ) { _: String, value: KafkatorioPacket, _: RecordContext -> // println("[$key] sending event:${value.eventType} to topic:${value.data.objectName()}") when (value) { - is FactorioEvent -> + is FactorioEvent -> "kafkatorio.${value.packetType.name}.${value.data.objectName.name}" is FactorioConfigurationUpdate -> "kafkatorio.${value.packetType.name}.FactorioConfigurationUpdate" - is FactorioPrototypes -> + is FactorioPrototypes -> "kafkatorio.${value.packetType.name}.all" } } @@ -219,14 +220,14 @@ class KafkatorioTopology( "kafkatorio.${KafkatorioPacket.PacketType.EVENT}.${FactorioObjectData.ObjectName.LuaTiles}", Consumed.with(Serdes.String(), jsonMapper.serde()) ) - .peek { k, v -> - println("trying to handle MapChunk update... $k: ${v.eventType}") - } +// .peek { k, v -> +// println("trying to handle MapChunk update... $k: ${v.eventType}") +// } .filter("events.filter.map-tiles") { _: String, event: FactorioEvent -> event.data is MapTiles } .mapValues("events.extract-map-tiles") { _, event: FactorioEvent -> (event.data as? MapTiles)!! } - .peek { key, value -> - println("MapChunk update $key, tiles count: ${value.tiles.size}") - } +// .peek { key, value -> +// println("MapChunk update $key, tiles count: ${value.tiles.size}") +// } val chunkTilesUpdateStream: KStream = builder.stream( @@ -262,7 +263,7 @@ class KafkatorioTopology( luaTilesUpdatesStream .merge("luaTilesUpdatesStream-and-chunkTilesUpdateStream", chunkTilesUpdateStream) .flatMapTopicRecords("all-tiles-convert-to-TileUpdateRecord") { _, mapTiles: MapTiles -> - println("all map tiles update ${mapTiles.tiles.size}") +// println("all map tiles update ${mapTiles.tiles.size}") mapTiles.tiles.map { tile -> TileUpdateRecord( mapTiles.surfaceIndex, @@ -288,6 +289,12 @@ class KafkatorioTopology( .reduce { tileA, tileB -> tileA.copy(tiles = tileA.tiles + tileB.tiles) } + .suppress( + Suppressed.untilTimeLimit( + Duration.ofSeconds(30), + Suppressed.BufferConfig.maxRecords(30) + ) + ) chunksTable .toStream() @@ -302,7 +309,7 @@ class KafkatorioTopology( } } - @Suppress("KotlinConstantConditions") +// @Suppress("KotlinConstantConditions") private fun saveMapTilesPng(key: MapChunkDataPosition, chunk: MapChunkData) { val chunkOriginX = chunk.chunkPosition.position.leftTopTile.x @@ -325,7 +332,10 @@ class KafkatorioTopology( ?.toHexadecimal() val rgbColour = when (prototypeColour) { - null -> RGBColor(11, 11, 11, 0) + null -> { + println("missing prototype: ${tile.prototypeName}") + RGBColor(11, 11, 11, 0) + } else -> RGBColor( prototypeColour.red.roundToInt(), prototypeColour.green.roundToInt(), @@ -347,7 +357,7 @@ class KafkatorioTopology( val zoom = 1u val file = - File("kafkatorio-web-map/s${key.surfaceIndex}/z$zoom/x${key.position.x}/y${key.position.y}.png") + File("src/main/resources/kafkatorio-web-map/s${key.surfaceIndex}/z$zoom/x${key.position.x}/y${key.position.y}.png") if (file.parentFile.mkdirs()) { println("created new map tile parentFile directory ${file.absolutePath}") diff --git a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/WebsocketServer.kt b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/WebsocketServer.kt index 05efe69..d573ded 100644 --- a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/WebsocketServer.kt +++ b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/WebsocketServer.kt @@ -17,6 +17,7 @@ import org.http4k.routing.bind import org.http4k.routing.websockets import org.http4k.server.PolyHandler import org.http4k.websocket.Websocket +import org.http4k.websocket.WsHandler import org.http4k.websocket.WsMessage import org.http4k.websocket.WsStatus @@ -47,7 +48,7 @@ class WebsocketServer { messages.emit(msg) } - suspend fun build(): PolyHandler = supervisorScope builder@{ + suspend fun build(): WsHandler = supervisorScope builder@{ coroutineContext.job.invokeOnCompletion { e -> e?.let { serverJob.completeExceptionally(it) } ?: serverJob.complete() @@ -89,10 +90,8 @@ class WebsocketServer { } .launchIn(serverScope) - val http = { _: Request -> Response(OK) } - val ws = websockets("/ws" bind ::bindClient) - return@builder PolyHandler(http, ws) + return@builder websockets("/ws" bind ::bindClient) } } 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 499cb63..bc3ab88 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 @@ -2,7 +2,9 @@ package dev.adamko.kafkatorio.processor import dev.adamko.kafkatorio.processor.config.ApplicationProperties +import dev.adamko.kafkatorio.processor.tileserver.WebMapTileServer import kotlinx.coroutines.runBlocking +import org.http4k.server.PolyHandler import org.http4k.server.Undertow import org.http4k.server.asServer @@ -11,10 +13,16 @@ val appProps = ApplicationProperties() fun main() = runBlocking { val wsServer = WebsocketServer() + val tileServer = WebMapTileServer() val topology = KafkatorioTopology(wsServer) topology.build() - wsServer.build().asServer(Undertow(9073)).start().block() + PolyHandler( + tileServer.build(), + wsServer.build(), + ).asServer(Undertow(9073)) + .start() + .block() } diff --git a/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/tileserver/WebMapTileServer.kt b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/tileserver/WebMapTileServer.kt new file mode 100644 index 0000000..5c2ea5e --- /dev/null +++ b/modules/events-server/src/main/kotlin/dev/adamko/kafkatorio/processor/tileserver/WebMapTileServer.kt @@ -0,0 +1,19 @@ +package dev.adamko.kafkatorio.processor.tileserver + +import org.http4k.core.HttpHandler +import org.http4k.routing.ResourceLoader +import org.http4k.routing.RoutingHttpHandler +import org.http4k.routing.bind +import org.http4k.routing.routes +import org.http4k.routing.static + +class WebMapTileServer { + + private val routes: RoutingHttpHandler = routes( + "/tiles" bind static(ResourceLoader.Classpath("/kafkatorio-web-map")) + ) + + fun build(): HttpHandler { + return routes + } +} diff --git a/modules/events-server/src/main/resources/.gitignore b/modules/events-server/src/main/resources/.gitignore new file mode 100644 index 0000000..46d00ec --- /dev/null +++ b/modules/events-server/src/main/resources/.gitignore @@ -0,0 +1 @@ +kafkatorio-web-map/** diff --git a/modules/events-server/src/main/resources/logback.xml b/modules/events-server/src/main/resources/logback.xml index 4c3eb02..b53b7f5 100644 --- a/modules/events-server/src/main/resources/logback.xml +++ b/modules/events-server/src/main/resources/logback.xml @@ -5,13 +5,13 @@ - %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + %cyan(%d{HH:mm:ss.SSS}) %white([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n - + diff --git a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/map.kt b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/map.kt index 3bf8615..1e310ee 100644 --- a/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/map.kt +++ b/modules/web-map/src/main/kotlin/dev/adamko/kafkatorio/webmap/map.kt @@ -1,8 +1,10 @@ package dev.adamko.kafkatorio.webmap +import io.kvision.maps.DefaultTileLayers import io.kvision.maps.externals.leaflet.geo.CRS import io.kvision.maps.externals.leaflet.geo.LatLng import io.kvision.maps.Maps +import io.kvision.maps.Maps.Companion.L import io.kvision.utils.px // @@ -24,9 +26,16 @@ fun createFactorioMap() = Maps { margin = 10.px configureLeafletMap { - setView(LatLng(0, 0), 13) + setView(LatLng(0, 0), 1) // DefaultTileLayers.OpenStreetMap.addTo(this) + L.tileLayer( + """http://localhost:9073/tiles/s1/z1/x{x}/y{y}.png""" + ) { + attribution = "kafkatorio" + tms = true + minZoom = 1 + }.addTo(this) with(options) { crs = CRS.Simple