85 lines
2.8 KiB
Scala
85 lines
2.8 KiB
Scala
package model.sessions
|
|
|
|
import de.knockoutwhist.events.player.{RequestCardEvent, RequestTieChoiceEvent, RequestTrumpSuitEvent}
|
|
import de.knockoutwhist.utils.events.SimpleEvent
|
|
import logic.game.GameLobby
|
|
import model.users.User
|
|
import play.api.libs.json.{JsObject, 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(_.solveRequests())
|
|
websocketActor.foreach(_.transmitEventToClient(event))
|
|
}
|
|
|
|
override def id: UUID = user.id
|
|
|
|
override def name: String = user.name
|
|
|
|
def resetCanInteract(): Unit = {
|
|
canInteract = None
|
|
}
|
|
|
|
def handleWebResponse(eventType: String, data: JsObject): Unit = {
|
|
eventType match {
|
|
case "ping" =>
|
|
// No action needed for Ping
|
|
()
|
|
case "StartGame" =>
|
|
gameLobby.startGame(user)
|
|
case "PlayCard" =>
|
|
val maybeCardIndex: Option[Int] = (data \ "cardindex").asOpt[Int]
|
|
maybeCardIndex match {
|
|
case Some(index) =>
|
|
val session = gameLobby.getUserSession(user.id)
|
|
gameLobby.playCard(session, index)
|
|
case None =>
|
|
println("Card Index not found or is not a number." + data)
|
|
}
|
|
case "PickTrumpsuit" =>
|
|
val maybeSuitIndex: Option[Int] = (data \ "suitIndex").asOpt[Int]
|
|
maybeSuitIndex match {
|
|
case Some(index) =>
|
|
val session = gameLobby.getUserSession(user.id)
|
|
gameLobby.selectTrump(session, index)
|
|
case None =>
|
|
println("Card Index not found or is not a number.")
|
|
}
|
|
case "KickPlayer" =>
|
|
val maybePlayerId: Option[String] = (data \ "playerId").asOpt[String]
|
|
maybePlayerId match {
|
|
case Some(id) =>
|
|
val playerUUID = UUID.fromString(id)
|
|
gameLobby.leaveGame(playerUUID, true)
|
|
case None =>
|
|
println("Player ID not found or is not a valid UUID.")
|
|
}
|
|
case "ReturnToLobby" =>
|
|
gameLobby.returnToLobby(this)
|
|
case "LeaveGame" =>
|
|
gameLobby.leaveGame(user.id, false)
|
|
case _ =>
|
|
println("Unknown event type: " + eventType + " with data: " + data)
|
|
}
|
|
}
|
|
|
|
}
|