Files
CoqDecks/server/app/controllers/massivedecks/game/Game.scala
T

135 lines
3.5 KiB
Scala

package controllers.massivedecks.game
import javax.inject.Inject
import scala.concurrent.ExecutionContext
import scala.util.{Success, Failure, Try}
import akka.actor.Actor
import com.google.inject.assistedinject.Assisted
import play.api.libs.json.Json
import models.massivedecks.Lobby.Formatters._
import models.massivedecks.Player.Formatters._
import models.massivedecks.Game.Formatters._
import models.massivedecks.Player.Secret
import controllers.massivedecks.cardcast.CardcastDeck
import controllers.massivedecks.game.Game.AddRetrievedDeck
import controllers.massivedecks.game.Actions.Player.{Leave, AddAi, GetHand, NewPlayer}
import controllers.massivedecks.game.Actions.Lobby._
class Game @Inject()(private val state: State, @Assisted private val id: String)(implicit ec: ExecutionContext) extends Actor {
def receive = {
case message @ _ => doReceive(message)
}
def doReceive(message: Any) = {
message match {
case GetLobby =>
sender() ! Try {
Json.toJson(state.lobby)
}
case AddDeck(secret, deckId) =>
val originalSender = sender()
val attempt = Try {
state.retrieveDeck(secret, deckId)
.map(deck => AddRetrievedDeck(secret, deck))
.onComplete({
case Success(result) => self.tell(result, originalSender)
case Failure(failure) => originalSender ! Failure(failure)
})
}
if (attempt.isFailure) {
sender() ! attempt
}
case AddRetrievedDeck(secret, deck) =>
println(sender())
sender() ! Try {
state.addDeck(secret, deck)
Json.toJson(state.lobbyAndHand(secret))
}
case NewGame(secret) =>
sender() ! Try {
state.newGame(secret)
Json.toJson(state.lobbyAndHand(secret))
}
case Play(secret, ids) =>
sender() ! Try {
state.play(secret, ids)
Json.toJson(state.lobbyAndHand(secret))
}
case Choose(secret, winner) =>
sender() ! Try {
state.choose(secret, winner)
Json.toJson(state.lobbyAndHand(secret))
}
case NewPlayer(name) =>
sender() ! Try {
Json.toJson(state.newPlayer(name))
}
case GetHand(playerSecret) =>
sender() ! Try {
Json.toJson(state.getHand(playerSecret))
}
case GetLobbyAndHand(playerSecret) =>
sender() ! Try {
Json.toJson(state.lobbyAndHand(playerSecret))
}
case Register(secret, socket) =>
sender() ! Try {
state.register(secret, socket)
}
case Unregister(secret, socket) =>
sender() ! Try {
state.unregister(secret, socket)
}
case AddAi =>
sender() ! Try {
state.newAi()
Json.toJson("")
}
case Leave(secret) =>
sender() ! Try {
state.leave(secret)
Json.toJson(state.lobbyAndHand(secret))
}
case Skip(secret, players) =>
sender() ! Try {
state.skip(secret, players)
Json.toJson(state.lobbyAndHand(secret))
}
case Back(secret) =>
sender() ! Try {
state.back(secret)
Json.toJson(state.lobbyAndHand(secret))
}
case _ =>
sender() ! Try {
throw new Exception("Unknown message: " + message)
}
}
}
}
object Game {
case class AddRetrievedDeck(secret: Secret, deck: CardcastDeck)
trait Factory {
def apply(id: String): Actor
}
}