Allow moderators to hail fire upon cheaters

pull/328/head
clarkerubber 2015-02-23 17:12:25 +11:00
parent affd31fd62
commit d34d4760ad
4 changed files with 27 additions and 7 deletions

View File

@ -98,4 +98,8 @@ object Mod extends LilaController {
)
}
def refreshUserAssess(username: String) = Secure(_.MarkEngine) { implicit ctx =>
me => assessApi.refreshAssessByUsername(username) inject redirect(username)
}
}

View File

@ -5,7 +5,10 @@
<div class="actions clearfix">
@if(isGranted(_.UserEvaluate)) {
<form method="post" action="@routes.User.evaluate(u.username)">
<input class="button" type="submit" value="@{eval.isDefined.??("(Re)")}Evaluate" />
<input class="button" type="submit" value="@{eval.isDefined.??("(Re)")}Evaluate (old)" />
</form>
<form method="post" action="@routes.Mod.refreshUserAssess(u.username)">
<input class="button" type="submit" value="@{aggregateAssessment.playerAssessments.nonEmpty.??("(Re)")}Evaluate (new)" />
</form>
}
@if(isGranted(_.MarkEngine)) {
@ -120,11 +123,6 @@
</tr>
</tbody>
</table>
<p class="legend">
@Range(1, 6).map { i =>
<span class="sig_@i">@Display.assessmentString(i)</span>
}
</p>
<table class="slist">
<thead>
<tr>

View File

@ -211,6 +211,7 @@ GET /mod/:username/communication controllers.Mod.communication(username: S
POST /mod/:ip/ipban controllers.Mod.ipban(ip: String)
GET /mod/log controllers.Mod.log
POST /mod/refreshAssess controllers.Mod.refreshAssess
POST /mod/:username/refreshUserAssess controllers.Mod.refreshUserAssess(username: String)
# Wiki
GET /wiki controllers.Wiki.home

View File

@ -6,6 +6,7 @@ import lila.db.BSON.BSONJodaDateTimeHandler
import lila.evaluation.{ Analysed, PlayerAssessment, PlayerFlags, GameAssessments, Assessible }
import lila.game.Game
import lila.game.{ Game, GameRepo }
import lila.user.{ User, UserRepo }
import org.joda.time.DateTime
import reactivemongo.bson._
import scala.concurrent._
@ -42,11 +43,23 @@ final class AssessApi(collAssessments: Coll, logApi: ModlogApi) {
def refreshAssess(gameId: String): Funit =
GameRepo.game(gameId) zip
AnalysisRepo.doneById(gameId) map {
AnalysisRepo.doneById(gameId) flatMap {
case (Some(g), Some(a)) => onAnalysisReady(g, a)
case _ => funit
}
def refreshAssessByUsername(username: String): Funit = withUser(username) { user =>
GameRepo.chronologicalFinishedByUser(user.id) map {
gs => gs map {
g => AnalysisRepo.doneById(g.id) flatMap {
case Some(a) => onAnalysisReady(g, a)
case _ => funit
}
}
}
}
def onAnalysisReady(game: Game, analysis: Analysis): Funit = {
if (!game.isCorrespondence && game.turns >= 40 && game.mode.rated) {
val gameAssessments: GameAssessments = Assessible(Analysed(game, analysis)).assessments
@ -54,4 +67,8 @@ final class AssessApi(collAssessments: Coll, logApi: ModlogApi) {
gameAssessments.black.fold(funit){createPlayerAssessment}
} else funit
}
private def withUser[A](username: String)(op: User => Fu[A]): Fu[A] =
UserRepo named username flatten "[mod] missing user " + username flatMap op
}