84 lines
2.4 KiB
Scala
84 lines
2.4 KiB
Scala
package controllers
|
|
|
|
import views._
|
|
|
|
import lila.api.Context
|
|
import lila.app._
|
|
import lila.report.Reason
|
|
import lila.user.UserRepo
|
|
|
|
object Report extends LilaController {
|
|
|
|
private def env = Env.report
|
|
private def api = env.api
|
|
|
|
def list = Secure(_.SeeReport) { implicit ctx => me =>
|
|
renderList(env.modFilters.get(me).fold("all")(_.key))
|
|
}
|
|
|
|
def listWithFilter(reason: String) = Secure(_.SeeReport) { implicit ctx => me =>
|
|
env.modFilters.set(me, Reason(reason))
|
|
renderList(reason)
|
|
}
|
|
|
|
private def renderList(reason: String)(implicit ctx: Context) =
|
|
api.unprocessedAndRecentWithFilter(50, Reason(reason)) zip
|
|
api.countUnprocesssedByReasons flatMap {
|
|
case reports ~ counts =>
|
|
(Env.user.lightUserApi preloadMany reports.flatMap(_.userIds)) inject
|
|
Ok(html.report.list(reports, reason, counts))
|
|
}
|
|
|
|
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 =>
|
|
env.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
|
|
env.forms.create.bindFromRequest.fold(
|
|
err => get("username") ?? UserRepo.named flatMap { user =>
|
|
env.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 irwinProcessedUserIds = new lila.memo.ExpireSetMemo(ttl = 30 minutes)
|
|
|
|
def irwinBotNext = Open { implicit ctx =>
|
|
Mod.ModExternalBot {
|
|
api.unprocessedAndRecentWithFilter(100, Reason.Cheat.some) map { all =>
|
|
all.find { r =>
|
|
r.report.unprocessed && !r.hasIrwinNote && !irwinProcessedUserIds.get(r.user.id)
|
|
} match {
|
|
case None => NotFound
|
|
case Some(r) =>
|
|
irwinProcessedUserIds put r.user.id
|
|
Ok(r.user.id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|