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-01 11:50:57 -06:00
|
|
|
import lila.db.dsl.SortOrder
|
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
|
|
|
|
|
|
|
import play.api.libs.json._
|
2015-09-03 03:37:25 -06:00
|
|
|
import play.api.mvc.Request
|
2013-09-18 10:55:19 -06:00
|
|
|
import scalaz.NonEmptyList
|
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],
|
2014-11-17 18:54:16 -07:00
|
|
|
current: GameFilter) {
|
2013-04-01 21:43:01 -06:00
|
|
|
|
|
|
|
def list = all.list
|
|
|
|
}
|
|
|
|
|
2013-09-18 10:55:19 -06:00
|
|
|
object GameFilterMenu {
|
2013-04-01 21:43:01 -06:00
|
|
|
|
|
|
|
import GameFilter._
|
|
|
|
import lila.db.Implicits.docId
|
|
|
|
|
2015-09-03 04:18:19 -06:00
|
|
|
val all = NonEmptyList.nel(All, List(Me, Rated, Win, Loss, Draw, Playing, Bookmark, Imported, Search))
|
2014-06-28 03:58:38 -06:00
|
|
|
|
2013-04-01 21:43:01 -06:00
|
|
|
def apply(
|
|
|
|
info: UserInfo,
|
|
|
|
me: Option[User],
|
2014-12-26 09:59:14 -07:00
|
|
|
currentNameOption: Option[String]): GameFilterMenu = {
|
2013-04-01 21:43:01 -06:00
|
|
|
|
|
|
|
val user = info.user
|
|
|
|
|
2014-06-28 03:58:38 -06:00
|
|
|
val filters = NonEmptyList.nel(All, List(
|
2013-08-02 11:43:26 -06:00
|
|
|
(info.nbWithMe > 0) option Me,
|
2013-04-01 21:43:01 -06:00
|
|
|
(info.nbRated > 0) option Rated,
|
2013-06-02 05:04:18 -06:00
|
|
|
(info.user.count.win > 0) option Win,
|
|
|
|
(info.user.count.loss > 0) option Loss,
|
|
|
|
(info.user.count.draw > 0) option Draw,
|
2013-04-01 21:43:01 -06:00
|
|
|
(info.nbPlaying > 0) option Playing,
|
2015-08-27 08:44:39 -06:00
|
|
|
(info.nbBookmark > 0) option Bookmark,
|
2015-09-06 15:31:33 -06:00
|
|
|
(info.nbImported > 0) option Imported,
|
|
|
|
(info.user.count.game > 0) option Search
|
2013-04-01 21:43:01 -06:00
|
|
|
).flatten)
|
|
|
|
|
2015-04-13 14:05:46 -06:00
|
|
|
val currentName = currentNameOption | info.hasSimul.fold(
|
|
|
|
Playing,
|
|
|
|
if (!info.user.hasGames && info.nbImported > 0) Imported else All
|
|
|
|
).name
|
2014-12-26 09:59:14 -07:00
|
|
|
|
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,
|
|
|
|
info: Option[UserInfo],
|
|
|
|
filter: GameFilter): Option[Int] = filter match {
|
|
|
|
case Bookmark => info.map(_.nbBookmark)
|
|
|
|
case Imported => info.map(_.nbImported)
|
|
|
|
case All => user.count.game.some
|
|
|
|
case Rated => user.count.rated.some
|
|
|
|
case Win => user.count.win.some
|
|
|
|
case Loss => user.count.loss.some
|
|
|
|
case Draw => user.count.draw.some
|
2015-09-03 04:18:19 -06:00
|
|
|
case Search => user.count.game.some
|
2014-11-17 18:54:16 -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,
|
|
|
|
info: Option[UserInfo],
|
|
|
|
filter: GameFilter,
|
|
|
|
me: Option[User],
|
2015-09-03 03:37:25 -06:00
|
|
|
page: Int)(implicit req: Request[_]): Fu[Paginator[Game]] = {
|
2014-11-17 18:54:16 -07:00
|
|
|
val nb = cachedNbOf(user, info, filter)
|
|
|
|
def std(query: JsObject) = pag.recentlyCreated(query, nb)(page)
|
|
|
|
filter match {
|
|
|
|
case Bookmark => Env.bookmark.api.gamePaginatorByUser(user, page)
|
|
|
|
case Imported => pag.apply(
|
|
|
|
selector = Query imported user.id,
|
2015-08-05 03:32:20 -06:00
|
|
|
sort = Seq("pgni.ca" -> SortOrder.Descending),
|
2014-11-17 18:54:16 -07:00
|
|
|
nb = nb)(page)
|
2014-12-02 17:01:16 -07:00
|
|
|
case All => std(Query started user)
|
|
|
|
case Me => std(Query.opponents(user, me | user))
|
|
|
|
case Rated => std(Query rated user)
|
|
|
|
case Win => std(Query win user)
|
|
|
|
case Loss => std(Query loss user)
|
|
|
|
case Draw => std(Query draw user)
|
2015-11-16 20:11:23 -07:00
|
|
|
case Playing => pag(
|
2014-12-02 17:01:16 -07:00
|
|
|
selector = Query nowPlaying user.id,
|
|
|
|
sort = Seq(),
|
2015-11-16 20:11:23 -07:00
|
|
|
nb = nb)(page) addEffect { p =>
|
|
|
|
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
|
|
|
}
|
2015-09-03 03:37:25 -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
|
2015-09-03 03:37:25 -06:00
|
|
|
case _ => userGameSearch.defaultForm
|
|
|
|
}
|
2013-04-01 21:43:01 -06:00
|
|
|
}
|