package model.sessions import de.knockoutwhist.events.player.{RequestCardEvent, RequestTieChoiceEvent, RequestTrumpSuitEvent} import de.knockoutwhist.utils.events.SimpleEvent import logic.PodManager import logic.game.GameLobby import model.users.User import play.api.libs.json.Format.GenericFormat import play.api.libs.json.{JsError, JsObject, JsResult, JsSuccess, JsValue} import java.util.UUID import java.util.concurrent.locks.ReentrantLock import scala.util.Try class UserSession(val user: User, val host: Boolean, val gameLobby: GameLobby) extends PlayerSession { val lock: ReentrantLock = ReentrantLock() var canInteract: Option[InteractionType] = None var websocketActor: Option[UserWebsocketActor] = None override def updatePlayer(event: SimpleEvent): Unit = { event match { case event: RequestTrumpSuitEvent => canInteract = Some(InteractionType.TrumpSuit) case event: RequestTieChoiceEvent => canInteract = Some(InteractionType.TieChoice) case event: RequestCardEvent => if (event.player.isInDogLife) canInteract = Some(InteractionType.DogCard) else canInteract = Some(InteractionType.Card) case _ => } websocketActor.foreach(_.transmitEventToClient(event, gameLobby)) } override def id: UUID = user.id override def name: String = user.name def resetCanInteract(): Unit = { canInteract = None } def handleWebResponse(eventType: String, data: JsObject): Unit = { lock.lock() Try { eventType match { case "Ping" => // No action needed for Ping () case "Start Game" => println("INSIDE HANDLE WEB RESPONSE" + data) val gameId: String = (data \ "gameId").get.toString val cleanGameId: String = gameId.replaceAll("^[\"']|[\"']$", "") val user: JsObject = (data \ "user").asOpt[JsObject].get val gameLobby: GameLobby = PodManager.getGame(cleanGameId).get val realUser: JsResult[User] = user.validate[User] val uu: User = realUser match { case JsSuccess(extractedUser, _) => extractedUser case e: JsError => println("FAILED" + JsError.toJson(e).toString()) throw new Exception("Failed to deserialize User object: " + JsError.toJson(e).toString()) } gameLobby.startGame(uu) } } lock.unlock() } }