lila/app/controllers/Report.scala

74 lines
2.0 KiB
Scala

package controllers
import play.api.mvc._
import play.twirl.api.Html
import views._
import lila.app._
import lila.security.Granter
import lila.user.{ User => UserModel, UserRepo }
object Report extends LilaController {
private def forms = Env.report.forms
private def api = Env.report.api
def list = Secure(_.SeeReport) { implicit ctx => _ =>
api unprocessedAndRecent 50 map { reports =>
html.report.list(reports)
}
}
def process(id: String) = Secure(_.SeeReport) { implicit ctx => me =>
api.process(id, me) inject Redirect(routes.Report.list)
}
def form = Auth { implicit ctx => implicit me =>
NotForKids {
get("username") ?? UserRepo.named flatMap { user =>
forms.createWithCaptcha map {
case (form, captcha) => Ok(html.report.form(form, user, captcha))
}
}
}
}
def create = AuthBody { implicit ctx => implicit me =>
implicit val req = ctx.body
forms.create.bindFromRequest.fold(
err => get("username") ?? UserRepo.named flatMap { user =>
forms.anyCaptcha map { captcha =>
BadRequest(html.report.form(err, user, captcha))
}
},
data => api.create(data, me) map { report =>
Redirect(routes.Report.thanks(data.user.username))
})
}
def thanks(reported: String) = Auth { implicit ctx => me =>
Env.relation.api.fetchBlocks(me.id, reported) map { blocked =>
html.report.thanks(reported, blocked)
}
}
import scala.concurrent.duration._
private lazy val clarkeyProcessedUserIds = new lila.memo.ExpireSetMemo(ttl = 30 minutes)
def clarkeyBotNext = Open { implicit ctx =>
Mod.ModExternalBot {
api unprocessedAndRecent 100 map { all =>
all.find { r =>
r.report.isCheat && r.report.unprocessed && !r.hasLichessNote &&
!clarkeyProcessedUserIds.get(r.user.id)
} match {
case None => NotFound
case Some(r) =>
clarkeyProcessedUserIds put r.user.id
Ok(r.user.id)
}
}
}
}
}