Skip to content

Instantly share code, notes, and snippets.

POST /game controllers.MainController.createGame
POST /game/:gameId/start controllers.MainController.startGame(gameId: String, playersCount: Int)
POST /game/:gameId/roll/:playerId controllers.MainController.roll(gameId: String, playerId: String)
GET /:gameId/events controllers.MainController.gameEvents(gameId: String)
// other routes: static resources, main page
def createGame() = Action.async { request =>
WS.url(s"$apiUrl/game")
.post("")
.map {
case res if res.status == CREATED => Created(res.body)
case _ => InternalServerError
}
.recover { case _ => InternalServerError }
}
def gameEvents(gameId: String) = WebSocket.acceptWithActor[String, GameEvent] { request => out =>
WebsocketEventPublisher.props(gameId, out)
}
class WebsocketEventPublisher(gameId: String, out: ActorRef)
extends Actor
with ActorLogging
with ImplicitFlowMaterializer {
import context.dispatcher
override def preStart() = {
import Global.connection
import Config.Events._
case class GameEvent(gameId: String, eventType: String, data: JsValue)
implicit val gameEventFormat = Json.format[GameEvent]
implicit val gameEventFrameFormatter = FrameFormatter.jsonFrame[GameEvent]
override val requestStrategy = new RequestStrategy {
override def requestDemand(remainingRequested: Int) =
Math.max(remainingRequested, 1)
}
override def receive = {
case OnNext(message: Message) =>
val gameEvent =
GameEvent(
gameId = message.headers("gameId"),
override def receive = {
case ev: GameEvent =>
out ! ev
}
module.service('commandService', function($http) {
return {
createGame: function(success, error) {
$http.post('/game')
.success(success)
.error(error);
},
startGame: function(gameId, playersCount, error) {
$http.post('/game/' + gameId + '/start?playersCount=' + playersCount)
.error(error);
$rootScope.page = "create"; // one of: "create", "choose_players", "game"