70 lines
2.4 KiB
Scala
70 lines
2.4 KiB
Scala
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()
|
|
}
|
|
|
|
}
|