more tournament rewrite

pull/572/head
Thibault Duplessis 2015-06-11 17:22:17 +02:00
parent 6475aae264
commit e90024a41c
17 changed files with 27 additions and 121 deletions

View File

@ -8,7 +8,7 @@ import lila.api.Context
import lila.app._
import lila.common.HTTPRequest
import lila.game.{ Pov, GameRepo }
import lila.tournament.{ System, TournamentRepo, Created, Started, Finished, Tournament => Tourney }
import lila.tournament.{ System, TournamentRepo, Tournament => Tourney }
import lila.user.UserRepo
import views._
@ -59,8 +59,8 @@ object Tournament extends LilaController {
def gameStanding(id: String) = Open { implicit ctx =>
env.cached tour id map {
case Some(t: lila.tournament.StartedOrFinished) => Ok(html.tournament.gameStanding(t, true))
case _ => NotFound
case Some(t) if !t.isCreated => Ok(html.tournament.gameStanding(t, true))
case _ => NotFound
}
}

View File

@ -7,7 +7,7 @@ import lila.game.Game
import lila.rating.PerfType
import lila.simul.Simul
import lila.timeline.Entry
import lila.tournament.{ Enterable, Winner }
import lila.tournament.{ Tournament, Winner }
import lila.tv.{ Featured, StreamOnAir }
import lila.user.User
import lila.playban.TempBan
@ -24,11 +24,11 @@ final class Preload(
lobbyApi: lila.api.LobbyApi,
getPlayban: String => Fu[Option[TempBan]]) {
private type Response = (JsObject, List[Entry], List[MiniForumPost], List[Enterable], List[Simul], Option[Game], List[(User, PerfType)], List[Winner], Option[lila.puzzle.DailyPuzzle], List[StreamOnAir], List[lila.blog.MiniPost], Option[TempBan], Int)
private type Response = (JsObject, List[Entry], List[MiniForumPost], List[Tournament], List[Simul], Option[Game], List[(User, PerfType)], List[Winner], Option[lila.puzzle.DailyPuzzle], List[StreamOnAir], List[lila.blog.MiniPost], Option[TempBan], Int)
def apply(
posts: Fu[List[MiniForumPost]],
tours: Fu[List[Enterable]],
tours: Fu[List[Tournament]],
simuls: Fu[List[Simul]])(implicit ctx: Context): Fu[Response] =
lobbyApi(ctx) zip
posts zip

View File

@ -87,7 +87,7 @@
}
@myTour match {
case Some(t: lila.tournament.StartedOrFinished) => { @tournament.gameStanding(t, withTourStanding) }
case Some(t) if !t.isCreated => { @tournament.gameStanding(t, withTourStanding) }
case _ => {
@pov.game.tournamentId.map { tourId =>
<div class="game_tournament side_box no_padding">

View File

@ -1,4 +1,4 @@
@(data: play.api.libs.json.JsObject, userTimeline: List[lila.timeline.Entry], forumRecent: List[lila.forum.MiniForumPost], tours: List[lila.tournament.Enterable], simuls: List[lila.simul.Simul], featured: Option[Game], leaderboard: List[(User, lila.rating.PerfType)], tournamentWinners: List[lila.tournament.Winner], puzzle: Option[lila.puzzle.DailyPuzzle], streams: List[lila.tv.StreamOnAir], lastPost: List[lila.blog.MiniPost], playban: Option[lila.playban.TempBan], nbRounds: Int)(implicit ctx: Context)
@(data: play.api.libs.json.JsObject, userTimeline: List[lila.timeline.Entry], forumRecent: List[lila.forum.MiniForumPost], tours: List[Tournament], simuls: List[lila.simul.Simul], featured: Option[Game], leaderboard: List[(User, lila.rating.PerfType)], tournamentWinners: List[lila.tournament.Winner], puzzle: Option[lila.puzzle.DailyPuzzle], streams: List[lila.tv.StreamOnAir], lastPost: List[lila.blog.MiniPost], playban: Option[lila.playban.TempBan], nbRounds: Int)(implicit ctx: Context)
@import play.api.libs.json.Json
@underchat = {

View File

@ -1,4 +1,4 @@
@(tours: List[lila.tournament.Enterable])
@(tours: List[Tournament])
<table class="tournaments">
@tournament.enterableTable(tours, true)

View File

@ -1,4 +1,4 @@
@(tours: List[lila.tournament.Enterable], scheduled: Boolean)
@(tours: List[Tournament], scheduled: Boolean)
@if(!scheduled && tours.isEmpty) {
<tr class="create">

View File

@ -3,7 +3,7 @@
@side = {
<div class="tournament_links">
<a href="@routes.Tournament.help("arena".some)">Arena tournament help</a>
<a href="@routes.Tournament.help("swiss".some)">Swiss tournament help</a>
*<a href="@routes.Tournament.help("swiss".some)">Swiss tournament help</a>*
<a href="@routes.Tournament.home()">Return to tournaments</a>
</div>
}

View File

@ -1,16 +1,10 @@
@(t: lila.tournament.StartedOrFinished, withStanding: Boolean)(implicit ctx: Context)
@(t: Tournament, withStanding: Boolean)(implicit ctx: Context)
<div class="game_tournament side_box no_padding scroll-shadow-soft">
<p class="top text" data-icon="g"><a href="@routes.Tournament.show(t.id)">@t.fullName</a></p>
@t match {
case t: lila.tournament.Started => {
<div class="clock" data-time="@t.remainingSeconds">
<div class="time text" data-icon="p">@t.clockStatus</div>
</div>
}
case _ => {
}
}
@if(withStanding) {
<table class="slist standing">
<tbody>

View File

@ -1,4 +1,4 @@
@(createds: List[lila.tournament.Created], starteds: List[lila.tournament.Started], finisheds: List[lila.tournament.Finished], scheduled: List[lila.tournament.Created], leaderboard: List[User])(implicit ctx: Context)
@(createds: List[Tournament], starteds: List[Tournament], finisheds: List[Tournament], scheduled: List[Tournament], leaderboard: List[User])(implicit ctx: Context)
@side = {
<div class="tournament_links">

View File

@ -1,6 +1,6 @@
@(createds: List[lila.tournament.Created], starteds: List[lila.tournament.Started], finisheds: List[lila.tournament.Finished])(implicit ctx: Context)
@(createds: List[Tournament], starteds: List[Tournament], finisheds: List[Tournament])(implicit ctx: Context)
@joinButton(tour: lila.tournament.Enterable) = {
@joinButton(tour: Tournament) = {
@ctx.me.map { me =>
@if(tour isActive me) {
<span class="joined text" data-icon="E">JOINED</span>
@ -12,13 +12,13 @@
}
}
@iconTd(tour: lila.tournament.Tournament) = {
@iconTd(tour: tournament.Tournament) = {
<td class="icon">
<span @if(tour.scheduled){class="is-gold"} data-icon="@tournamentIconChar(tour)"></span>
</td>
}
@tourTd(tour: lila.tournament.Tournament) = {
@tourTd(tour: tournament.Tournament) = {
<td class="header">
<a href="@routes.Tournament.show(tour.id)">
<span class="name">

View File

@ -11,7 +11,7 @@ import lila.pref.Pref
import lila.round.JsonView
import lila.security.Granter
import lila.simul.Simul
import lila.tournament.{ RoundTournament, TournamentRepo }
import lila.tournament.{ TournamentRepo, Tournament }
import lila.user.User
private[api] final class RoundApi(
@ -26,7 +26,7 @@ private[api] final class RoundApi(
jsonView.playerJson(pov, ctx.pref, apiVersion, ctx.me,
initialFen = initialFen,
withBlurs = ctx.me ?? Granter(_.ViewBlurs)) zip
(pov.game.tournamentId ?? TournamentRepo.roundView) zip
(pov.game.tournamentId ?? TournamentRepo.byId) zip
(pov.game.simulId ?? getSimul) zip
(ctx.me ?? (me => noteApi.get(pov.gameId, me.id))) map {
case (((json, tourOption), simulOption), note) => (
@ -48,7 +48,7 @@ private[api] final class RoundApi(
withBlurs = ctx.me ?? Granter(_.ViewBlurs),
initialFen = initialFen,
withMoveTimes = withMoveTimes) zip
(pov.game.tournamentId ?? TournamentRepo.roundView) zip
(pov.game.tournamentId ?? TournamentRepo.byId) zip
(pov.game.simulId ?? getSimul) zip
(ctx.me ?? (me => noteApi.get(pov.gameId, me.id))) map {
case (((json, tourOption), simulOption), note) => (
@ -83,16 +83,16 @@ private[api] final class RoundApi(
))
}
private def withTournament(pov: Pov, tourOption: Option[RoundTournament])(json: JsObject) =
private def withTournament(pov: Pov, tourOption: Option[Tournament])(json: JsObject) =
tourOption.fold(json) { tour =>
json + ("tournament" -> Json.obj(
"id" -> tour.id,
"name" -> tour.name,
"running" -> tour.isRunning,
"berserkable" -> tour.berserkable,
"berserk1" -> false, //pairing.map(_.berserk1).filter(0!=),
"berserk2" -> false //pairing.map(_.berserk2).filter(0!=)
).noNull)
"running" -> tour.isStarted,
"berserkable" -> tour.berserkable
// "berserk1" -> false, //pairing.map(_.berserk1).filter(0!=),
// "berserk2" -> false //pairing.map(_.berserk2).filter(0!=)
))
}
private def withSimul(pov: Pov, simulOption: Option[Simul])(json: JsObject) =

View File

@ -35,16 +35,6 @@ object BSONHandlers {
private def readSystem(r: BSON.Reader) =
r.intO("system").fold[System](System.default)(System.orDefault)
implicit val roundTournamentHandler = new BSON[RoundTournament] {
def reads(r: BSON.Reader) = RoundTournament(
id = r str "_id",
name = r str "name",
status = r int "status",
system = readSystem(r),
clock = r.get[TournamentClock]("clock"))
def writes(w: BSON.Writer, o: RoundTournament) = sys error "RoundTournament view is read only!"
}
implicit val tournamentHandler = new BSON[Tournament] {
def reads(r: BSON.Reader) = Tournament(
id = r str "_id",

View File

@ -10,10 +10,4 @@ private[tournament] final class Cached {
default = _ => none)
def name(id: String): Option[String] = nameCache get id
private val staleViewCache = lila.memo.AsyncCache[String, Option[Tournament]](
(id: String) => TournamentRepo byId id,
timeToLive = 2 seconds)
def tour(id: String): Fu[Option[Tournament]] = staleViewCache(id)
}

View File

@ -63,63 +63,6 @@ case class Tournament(
case class EnterableTournaments(tours: List[Tournament], scheduled: List[Tournament])
// def userCurrentPairing(userId: String): Option[Pairing] = pairings find { p =>
// p.playing && p.contains(userId)
// }
// def userCurrentPov(userId: String): Option[PovRef] =
// userCurrentPairing(userId) flatMap (_ povRef userId)
// def userCurrentPov(user: Option[User]): Option[PovRef] =
// user.flatMap(u => userCurrentPov(u.id))
// def finish = withPlayers(players.map(_.unWithdraw)).refreshPlayers |> { tour =>
// Finished(
// id = tour.id,
// data = tour.data,
// startedAt = tour.startedAt,
// players = tour.players.map(_.unWithdraw),
// // pairings = tour.pairings filterNot (_.playing),
// events = tour.events)
// }
// def withdraw(userId: String): Valid[Started] = contains(userId).fold(
// withPlayers(players map {
// case p if p is userId => p.doWithdraw
// case p => p
// }).success,
// !!("User %s is not part of the tournament" format userId)
// )
// def quickLossStreak(user: String): Boolean =
// userPairings(user).takeWhile { pair => (pair lostBy user) && pair.quickFinish }.size >= 3
// def withPlayers(s: Players) = copy(players = s)
// def refreshPlayers = withPlayers(Player refresh this)
// def join(user: User) = joinNew(user) orElse joinBack(user)
// private def joinBack(user: User) = withdrawnPlayers.find(_ is user) match {
// case None => !!("User %s is already part of the tournament" format user.id)
// case Some(player) => withPlayers(players map {
// case p if p is player => p.unWithdraw
// case p => p
// }).success
// }
// }
// case class Finished(
// id: String,
// data: Data,
// startedAt: DateTime,
// events: List[Event]) extends StartedOrFinished {
// override def isFinished = true
// // def withPlayers(s: Players) = copy(players = s)
// // def refreshPlayers = withPlayers(Player refresh this)
// }
object Tournament {
val minPlayers = 3

View File

@ -28,9 +28,6 @@ object TournamentRepo {
selectId(id) ++ BSONDocument("players.id" -> userId)
).one[Tournament]
def roundView(id: String): Fu[Option[RoundTournament]] =
coll.find(selectId(id)).one[RoundTournament]
def createdById(id: String): Fu[Option[Tournament]] =
coll.find(selectId(id) ++ createdSelect).one[Tournament]

View File

@ -1,13 +0,0 @@
package lila.tournament
case class RoundTournament(
id: String,
name: String,
status: Int,
system: System,
clock: TournamentClock) {
def isRunning = status == Status.Started.id
def berserkable = system.berserkable && clock.increment == 0
}

View File

@ -24,6 +24,7 @@ object ApplicationBuild extends Build {
sources in doc in Compile := List(),
TwirlKeys.templateImports ++= Seq(
"lila.game.{ Game, Player, Pov }",
"lila.tournament.Tournament",
"lila.user.{ User, UserContext }",
"lila.security.Permission",
"lila.app.templating.Environment._",