lila/app/mashup/GameFilter.scala

126 lines
3.8 KiB
Scala
Raw Normal View History

2013-04-01 21:43:01 -06:00
package lila.app
2013-04-12 17:47:03 -06:00
package mashup
2013-04-01 21:43:01 -06:00
import lila.common.paginator.Paginator
2016-04-02 02:19:34 -06:00
import lila.db.dsl._
2015-11-16 20:11:23 -07:00
import lila.game.{ Game, Query, GameRepo }
import lila.user.User
2013-04-01 21:43:01 -06:00
import play.api.mvc.Request
2017-06-05 09:58:08 -06:00
import scalaz.{ NonEmptyList, IList }
2013-04-01 21:43:01 -06:00
sealed abstract class GameFilter(val name: String)
object GameFilter {
case object All extends GameFilter("all")
case object Me extends GameFilter("me")
case object Rated extends GameFilter("rated")
case object Win extends GameFilter("win")
case object Loss extends GameFilter("loss")
case object Draw extends GameFilter("draw")
case object Playing extends GameFilter("playing")
case object Bookmark extends GameFilter("bookmark")
2014-11-17 18:54:16 -07:00
case object Imported extends GameFilter("import")
2015-09-03 04:18:19 -06:00
case object Search extends GameFilter("search")
2013-04-01 21:43:01 -06:00
}
case class GameFilterMenu(
all: NonEmptyList[GameFilter],
current: GameFilter
) {
2013-04-01 21:43:01 -06:00
2017-06-06 01:27:22 -06:00
def list = all.toList
2013-04-01 21:43:01 -06:00
}
2013-09-18 10:55:19 -06:00
object GameFilterMenu {
2013-04-01 21:43:01 -06:00
import GameFilter._
2017-06-05 09:58:08 -06:00
val all: NonEmptyList[GameFilter] =
NonEmptyList.nel(All, IList(Me, Rated, Win, Loss, Draw, Playing, Bookmark, Imported, Search))
2017-07-23 04:15:00 -06:00
def apply(user: User, nbs: UserInfo.NbGames, currentName: String): GameFilterMenu = {
2013-04-01 21:43:01 -06:00
2017-06-05 09:58:08 -06:00
val filters: NonEmptyList[GameFilter] = NonEmptyList.nel(All, IList fromList List(
2017-07-23 04:15:00 -06:00
(~nbs.withMe > 0) option Me,
(user.count.rated > 0) option Rated,
(user.count.win > 0) option Win,
(user.count.loss > 0) option Loss,
(user.count.draw > 0) option Draw,
(nbs.playing > 0) option Playing,
(nbs.bookmark > 0) option Bookmark,
(nbs.imported > 0) option Imported,
(user.count.game > 0) option Search
2013-04-01 21:43:01 -06:00
).flatten)
val current = currentOf(filters, currentName)
2014-11-17 18:54:16 -07:00
new GameFilterMenu(filters, current)
}
def currentOf(filters: NonEmptyList[GameFilter], name: String) =
(filters.list find (_.name == name)) | filters.head
2014-11-17 18:54:16 -07:00
private def cachedNbOf(
user: User,
2017-07-23 04:15:00 -06:00
nbs: Option[UserInfo.NbGames],
filter: GameFilter
): Option[Int] = filter match {
2017-07-23 04:15:00 -06:00
case Bookmark => nbs.map(_.bookmark)
case Imported => nbs.map(_.imported)
case All => user.count.game.some
2017-07-23 04:15:00 -06:00
case Me => nbs.flatMap(_.withMe)
case Rated => user.count.rated.some
case Win => user.count.win.some
case Loss => user.count.loss.some
case Draw => user.count.draw.some
case Search => user.count.game.some
2017-07-23 04:15:00 -06:00
case Playing => nbs.map(_.playing)
case _ => None
}
2014-11-17 18:54:16 -07:00
private def pag = Env.game.paginator
2014-11-17 18:54:16 -07:00
def paginatorOf(
userGameSearch: lila.gameSearch.UserGameSearch,
2014-11-17 18:54:16 -07:00
user: User,
2017-07-23 04:15:00 -06:00
nbs: Option[UserInfo.NbGames],
2014-11-17 18:54:16 -07:00
filter: GameFilter,
me: Option[User],
page: Int
)(implicit req: Request[_]): Fu[Paginator[Game]] = {
2017-07-23 04:15:00 -06:00
val nb = cachedNbOf(user, nbs, filter)
2016-04-02 02:19:34 -06:00
def std(query: Bdoc) = pag.recentlyCreated(query, nb)(page)
2014-11-17 18:54:16 -07:00
filter match {
case Bookmark => Env.bookmark.api.gamePaginatorByUser(user, page)
case Imported => pag.apply(
selector = Query imported user.id,
2016-04-02 02:19:34 -06:00
sort = $sort desc "pgni.ca",
nb = nb
)(page)
case All => std(Query started user.id)
case Me => std(Query.opponents(user, me | user))
2016-04-02 02:19:34 -06:00
case Rated => std(Query rated user.id)
case Win => std(Query win user.id)
case Loss => std(Query loss user.id)
case Draw => std(Query draw user.id)
2015-11-16 20:11:23 -07:00
case Playing => pag(
selector = Query nowPlaying user.id,
2016-04-02 02:19:34 -06:00
sort = $empty,
nb = nb
)(page) addEffect { p =>
2019-07-13 12:12:42 -06:00
p.currentPageResults.filter(_.finishedOrAborted) foreach GameRepo.unsetPlayingUids
}
2015-09-03 04:18:19 -06:00
case Search => userGameSearch(user, page)
2014-11-17 18:54:16 -07:00
}
2013-04-01 21:43:01 -06:00
}
def searchForm(
userGameSearch: lila.gameSearch.UserGameSearch,
filter: GameFilter
)(implicit req: Request[_]): play.api.data.Form[_] = filter match {
2015-09-03 04:18:19 -06:00
case Search => userGameSearch.requestForm
case _ => userGameSearch.defaultForm
}
2013-04-01 21:43:01 -06:00
}