From bbe2a90e643f9a7a6b283caa04854939dde3c524 Mon Sep 17 00:00:00 2001 From: Janis Date: Wed, 26 Nov 2025 13:56:23 +0100 Subject: [PATCH] feat(api): Implemented turn event via websocket --- .../app/util/WebsocketEventMapper.scala | 5 +-- .../app/util/mapper/TurnEventMapper.scala | 35 +++++++++++++++++++ .../app/views/ingame/ingame.scala.html | 14 +++++--- knockoutwhistweb/public/javascripts/events.js | 34 +++++++++++++++++- 4 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 knockoutwhistweb/app/util/mapper/TurnEventMapper.scala diff --git a/knockoutwhistweb/app/util/WebsocketEventMapper.scala b/knockoutwhistweb/app/util/WebsocketEventMapper.scala index 45030d9..5cfba5e 100644 --- a/knockoutwhistweb/app/util/WebsocketEventMapper.scala +++ b/knockoutwhistweb/app/util/WebsocketEventMapper.scala @@ -6,7 +6,7 @@ import model.sessions.UserSession import play.api.libs.json.{JsValue, Json} import tools.jackson.databind.json.JsonMapper import tools.jackson.module.scala.ScalaModule -import util.mapper.{CardPlayedEventMapper, GameStateEventMapper, ReceivedHandEventMapper, SimpleEventMapper} +import util.mapper.{CardPlayedEventMapper, GameStateEventMapper, ReceivedHandEventMapper, SimpleEventMapper, TurnEventMapper} object WebsocketEventMapper { @@ -27,7 +27,8 @@ object WebsocketEventMapper { registerCustomMapper(ReceivedHandEventMapper) registerCustomMapper(GameStateEventMapper) registerCustomMapper(CardPlayedEventMapper) - + registerCustomMapper(TurnEventMapper) + def toJson(obj: SimpleEvent, session: UserSession): JsValue = { val data: Option[JsValue] = if (customMappers.contains(obj.id)) { Some(customMappers(obj.id).toJson(obj, session)) diff --git a/knockoutwhistweb/app/util/mapper/TurnEventMapper.scala b/knockoutwhistweb/app/util/mapper/TurnEventMapper.scala new file mode 100644 index 0000000..88880d7 --- /dev/null +++ b/knockoutwhistweb/app/util/mapper/TurnEventMapper.scala @@ -0,0 +1,35 @@ +package util.mapper + +import de.knockoutwhist.events.global.TurnEvent +import de.knockoutwhist.player.AbstractPlayer +import model.sessions.UserSession +import play.api.libs.json.{JsArray, JsObject, Json} + +object TurnEventMapper extends SimpleEventMapper[TurnEvent] { + + override def id: String = "TurnEvent" + + override def toJson(event: TurnEvent, session: UserSession): JsObject = { + val nextPlayers = if (session.gameLobby.logic.getPlayerQueue.isEmpty) { + Json.arr() + } else { + val queue = session.gameLobby.logic.getPlayerQueue.get + JsArray( + queue.duplicate().map(player => mapPlayer(player)).toList + ) + } + + Json.obj( + "currentPlayer" -> mapPlayer(event.player), + "nextPlayers" -> nextPlayers + ) + } + + private def mapPlayer(player: AbstractPlayer): JsObject = { + Json.obj( + "name" -> player.name, + "dog" -> player.isInDogLife + ) + } + +} diff --git a/knockoutwhistweb/app/views/ingame/ingame.scala.html b/knockoutwhistweb/app/views/ingame/ingame.scala.html index c22a21b..e4f1382 100644 --- a/knockoutwhistweb/app/views/ingame/ingame.scala.html +++ b/knockoutwhistweb/app/views/ingame/ingame.scala.html @@ -15,12 +15,16 @@ }else {

---

} - @if(gamelobby.getLogic.getPlayerQueue.isDefined && gamelobby.getLogic.getCurrentMatch && !TrickUtil.isOver(gamelobby.getLogic.getCurrentMatch.get, gamelobby.getLogic.getPlayerQueue.get)) { -

Next Player

- @for(nextplayer <- gamelobby.getLogic.getPlayerQueue.get.duplicate()) { -

@nextplayer

+ +
+ @if(gamelobby.getLogic.getPlayerQueue.isDefined && gamelobby.getLogic.getCurrentMatch && !TrickUtil.isOver(gamelobby.getLogic.getCurrentMatch.get, gamelobby.getLogic.getPlayerQueue.get)) { + @for(nextplayer <- gamelobby.getLogic.getPlayerQueue.get.duplicate()) { +

@nextplayer @if(nextplayer.isInDogLife) { + 🐶 + }

+ } } - } +
diff --git a/knockoutwhistweb/public/javascripts/events.js b/knockoutwhistweb/public/javascripts/events.js index 1ca2df2..1d0ed8f 100644 --- a/knockoutwhistweb/public/javascripts/events.js +++ b/knockoutwhistweb/public/javascripts/events.js @@ -84,6 +84,38 @@ function receiveCardPlayedEvent(eventData) { `; firstCardContainer.html(newFirstCardHTML); } +function receiveTurnEvent(eventData) { + const currentPlayer = eventData.currentPlayer; + const nextPlayers = eventData.nextPlayers; + + const currentPlayerNameContainer = $('#current-player-name'); + const nextPlayersContainer = $('#next-players-container'); + const nextPlayerText = $('#next-players-section'); + + let currentPlayerName = currentPlayer.name; + if (currentPlayer.dog) { + currentPlayerName += " 🐶"; + } + currentPlayerNameContainer.text(currentPlayerName); + + if (nextPlayers.length === 0) { + nextPlayerText.hide(); + nextPlayersContainer.html(''); + } else { + nextPlayerText.show(); + let nextPlayersHtml = ''; + nextPlayers.forEach((player) => { + let playerName = player.name; + if (player.dog) { + playerName += " 🐶"; + } + nextPlayersHtml += `

${playerName}

`; + }); + nextPlayersContainer.html(nextPlayersHtml); + } +} + onEvent("ReceivedHandEvent", receiveHandEvent) onEvent("GameStateChangeEvent", receiveGameStateChange) -onEvent("CardPlayedEvent", receiveCardPlayedEvent) \ No newline at end of file +onEvent("CardPlayedEvent", receiveCardPlayedEvent) +onEvent("TurnEvent", receiveTurnEvent) \ No newline at end of file