lila/app/controllers/Racer.scala

76 lines
2.1 KiB
Scala

package controllers
import play.api.mvc._
import views._
import lila.api.Context
import lila.app._
import lila.common.HTTPRequest
import lila.racer.RacerPlayer
import lila.racer.RacerRace
final class Racer(env: Env)(implicit mat: akka.stream.Materializer) extends LilaController(env) {
def home =
Open { implicit ctx =>
NoBot {
Ok(html.racer.home).fuccess
}
}
def create =
WithPlayerId { implicit ctx => playerId =>
env.racer.api.createAndJoin(playerId) map { raceId =>
Redirect(routes.Racer.show(raceId.value))
}
}
def show(id: String) =
WithPlayerId { implicit ctx => playerId =>
env.racer.api.get(RacerRace.Id(id)) match {
case None => Redirect(routes.Racer.home).fuccess
case Some(r) =>
val race = r.isLobby.??(env.racer.api.join(r.id, playerId)) | r
val player = race.player(playerId) | RacerPlayer.make(playerId)
Ok(
html.racer.show(
race,
env.racer.json.data(race, player),
env.storm.json.pref(ctx.pref)
)
).fuccess dmap NoCache
}
}
def rematch(id: String) =
WithPlayerId { implicit ctx => playerId =>
env.racer.api.get(RacerRace.Id(id)) match {
case None => Redirect(routes.Racer.home).fuccess
case Some(race) =>
env.racer.api.rematch(race, playerId) map { rematchId =>
Redirect(routes.Racer.show(rematchId.value))
}
}
}
def lobby =
WithPlayerId { implicit ctx => playerId =>
env.racer.lobby.join(playerId) map { raceId =>
Redirect(routes.Racer.show(raceId.value))
}
}
private def WithPlayerId(f: Context => RacerPlayer.Id => Fu[Result]): Action[Unit] =
Open { implicit ctx =>
NoBot {
HTTPRequest sid ctx.req map { env.racer.api.playerId(_, ctx.me) } match {
case Some(id) => f(ctx)(id)
case None =>
env.lilaCookie.ensureAndGet(ctx.req) { sid =>
f(ctx)(env.racer.api.playerId(sid, none))
}
}
}
}
}