factorio -> event -> mod -> console -> kafka pipe -> kafka -> event processor working!!!!!!!!!!!!!!!!!!

This commit is contained in:
Adam 2021-12-03 09:04:18 +01:00
parent 7091f7648d
commit 42b60ac0c3
19 changed files with 152 additions and 87 deletions

View file

@ -14,6 +14,8 @@ dependencies {
implementation("com.github.ntrrgc:ts-generator:1.1.2")
implementation("org.jetbrains.kotlin:kotlin-reflect")
testImplementation(libs.kotest.datatest)
}
val generateTypescript by tasks.registering(JavaExec::class) {

View file

@ -1,8 +1,11 @@
package dev.adamko.kafkatorio.events.schema
import kotlin.reflect.full.findAnnotation
import kotlin.reflect.full.findAnnotations
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.json.JsonClassDiscriminator
@ -15,6 +18,8 @@ data class FactorioEvent<out T : FactorioObjectData>(
/** Schema versioning */
@SerialName("mod_version")
val modVersion: String,
@SerialName("factorio_version")
val factorioVersion: String,
/** game time */
@SerialName("tick")
val tick: UInt,
@ -29,17 +34,19 @@ const val FactorioObjectDataDiscriminatorKey: String = "object_name"
@Serializable
@JsonClassDiscriminator(FactorioObjectDataDiscriminatorKey)
sealed class FactorioObjectData {
@SerialName(FactorioObjectDataDiscriminatorKey)
abstract val objectName: String
sealed class FactorioObjectData private constructor() {
// workaround - https://github.com/Kotlin/kotlinx.serialization/issues/1664
val objectName : String by lazy {
requireNotNull(this::class.findAnnotation<SerialName>()?.value) {
"Couldn't find @SerialName for ${this::class}!"
}
}
}
@Serializable
@SerialName("LuaPlayer")
data class PlayerData(
@SerialName(FactorioObjectDataDiscriminatorKey)
override val objectName: String,
@Serializable(with = ListAsObjectSerializer::class)
@SerialName("associated_characters_unit_numbers")
val associatedCharactersUnitNumbers: List<UInt>,
@ -54,9 +61,6 @@ data class PlayerData(
@Serializable
@SerialName("LuaEntity")
data class EntityData(
@SerialName(FactorioObjectDataDiscriminatorKey)
override val objectName: String,
@SerialName("active")
val active: Boolean,
@SerialName("health")
@ -72,7 +76,7 @@ data class EntityData(
@SerialName("type")
val type: String,
@SerialName("unit_number")
val unitNumber: UInt?,
val unitNumber: UInt? = null,
@SerialName("player_index")
val playerIndex: UInt? = null,
@ -81,9 +85,6 @@ data class EntityData(
@Serializable
@SerialName("LuaSurface")
data class SurfaceData(
@SerialName(FactorioObjectDataDiscriminatorKey)
override val objectName: String,
@SerialName("daytime")
val daytime: Double,
@SerialName("index")

View file

@ -1,14 +1,8 @@
package dev.adamko.kafkatorio.events.schema
import dev.adamko.kafkatorio.events.schema.EntityData
import dev.adamko.kafkatorio.events.schema.FactorioEvent
import dev.adamko.kafkatorio.events.schema.FactorioObjectData
import dev.adamko.kafkatorio.events.schema.PlayerData
import dev.adamko.kafkatorio.events.schema.PositionData
import dev.adamko.kafkatorio.events.schema.SurfaceData
import dev.adamko.kafkatorio.events.schema.jsonMapper
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.equality.shouldBeEqualToComparingFields
import io.kotest.matchers.shouldBe
import kotlinx.serialization.decodeFromString
import org.intellij.lang.annotations.Language
@ -31,6 +25,7 @@ class FactorioEventTest : BehaviorSpec({
},
"event_type": "on_player_joined_game",
"mod_version": "0.0.4",
"factorio_version": "1.1.48",
"tick": 1278458
}
""".trimIndent()
@ -40,7 +35,6 @@ class FactorioEventTest : BehaviorSpec({
val expected = FactorioEvent(
data = PlayerData(
objectName = "LuaPlayer",
name = "fredthedeadhead",
characterUnitNumber = 1u,
associatedCharactersUnitNumbers = emptyList(),
@ -51,10 +45,13 @@ class FactorioEventTest : BehaviorSpec({
),
eventType = "on_player_joined_game",
modVersion = "0.0.4",
factorioVersion = "1.1.48",
tick = 1278458u
)
actual shouldBeEqualToComparingFields expected
expected.data.objectName shouldBe "LuaPlayer"
}
}
@ -70,6 +67,7 @@ class FactorioEventTest : BehaviorSpec({
},
"event_type": "on_tick",
"mod_version": "0.0.4",
"factorio_version": "1.1.48",
"tick": 1278480
}
""".trimIndent()
@ -78,17 +76,19 @@ class FactorioEventTest : BehaviorSpec({
val expected = FactorioEvent(
data = SurfaceData(
objectName = "LuaSurface",
name = "nauvis",
index = 1u,
daytime = 0.8390800000511436707029133685864508152008056640625
),
eventType = "on_tick",
modVersion = "0.0.4",
factorioVersion = "1.1.48",
tick = 1278480u
)
actual shouldBeEqualToComparingFields expected
expected.data.objectName shouldBe "LuaSurface"
}
}
@ -112,6 +112,7 @@ class FactorioEventTest : BehaviorSpec({
},
"event_type": "on_player_changed_position",
"mod_version": "0.0.6",
"factorio_version": "1.1.48",
"tick": 1384507
}
""".trimIndent()
@ -120,7 +121,6 @@ class FactorioEventTest : BehaviorSpec({
val expected = FactorioEvent(
data = EntityData(
objectName = "LuaEntity",
name = "character",
type = "character",
active = true,
@ -136,10 +136,13 @@ class FactorioEventTest : BehaviorSpec({
),
eventType = "on_player_changed_position",
modVersion = "0.0.6",
factorioVersion = "1.1.48",
tick = 1384507u
)
actual shouldBeEqualToComparingFields expected
expected.data.objectName shouldBe "LuaEntity"
}
}