provide automatic analysis with import, even for anon

This commit is contained in:
Thibault Duplessis 2014-05-26 00:38:46 +02:00
parent b0db271c54
commit 8536a919ea
4 changed files with 18 additions and 6 deletions

View file

@ -7,7 +7,7 @@ import play.api.http.ContentTypes
import play.api.mvc._
import play.api.templates.Html
import lila.analyse.{ TimeChart, AdvantageChart }
import lila.analyse.{ Analysis, TimeChart, AdvantageChart }
import lila.api.Context
import lila.app._
import lila.game.{ Pov, Game => GameModel, GameRepo, PgnDump }
@ -33,8 +33,13 @@ object Analyse extends LilaController {
}
private def makeAnalysis(id: String, me: lila.user.User)(implicit ctx: Context) =
env.analyser.getOrGenerate(id, me.id, isGranted(_.MarkEngine)) andThen {
case Failure(e: lila.analyse.ConcurrentAnalysisException) => BadRequest(e.getMessage)
addCallbacks(id) {
env.analyser.getOrGenerate(id, me.id, concurrent = isGranted(_.MarkEngine), auto = false)
}
private[controllers] def addCallbacks(id: String)(analysis: Fu[Analysis]): Fu[Analysis] =
analysis andThen {
case Failure(e: lila.analyse.ConcurrentAnalysisException) => Env.hub.socket.round ! Tell(id, AnalysisAvailable)
case Failure(err) => logerr("[analysis] " + err.getMessage)
case Success(analysis) if analysis.done => Env.hub.socket.round ! Tell(id, AnalysisAvailable)
}

View file

@ -20,6 +20,9 @@ object Importer extends LilaController with BaseGame {
Ok(html.game.importGame(listMenu, failure))
},
data => env.importer(data, ctx.userId, ctx.req.remoteAddress) map { game =>
Analyse.addCallbacks(game.id) {
Env.analyse.analyser.getOrGenerate(game.id, ctx.userId | "lichess", concurrent = true, auto = false)
}
Redirect(routes.Round.watcher(game.id, "white"))
} recover {
case e => {

View file

@ -36,10 +36,14 @@ final class Analyser(
def hasMany(ids: Seq[String]): Fu[Set[String]] =
$primitive[Analysis, String]($select byIds ids, "_id")(_.asOpt[String]) map (_.toSet)
def getOrGenerate(id: String, userId: String, admin: Boolean, auto: Boolean = false): Fu[Analysis] = {
def getOrGenerate(
id: String,
userId: String,
concurrent: Boolean,
auto: Boolean): Fu[Analysis] = {
def generate: Fu[Analysis] =
admin.fold(fuccess(none), AnalysisRepo userInProgress userId) flatMap {
concurrent.fold(fuccess(none), AnalysisRepo userInProgress userId) flatMap {
_.fold(doGenerate) { progressId =>
fufail(ConcurrentAnalysisException(userId, progressId, id))
}

View file

@ -41,7 +41,7 @@ final class Env(
system.actorOf(Props(new Actor {
def receive = {
case lila.hub.actorApi.ai.AutoAnalyse(gameId) =>
analyser.getOrGenerate(gameId, "lichess", admin = true, auto = true)
analyser.getOrGenerate(gameId, "lichess", concurrent = true, auto = true)
}
}), name = ActorName)