lila/modules/api/src/main/PgnDump.scala

79 lines
2.4 KiB
Scala

package lila.api
import chess.format.FEN
import chess.format.pgn.Pgn
import lila.analyse.{ Analysis, Annotator }
import lila.game.Game
import lila.game.PgnDump.WithFlags
import lila.team.GameTeams
final class PgnDump(
val dumper: lila.game.PgnDump,
annotator: Annotator,
simulApi: lila.simul.SimulApi,
getTournamentName: lila.tournament.GetTourName,
getSwissName: lila.swiss.GetSwissName
)(implicit ec: scala.concurrent.ExecutionContext) {
implicit private val lang = lila.i18n.defaultLang
def apply(
game: Game,
initialFen: Option[FEN],
analysis: Option[Analysis],
flags: WithFlags,
teams: Option[GameTeams] = None
): Fu[Pgn] =
dumper(game, initialFen, flags, teams) flatMap { pgn =>
if (flags.tags) (game.simulId ?? simulApi.idToName) map { simulName =>
simulName
.orElse(game.tournamentId flatMap getTournamentName.get)
.orElse(game.swissId map lila.swiss.Swiss.Id flatMap getSwissName.apply)
.fold(pgn)(pgn.withEvent)
}
else fuccess(pgn)
} map { pgn =>
val evaled = analysis.ifTrue(flags.evals).fold(pgn)(addEvals(pgn, _))
if (flags.literate) annotator(evaled, analysis, game.opening, game.winnerColor, game.status)
else evaled
}
private def addEvals(p: Pgn, analysis: Analysis): Pgn =
analysis.infos.foldLeft(p) {
case (pgn, info) =>
pgn.updateTurn(
info.turn,
turn =>
turn.update(
info.color,
move => {
val comment = info.cp
.map(_.pawns.toString)
.orElse(info.mate.map(m => s"#${m.value}"))
move.copy(
comments = comment.map(c => s"[%eval $c]").toList ::: move.comments
)
}
)
)
}
def formatter(flags: WithFlags) =
(game: Game, initialFen: Option[FEN], analysis: Option[Analysis], teams: Option[GameTeams]) =>
toPgnString(game, initialFen, analysis, flags, teams)
def toPgnString(
game: Game,
initialFen: Option[FEN],
analysis: Option[Analysis],
flags: WithFlags,
teams: Option[GameTeams] = None
) =
apply(game, initialFen, analysis, flags, teams) dmap { pgn =>
// merge analysis & eval comments
// 1. e4 { [%eval 0.17] } { [%clk 0:00:30] }
// 1. e4 { [%eval 0.17] [%clk 0:00:30] }
s"$pgn\n\n\n".replaceIf("] } { [", "] [")
}
}