diff --git a/knockoutwhistweb/app/model/sessions/UserSession.scala b/knockoutwhistweb/app/model/sessions/UserSession.scala
index ed249c9..c98e384 100644
--- a/knockoutwhistweb/app/model/sessions/UserSession.scala
+++ b/knockoutwhistweb/app/model/sessions/UserSession.scala
@@ -26,6 +26,7 @@ class UserSession(val user: User, val host: Boolean, val gameLobby: GameLobby) e
else canInteract = Some(InteractionType.Card)
case _ =>
}
+ websocketActor.foreach(_.transmitEventToClient(event))
}
override def id: UUID = user.id
diff --git a/knockoutwhistweb/app/model/sessions/UserWebsocketActor.scala b/knockoutwhistweb/app/model/sessions/UserWebsocketActor.scala
index fba8100..d7f80f6 100644
--- a/knockoutwhistweb/app/model/sessions/UserWebsocketActor.scala
+++ b/knockoutwhistweb/app/model/sessions/UserWebsocketActor.scala
@@ -61,6 +61,10 @@ class UserWebsocketActor(
))
return
}
+ val statusOpt = (json \ "status").asOpt[String]
+ if (statusOpt.isDefined) {
+ return
+ }
val event = eventOpt.get
val data = (json \ "data").asOpt[JsObject].getOrElse(Json.obj())
val result = Try {
@@ -83,12 +87,11 @@ class UserWebsocketActor(
}
def transmitJsonToClient(jsonObj: JsObject): Unit = {
- out ! jsonObj.toString()
+ transmitTextToClient(jsonObj.toString())
}
def transmitEventToClient(event: SimpleEvent): Unit = {
- val jsonString = WebsocketEventMapper.toJsonString(event)
- out ! jsonString
+ transmitJsonToClient(WebsocketEventMapper.toJson(event))
}
}
diff --git a/knockoutwhistweb/app/util/WebUIUtils.scala b/knockoutwhistweb/app/util/WebUIUtils.scala
index f797985..625303d 100644
--- a/knockoutwhistweb/app/util/WebUIUtils.scala
+++ b/knockoutwhistweb/app/util/WebUIUtils.scala
@@ -1,8 +1,9 @@
package util
-import de.knockoutwhist.cards.Card
+import de.knockoutwhist.cards.{Card, Hand}
import de.knockoutwhist.cards.CardValue.*
import de.knockoutwhist.cards.Suit.{Clubs, Diamonds, Hearts, Spades}
+import play.api.libs.json.{JsArray, Json}
import play.twirl.api.Html
import scalafx.scene.image.Image
@@ -36,4 +37,22 @@ object WebUIUtils {
f"$cv$s"
}
+ /**
+ * Map a Hand to a JsArray of cards
+ * Per card it has the string and the index in the hand
+ * @param hand
+ * @return
+ */
+ def handToJson(hand: Hand): JsArray = {
+ val cards = hand.cards
+ JsArray(
+ cards.zipWithIndex.map { case (card, index) =>
+ Json.obj(
+ "idx" -> index,
+ "card" -> cardtoString(card)
+ )
+ }
+ )
+ }
+
}
diff --git a/knockoutwhistweb/app/util/WebsocketEventMapper.scala b/knockoutwhistweb/app/util/WebsocketEventMapper.scala
index 7e01a7f..c12ecef 100644
--- a/knockoutwhistweb/app/util/WebsocketEventMapper.scala
+++ b/knockoutwhistweb/app/util/WebsocketEventMapper.scala
@@ -1,8 +1,11 @@
package util
import de.knockoutwhist.utils.events.SimpleEvent
+import logic.game.GameLobby
+import play.api.libs.json.{JsValue, Json}
import tools.jackson.databind.json.JsonMapper
import tools.jackson.module.scala.ScalaModule
+import util.mapper.{ReceivedHandEventMapper, SimpleEventMapper}
object WebsocketEventMapper {
@@ -13,8 +16,29 @@ object WebsocketEventMapper {
private val mapper = JsonMapper.builder().addModule(scalaModule).build()
- def toJsonString(obj: SimpleEvent): String = {
- mapper.writeValueAsString(obj)
+ 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)
+
+ def toJson(obj: SimpleEvent, gameLobby: GameLobby): JsValue = {
+ val data: Option[JsValue] = if (customMappers.contains(obj.id)) {
+ Some(customMappers(obj.id).toJson(obj))
+ }else {
+ None
+ }
+ if (data.isEmpty) {
+ return Json.obj()
+ }
+ Json.obj(
+ "id" -> ("request-" + java.util.UUID.randomUUID().toString),
+ "event" -> obj.id,
+ "data" -> data
+ )
}
}
diff --git a/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala b/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala
new file mode 100644
index 0000000..830a761
--- /dev/null
+++ b/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala
@@ -0,0 +1,17 @@
+package util.mapper
+
+import de.knockoutwhist.events.player.ReceivedHandEvent
+import logic.game.GameLobby
+import play.api.libs.json.{JsArray, JsObject, Json}
+import util.WebUIUtils
+
+object ReceivedHandEventMapper extends SimpleEventMapper[ReceivedHandEvent] {
+
+ override def id: String = "ReceivedHandEvent"
+ override def toJson(event: ReceivedHandEvent, gameLobby: GameLobby): JsObject = {
+ Json.obj(
+ "dog" -> event.player.isInDogLife,
+ "hand" -> event.player.currentHand().map(hand => WebUIUtils.handToJson(hand))
+ )
+ }
+}
diff --git a/knockoutwhistweb/app/util/mapper/SimpleEventMapper.scala b/knockoutwhistweb/app/util/mapper/SimpleEventMapper.scala
new file mode 100644
index 0000000..660fcea
--- /dev/null
+++ b/knockoutwhistweb/app/util/mapper/SimpleEventMapper.scala
@@ -0,0 +1,12 @@
+package util.mapper
+
+import de.knockoutwhist.utils.events.SimpleEvent
+import logic.game.GameLobby
+import play.api.libs.json.JsObject
+
+trait SimpleEventMapper[T <: SimpleEvent] {
+
+ def id: String
+ def toJson(event: T, gameLobby: GameLobby): JsObject
+
+}
diff --git a/knockoutwhistweb/app/views/main.scala.html b/knockoutwhistweb/app/views/main.scala.html
index 72e8799..aea7e72 100644
--- a/knockoutwhistweb/app/views/main.scala.html
+++ b/knockoutwhistweb/app/views/main.scala.html
@@ -26,6 +26,8 @@
+
+