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
|
|
|
|
2015-09-04 15:59:58 -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 }
|
2014-06-28 03:58:38 -06:00
|
|
|
import lila.user.User
|
2013-04-01 21:43:01 -06:00
|
|
|
|
2015-09-03 03:37:25 -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],
|
2017-02-14 08:34:07 -07:00
|
|
|
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))
|
2014-06-28 03:58:38 -06:00
|
|
|
|
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)
|
|
|
|
|
2014-06-28 03:58:38 -06:00
|
|
|
val current = currentOf(filters, currentName)
|
|
|
|
|
2014-11-17 18:54:16 -07:00
|
|
|
new GameFilterMenu(filters, current)
|
2014-06-28 03:58:38 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
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],
|
2017-02-14 08:34:07 -07:00
|
|
|
filter: GameFilter
|
|
|
|
): Option[Int] = filter match {
|
2017-07-23 04:15:00 -06:00
|
|
|
case Bookmark => nbs.map(_.bookmark)
|
|
|
|
case Imported => nbs.map(_.imported)
|
2017-02-14 08:34:07 -07:00
|
|
|
case All => user.count.game.some
|
2017-07-23 04:15:00 -06:00
|
|
|
case Me => nbs.flatMap(_.withMe)
|
2017-02-14 08:34:07 -07:00
|
|
|
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)
|
2017-02-14 08:34:07 -07:00
|
|
|
case _ => None
|
2014-06-28 03:58:38 -06:00
|
|
|
}
|
|
|
|
|
2014-11-17 18:54:16 -07:00
|
|
|
private def pag = Env.game.paginator
|
2015-09-03 03:37:25 -06:00
|
|
|
|
2014-11-17 18:54:16 -07:00
|
|
|
def paginatorOf(
|
2015-09-03 03:37:25 -06:00
|
|
|
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],
|
2017-02-14 08:34:07 -07:00
|
|
|
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",
|
2017-02-14 08:34:07 -07:00
|
|
|
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)
|
2017-02-14 08:34:07 -07:00
|
|
|
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(
|
2014-12-02 17:01:16 -07:00
|
|
|
selector = Query nowPlaying user.id,
|
2016-04-02 02:19:34 -06:00
|
|
|
sort = $empty,
|
2017-02-14 08:34:07 -07:00
|
|
|
nb = nb
|
|
|
|
)(page) addEffect { p =>
|
2019-07-13 12:12:42 -06:00
|
|
|
p.currentPageResults.filter(_.finishedOrAborted) foreach GameRepo.unsetPlayingUids
|
2017-02-14 08:34:07 -07:00
|
|
|
}
|
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
|
|
|
}
|
2015-09-03 03:37:25 -06:00
|
|
|
|
|
|
|
def searchForm(
|
|
|
|
userGameSearch: lila.gameSearch.UserGameSearch,
|
2017-02-14 08:34:07 -07:00
|
|
|
filter: GameFilter
|
|
|
|
)(implicit req: Request[_]): play.api.data.Form[_] = filter match {
|
2015-09-03 04:18:19 -06:00
|
|
|
case Search => userGameSearch.requestForm
|
2017-02-14 08:34:07 -07:00
|
|
|
case _ => userGameSearch.defaultForm
|
2015-09-03 03:37:25 -06:00
|
|
|
}
|
2013-04-01 21:43:01 -06:00
|
|
|
}
|