lila/app/controllers/User.scala

132 lines
4.2 KiB
Scala
Raw Normal View History

2013-03-20 08:23:41 -06:00
package controllers
2013-09-11 04:38:16 -06:00
import play.api.mvc._, Results._
2013-03-20 08:23:41 -06:00
import lila.app._
2013-06-28 05:52:52 -06:00
import lila.common.LilaCookie
import lila.db.api.$find
2013-03-20 08:23:41 -06:00
import lila.security.Permission
2013-05-08 09:41:12 -06:00
import lila.user.tube.userTube
2013-06-28 05:52:52 -06:00
import lila.user.{ Context, User UserModel, UserRepo }
import views._
2013-03-20 08:23:41 -06:00
object User extends LilaController {
2013-05-08 09:41:12 -06:00
private def env = Env.user
private def gamePaginator = Env.game.paginator
2013-03-20 08:23:41 -06:00
private def forms = lila.user.DataForm
2013-05-08 09:41:12 -06:00
2013-05-20 22:12:10 -06:00
def show(username: String) = Open { implicit ctx
filter(username, "all", 1)
}
def showMini(username: String) = Open { implicit ctx
mini(username)
2013-05-20 22:12:10 -06:00
}
2013-05-08 09:41:12 -06:00
def showFilter(username: String, filterName: String, page: Int) = Open { implicit ctx
2013-05-20 22:12:10 -06:00
filter(username, filterName, page)
}
def online = Open { implicit req
2013-12-17 15:20:18 -07:00
UserRepo.byIdsSortRating(env.onlineUserIdMemo.keys, 1000) map { users
html.user.online(users)
}
}
2013-05-20 22:12:10 -06:00
private def filter(username: String, filterName: String, page: Int)(implicit ctx: Context) =
2013-05-08 09:41:12 -06:00
Reasonable(page) {
OptionFuResult(UserRepo named username) { u
(u.enabled || isGranted(_.UserSpy)).fold({
userShow(u, filterName, page) map { Ok(_) }
2013-12-22 06:15:02 -07:00
}, UserRepo isArtificial u.id map { artificial
NotFound(html.user.disabled(u, artificial))
})
}
2013-05-04 17:12:53 -06:00
}
2013-03-20 07:24:47 -06:00
private def userShow(u: UserModel, filterName: String, page: Int)(implicit ctx: Context) = for {
info Env.current.userInfo(u, ctx)
filters = mashup.GameFilterMenu(info, ctx.me, filterName)
pag (filters.query.fold(Env.bookmark.api.gamePaginatorByUser(u, page)) { query
gamePaginator.recentlyCreated(query, filters.cachedNb)(page)
})
} yield html.user.show(u, info, pag, filters)
2013-05-08 09:41:12 -06:00
2013-05-20 22:12:10 -06:00
private def mini(username: String)(implicit ctx: Context) =
OptionOk(UserRepo named username) { user
2013-05-22 06:49:09 -06:00
Thread sleep 200
2013-05-20 22:12:10 -06:00
html.user.mini(user)
}
2013-05-08 09:41:12 -06:00
def list(page: Int) = Open { implicit ctx
Reasonable(page) {
val nb = 10
for {
progressDay env.cached.topProgressDay(nb)
progressWeek env.cached.topProgressWeek(nb)
progressMonth env.cached.topProgressMonth(nb)
rating env.cached.topRating(nb)
ratingDay env.cached.topRatingDay(nb)
ratingWeek env.cached.topRatingWeek(nb)
online env.cached.topOnline(30)
bullet env.cached.topBullet(nb)
blitz env.cached.topBlitz(nb)
slow env.cached.topSlow(nb)
active env.cached.topNbGame(nb) map2 { (user: UserModel)
user -> user.count.game
2013-07-24 16:59:45 -06:00
}
activeDay Env.game.cached.activePlayerUidsDay(nb) flatMap { pairs
UserRepo.byOrderedIds(pairs.map(_._1)) map (_ zip pairs.map(_._2))
}
activeWeek Env.game.cached.activePlayerUidsWeek(nb) flatMap { pairs
UserRepo.byOrderedIds(pairs.map(_._1)) map (_ zip pairs.map(_._2))
}
} yield html.user.list(
progressDay = progressDay,
progressWeek = progressWeek,
progressMonth = progressMonth,
rating = rating,
ratingDay = ratingDay,
ratingWeek = ratingWeek,
online = online,
bullet = bullet,
blitz = blitz,
slow = slow,
nb = active,
nbDay = activeDay,
nbWeek = activeWeek)
2013-05-08 09:41:12 -06:00
}
}
2013-03-20 08:23:41 -06:00
def mod(username: String) = Secure(_.UserSpy) { implicit ctx
me OptionFuOk(UserRepo named username) { user
Env.security userSpy user.id map { spy
html.user.mod(user, spy)
}
}
}
def opponents(username: String) = Open { implicit ctx
OptionFuOk(UserRepo named username) { user
2013-05-23 12:03:43 -06:00
lila.game.BestOpponents(user.id, 50) map { ops
html.user.opponents(user, ops)
}
}
}
2013-05-06 15:52:48 -06:00
def autocomplete = Open { implicit ctx
get("term", ctx.req).filter(""!=).fold(BadRequest("No search term provided").fuccess: Fu[SimpleResult]) { term
2013-05-06 15:52:48 -06:00
JsonOk(UserRepo usernamesLike term)
}
}
2013-03-20 08:23:41 -06:00
2013-05-10 03:57:18 -06:00
def export(username: String) = Open { implicit ctx
OptionFuResult(UserRepo named username) { u
2013-06-28 05:52:52 -06:00
Env.game export u map { url
Redirect(Env.api.Net.Protocol + Env.api.Net.AssetDomain + url)
}
2013-05-10 03:57:18 -06:00
}
}
2013-03-20 08:23:41 -06:00
}