diff --git a/app/controllers/User.scala b/app/controllers/User.scala
index 7bd5c1140e..2955e03662 100644
--- a/app/controllers/User.scala
+++ b/app/controllers/User.scala
@@ -223,10 +223,13 @@ object User extends LilaController {
}
def perfStat(username: String, perfKey: String) = Open { implicit ctx =>
- OptionFuResult(UserRepo named username) { user =>
- lila.rating.PerfType(perfKey).fold(notFound) { perfType =>
- Env.perfStat.get(user, perfType).map { perfStat =>
- Ok(html.user.perfStat(user, perfStat))
+ OptionFuResult(UserRepo named username) { u =>
+ if ((u.disabled || (u.lame && !ctx.is(u))) && !isGranted(_.UserSpy)) notFound
+ else lila.rating.PerfType(perfKey).fold(notFound) { perfType =>
+ Env.perfStat.get(u, perfType).flatMap { perfStat =>
+ Env.current.userInfo(u, ctx).map { info =>
+ Ok(html.user.perfStat(u, info, perfStat))
+ }
}
}
}
diff --git a/app/views/user/perfStat.scala.html b/app/views/user/perfStat.scala.html
index 4e08fc573e..0ce4cc5f04 100644
--- a/app/views/user/perfStat.scala.html
+++ b/app/views/user/perfStat.scala.html
@@ -1,7 +1,24 @@
-@(u: User, perfStat: lila.perfStat.PerfStat)(implicit ctx: Context)
+@(u: User, info: lila.app.mashup.UserInfo, perfStat: lila.perfStat.PerfStat)(implicit ctx: Context)
-@perfStat
+@user.layout(
+title = s"${u.username} ${perfStat.perfType.name} stats",
+side = side(u, info).some,
+robots = false) {
+
+}
diff --git a/app/views/user/show.scala.html b/app/views/user/show.scala.html
index 8ec474bf63..298dbe7794 100644
--- a/app/views/user/show.scala.html
+++ b/app/views/user/show.scala.html
@@ -2,8 +2,6 @@
@import lila.rating.PerfType
-@title = @{ s"${u.username} : ${userGameFilterTitleNoTag(info, filters.current)}${if(games.currentPage == 1) "" else " - page " + games.currentPage}" }
-
@evenMoreJs = {
@if(!u.lame || ctx.is(u) || isGranted(_.UserSpy)) {
@if(filters.current.name == "search") {
@@ -24,66 +22,9 @@ if (lichess.once('user-tournaments-tour')) setTimeout(lichess.startTournamentSta
}
}
-@showPerf(perf: lila.rating.Perf, perfType: PerfType, name: Option[String] = none) = {
-
-
- @if(lila.rating.PerfType.nonGame.contains(perfType)) {
- @name.getOrElse(perfType.name).toUpperCase
- } else {
-
- @name.getOrElse(perfType.name).toUpperCase
-
- }
-
-
- @perf.glicko.intRating@if(perf.provisional){?}
- / @perf.nb.localize @if(perfType.key == "puzzle") {@trans.puzzles()} else {@trans.games()}
- @showProgress(perf.progress)
-
-
- @info.ranks.get(perfType.key).map { rank =>
- Rank: @rank.localize@nth(rank)
- }
-
-
-}
-
-@side = {
-
- @if(!u.lame || ctx.is(u) || isGranted(_.UserSpy)) {
- @showPerf(u.perfs.bullet, PerfType.Bullet)
- @showPerf(u.perfs.blitz, PerfType.Blitz)
- @showPerf(u.perfs.classical, PerfType.Classical)
- @showPerf(u.perfs.correspondence, PerfType.Correspondence)
-
- @if(u.perfs.chess960.nonEmpty) {
- @showPerf(u.perfs.chess960, PerfType.Chess960)
- }
- @if(u.perfs.kingOfTheHill.nonEmpty) {
- @showPerf(u.perfs.kingOfTheHill, PerfType.KingOfTheHill)
- }
- @if(u.perfs.threeCheck.nonEmpty) {
- @showPerf(u.perfs.threeCheck, PerfType.ThreeCheck)
- }
- @if(u.perfs.antichess.nonEmpty) {
- @showPerf(u.perfs.antichess, PerfType.Antichess)
- }
- @if(u.perfs.atomic.nonEmpty) {
- @showPerf(u.perfs.atomic, PerfType.Atomic)
- }
- @if(u.perfs.horde.nonEmpty) {
- @showPerf(u.perfs.horde, PerfType.Horde)
- }
-
- }
- @showPerf(u.perfs.puzzle, PerfType.Puzzle)
- @showPerf(u.perfs.opening, PerfType.Opening)
-
-}
-
@user.layout(
-title = title,
-side = side.some,
+title = s"${u.username} : ${userGameFilterTitleNoTag(info, filters.current)}${if(games.currentPage == 1) "" else " - page " + games.currentPage}",
+side = side(u, info).some,
robots = false,
evenMoreJs = evenMoreJs,
openGraph = lila.app.ui.OpenGraph(
diff --git a/app/views/user/side.scala.html b/app/views/user/side.scala.html
new file mode 100644
index 0000000000..e564d599d3
--- /dev/null
+++ b/app/views/user/side.scala.html
@@ -0,0 +1,58 @@
+@(u: User, info: lila.app.mashup.UserInfo)(implicit ctx: Context)
+
+@import lila.rating.PerfType
+
+@showPerf(perf: lila.rating.Perf, perfType: PerfType, name: Option[String] = none) = {
+
+
+ @if(lila.rating.PerfType.nonGame.contains(perfType)) {
+ @name.getOrElse(perfType.name).toUpperCase
+ } else {
+
+ @name.getOrElse(perfType.name).toUpperCase
+
+ }
+
+
+ @perf.glicko.intRating@if(perf.provisional){?}
+ / @perf.nb.localize @if(perfType.key == "puzzle") {@trans.puzzles()} else {@trans.games()}
+ @showProgress(perf.progress)
+
+
+ @info.ranks.get(perfType.key).map { rank =>
+ Rank: @rank.localize@nth(rank)
+ }
+
+
+}
+
+
+ @if(!u.lame || ctx.is(u) || isGranted(_.UserSpy)) {
+ @showPerf(u.perfs.bullet, PerfType.Bullet)
+ @showPerf(u.perfs.blitz, PerfType.Blitz)
+ @showPerf(u.perfs.classical, PerfType.Classical)
+ @showPerf(u.perfs.correspondence, PerfType.Correspondence)
+
+ @if(u.perfs.chess960.nonEmpty) {
+ @showPerf(u.perfs.chess960, PerfType.Chess960)
+ }
+ @if(u.perfs.kingOfTheHill.nonEmpty) {
+ @showPerf(u.perfs.kingOfTheHill, PerfType.KingOfTheHill)
+ }
+ @if(u.perfs.threeCheck.nonEmpty) {
+ @showPerf(u.perfs.threeCheck, PerfType.ThreeCheck)
+ }
+ @if(u.perfs.antichess.nonEmpty) {
+ @showPerf(u.perfs.antichess, PerfType.Antichess)
+ }
+ @if(u.perfs.atomic.nonEmpty) {
+ @showPerf(u.perfs.atomic, PerfType.Atomic)
+ }
+ @if(u.perfs.horde.nonEmpty) {
+ @showPerf(u.perfs.horde, PerfType.Horde)
+ }
+
+ }
+ @showPerf(u.perfs.puzzle, PerfType.Puzzle)
+ @showPerf(u.perfs.opening, PerfType.Opening)
+