@(u: User, emails: User.Emails, spy: lila.security.UserSpy, optionAggregateAssessment: Option[lila.evaluation.PlayerAggregateAssessment.WithGames], bans: Map[String, Int], history: List[lila.mod.Modlog], charges: List[lila.plan.Charge], reports: lila.report.Report.ByAndAbout, pref: lila.pref.Pref, irwinReport: Option[lila.irwin.IrwinReport.WithPovs], notes: List[lila.user.Note])(implicit ctx: Context) @import lila.evaluation.Display @import lila.pref.Pref
@if(isGranted(_.UserEvaluate)) {
@if(isGranted(_.MarkTroll)) { Comms }
• } @if(isGranted(_.MarkEngine)) {
} @if(isGranted(_.MarkBooster)) {
} @if(isGranted(_.MarkTroll)) {
@if(u.troll) {
} } @if(isGranted(_.IpBan)) {
} @if(!u.disabled) { @if(isGranted(_.CloseAccount)) {
} } else { @if(isGranted(_.ReopenAccount)) {
} }
@if(isGranted(_.RemoveRanking)) {
} @if(isGranted(_.ReportBan)) {
} @if(isGranted(_.Impersonate)) {
}
@if(isGranted(_.SetTitle)) {

@base.form.select(lila.user.DataForm.title.fill(u.title)("title"), lila.user.User.titles, "No title".some)
} @if(isGranted(_.SetEmail)) {
@emails.previous.map { email => Previously @email } }
@if(isGranted(_.ChangePermission) || (isGranted(_.Admin) && u.roles.nonEmpty)) {
<@if(isGranted(_.ChangePermission)){a href="@routes.Mod.permissions(u.username)"}else{span}> Mod permissions: @if(u.roles.isEmpty) { Add some } else { @u.roles.mkString(", ") }
}
Notable preferences: @if(pref.keyboardMove != Pref.KeyboardMove.NO) { [keyboard moves] } else { none }
@irwinReport.map { report => @views.html.irwin.irwinReport(report) } @optionAggregateAssessment.map { pag =>
@pag.pag.sfAvgBlurs.map { blursYes =>

ACPL in games with blurs is @blursYes @pag.pag.sfAvgNoBlurs.map { blursNo => against @blursNo in games without blurs. }

} @pag.pag.sfAvgLowVar.map { lowVar =>

ACPL in games with consistent move times is @lowVar @pag.pag.sfAvgHighVar.map { highVar => against @highVar in games with random move times. }

} @pag.pag.sfAvgHold.map { holdYes =>

ACPL in games with bot signature @holdYes @pag.pag.sfAvgNoHold.map { holdNo => against @holdNo in games without bot signature. }

} @pag.pag.playerAssessments.sortBy(-_.assessment.id).take(15).map { result => }
Opponent Game Centi-Pawn
(Avg ± SD)
Move Times
(Avg ± SD)
Blurs Bot Σ
@pag.pov(result).fold{ @result.gameId } { p => @playerLink(p.opponent, withRating = true, withDiff = true, withOnline = false, link = false) } @pag.pov(result).map { p => @if(p.game.isTournament) { } @p.game.perfType.map { pt => } @shortClockName(p.game.clock.map(_.config)) } @result.sfAvg ± @result.sfSd @(result.mtAvg/10) ± @(result.mtSd/10) @(result.blurs)% @if(result.hold){Yes} else {No}
@result.assessment.emoticon
} @charges.headOption.map { firstCharge =>
Patron payments @if(isGranted(_.PayPal)) { @firstCharge.payPal.flatMap(_.subId).map { subId => - [PayPal sub] } }
}
Moderation history@if(history.isEmpty){: nothing to show.} @if(history.nonEmpty) {
}
Reports sent by @u.username@if(reports.by.isEmpty){: nothing to show.} @if(reports.by.nonEmpty) { @reports.by.map { r => @r.atomBy(lila.report.ReporterId(u.id)).map { atom =>
@userIdLink(r.user.some)
@userIdLink(r.user.some), @momentFromNow(atom.at): @shorten(atom.text, 200)
} }
}
Reports concerning @u.username@if(reports.about.isEmpty){: nothing to show.} @if(reports.about.nonEmpty) { @reports.about.map { r =>
@r.bestAtoms(3).map { atom =>
By @userIdLink(atom.by.value.some), @momentFromNow(atom.at): @shorten(atom.text, 200)
} @if(r.atoms.size > 3) { (and @{r.atoms.size - 3} more) }
}
}
@spy.withMeSorted(u).map { case lila.security.UserSpy.OtherUser(o, byIp, byFp) => { } }
@spy.otherUsers.size similar user(s) Same Games Status Created Active
@userLink(o, withBestRating = true, params = "?mod") @if(o == u) { - } else { @List(byIp option "IP", byFp option "Print").flatten.mkString(", ") } @o.count.game.localize @defining(notes.filter(_.to == o.id)) { ns => @if(ns.nonEmpty) { @ns.size } } @userMarks(o, bans.get(o.id)) @momentFromNow(o.createdAt) @o.seenAt.map(momentFromNow(_))
@spy.ips.size IP addresses
    @spy.ipsByLocations.map { case (location, ips) => {
  • @location

  • } }
@spy.uas.size User agent(s)
    @spy.uas.sorted.map { ua =>
  • @ua
  • }
@pluralize("Fingerprint", spy.prints.size)
    @spy.prints.map(_.value).sorted.map { fp =>
  • @fp
  • }
@jsAt("compiled/user-mod.js")