Files
KnockOutWhist-Web/knockoutwhistweb/app/util/WebsocketEventMapper.scala
LQ63 0c2901bce0 feat(ui): Websocket
Started implementing functionality to Websocket.
2025-11-26 01:35:46 +01:00

49 lines
1.6 KiB
Scala

package util
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.scala.ScalaModule
import de.knockoutwhist.utils.events.SimpleEvent
import logic.game.GameLobby
import play.api.libs.json.{JsValue, Json}
import util.mapper.{GameStateChangeEventMapper, NewRoundEventMapper, NewTrickEventMapper, ReceivedHandEventMapper, RequestCardEventMapper, SimpleEventMapper, TrickEndEventMapper}
object WebsocketEventMapper {
private val scalaModule = ScalaModule.builder()
.addAllBuiltinModules()
//.supportScala3Classes(true)
.build()
private val mapper = JsonMapper.builder().addModule(scalaModule).build()
private var customMappers: Map[String,SimpleEventMapper[SimpleEvent]] = Map()
private def registerCustomMapper[T <: SimpleEvent](mapper: SimpleEventMapper[T]): Unit = {
customMappers = customMappers + (mapper.id -> mapper.asInstanceOf[SimpleEventMapper[SimpleEvent]])
}
// Register all custom mappers here
registerCustomMapper(ReceivedHandEventMapper)
registerCustomMapper(NewRoundEventMapper)
registerCustomMapper(NewTrickEventMapper)
registerCustomMapper(TrickEndEventMapper)
registerCustomMapper(RequestCardEventMapper)
registerCustomMapper(GameStateChangeEventMapper)
def toJson(obj: SimpleEvent, gameLobby: GameLobby): JsValue = {
val data: Option[JsValue] = if (customMappers.contains(obj.id)) {
Some(customMappers(obj.id).toJson(obj, gameLobby))
}else {
None
}
if (data.isEmpty) {
return Json.obj()
}
Json.obj(
"id" -> ("request-" + java.util.UUID.randomUUID().toString),
"event" -> obj.id,
"data" -> data
)
}
}