110 lines
3.7 KiB
Scala
110 lines
3.7 KiB
Scala
package controllers
|
|
|
|
import play.api.mvc.AnyContentAsFormUrlEncoded
|
|
|
|
import views._
|
|
|
|
import lila.api.{ Context, BodyContext }
|
|
import lila.app._
|
|
import lila.report.{ Room, Report => ReportModel, Mod => AsMod, Suspect }
|
|
import lila.user.{ UserRepo, User => UserModel }
|
|
|
|
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(room: String) = Secure(_.SeeReport) { implicit ctx => me =>
|
|
env.modFilters.set(me, Room(room))
|
|
renderList(room)
|
|
}
|
|
|
|
private def renderList(room: String)(implicit ctx: Context) =
|
|
api.unprocessedAndRecentWithFilter(20, Room(room)) zip
|
|
api.countUnprocesssedByRooms flatMap {
|
|
case reports ~ counts =>
|
|
(Env.user.lightUserApi preloadMany reports.flatMap(_.userIds)) inject
|
|
Ok(html.report.list(reports, room, counts))
|
|
}
|
|
|
|
def inquiry(id: String) = Secure(_.SeeReport) { implicit ctx => me =>
|
|
for {
|
|
current <- Env.report.api.inquiries ofModId me.id
|
|
newInquiry <- api.inquiries.toggle(AsMod(me), id)
|
|
} yield newInquiry.fold(Redirect(routes.Report.list))(onInquiryStart)
|
|
}
|
|
|
|
private def onInquiryStart(inquiry: ReportModel) =
|
|
Redirect(inquiry.room match {
|
|
case Room.Coms => routes.Mod.communicationPrivate(inquiry.user).url
|
|
case _ => routes.User.show(inquiry.user).url + "?mod"
|
|
})
|
|
|
|
protected[controllers] def onInquiryClose(inquiry: Option[ReportModel], me: UserModel, force: Boolean = false)(implicit ctx: BodyContext[_]) = {
|
|
def autoNext = ctx.body.body match {
|
|
case AnyContentAsFormUrlEncoded(data) => data.get("next").exists(_.headOption contains "1")
|
|
case _ => false
|
|
}
|
|
inquiry match {
|
|
case None => Redirect(routes.Report.list).fuccess
|
|
case Some(prev) =>
|
|
def redirectToList = Redirect(routes.Report.listWithFilter(prev.room.key))
|
|
if (autoNext) api.next(prev.room) flatMap {
|
|
_.fold(redirectToList.fuccess) { report =>
|
|
api.inquiries.toggle(AsMod(me), report.id) map {
|
|
_.fold(redirectToList)(onInquiryStart)
|
|
}
|
|
}
|
|
}
|
|
else if (force) Redirect(s"${routes.User.show(prev.user)}?mod").fuccess
|
|
else api.inquiries.toggle(AsMod(me), prev.id) map {
|
|
_.fold(redirectToList)(onInquiryStart)
|
|
}
|
|
}
|
|
}
|
|
|
|
def process(id: String) = SecureBody(_.SeeReport) { implicit ctx => me =>
|
|
Env.report.api.inquiries ofModId me.id flatMap { inquiry =>
|
|
api.process(AsMod(me), id) >> onInquiryClose(inquiry, me, force = true)
|
|
}
|
|
}
|
|
|
|
def xfiles(id: String) = Secure(_.SeeReport) { implicit ctx => me =>
|
|
api.moveToXfiles(id) 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, lila.report.Reporter(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)
|
|
}
|
|
}
|
|
}
|