From 3262ccfc06e18ab8b4562ea8e7cb8e6f4e093e66 Mon Sep 17 00:00:00 2001 From: Janis Date: Mon, 24 Nov 2025 14:31:17 +0100 Subject: [PATCH] feat(api): Enhance event mappers to include GameLobby in JSON serialization --- .../app/model/sessions/UserSession.scala | 1 + .../app/model/sessions/UserWebsocketActor.scala | 9 ++++++--- .../app/util/WebsocketEventMapper.scala | 14 ++++++++++---- .../app/util/mapper/ReceivedHandEventMapper.scala | 3 ++- .../app/util/mapper/SimpleEventMapper.scala | 3 ++- knockoutwhistweb/public/javascripts/websocket.js | 10 +++++----- 6 files changed, 26 insertions(+), 14 deletions(-) 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 0a9a820..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.toJson(event) - out ! jsonString + transmitJsonToClient(WebsocketEventMapper.toJson(event)) } } diff --git a/knockoutwhistweb/app/util/WebsocketEventMapper.scala b/knockoutwhistweb/app/util/WebsocketEventMapper.scala index f8f55c1..c12ecef 100644 --- a/knockoutwhistweb/app/util/WebsocketEventMapper.scala +++ b/knockoutwhistweb/app/util/WebsocketEventMapper.scala @@ -1,6 +1,7 @@ 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 @@ -24,10 +25,15 @@ object WebsocketEventMapper { // Register all custom mappers here registerCustomMapper(ReceivedHandEventMapper) - def toJson(obj: SimpleEvent): JsValue = { - val data = if (customMappers.contains(obj.id)) { - return customMappers(obj.id).toJson(obj) - }else Json.parse(mapper.writeValueAsString(obj)) + 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, diff --git a/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala b/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala index 13827c0..830a761 100644 --- a/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala +++ b/knockoutwhistweb/app/util/mapper/ReceivedHandEventMapper.scala @@ -1,13 +1,14 @@ 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): JsObject = { + 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 index aa91a1a..660fcea 100644 --- a/knockoutwhistweb/app/util/mapper/SimpleEventMapper.scala +++ b/knockoutwhistweb/app/util/mapper/SimpleEventMapper.scala @@ -1,11 +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): JsObject + def toJson(event: T, gameLobby: GameLobby): JsObject } diff --git a/knockoutwhistweb/public/javascripts/websocket.js b/knockoutwhistweb/public/javascripts/websocket.js index cdacc58..ccbf44f 100644 --- a/knockoutwhistweb/public/javascripts/websocket.js +++ b/knockoutwhistweb/public/javascripts/websocket.js @@ -41,8 +41,8 @@ function setupSocketHandlers(socket) { if (id && eventType) { const handler = handlers.get(eventType); - const sendResponse = (respData) => { - const response = {id: id, event: eventType, data: respData === undefined ? {} : respData}; + const sendResponse = (result) => { + const response = {id: id, event: eventType, status: result}; if (socket && socket.readyState === WebSocket.OPEN) { socket.send(JSON.stringify(response)); } else { @@ -58,10 +58,10 @@ function setupSocketHandlers(socket) { try { Promise.resolve(handler(data === undefined ? {} : data)) - .then(result => sendResponse(result)) - .catch(err => sendResponse({error: err?.message ? err.message : String(err)})); + .then(_ => sendResponse("success")) + .catch(_ => sendResponse("error")); } catch (err) { - sendResponse({error: err?.message ? err.message : String(err)}); + sendResponse("error"); } } };