From b8735bd3c73af1349b2824fb60fb91f842eb7359 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Tue, 8 Jun 2021 11:30:45 +0200 Subject: [PATCH] truncat start position full move number --- modules/common/src/main/Form.scala | 13 ++++++++++--- modules/setup/src/main/AiConfig.scala | 6 +++--- modules/setup/src/main/ApiAiConfig.scala | 4 ++-- modules/setup/src/main/ApiConfig.scala | 4 ++-- modules/setup/src/main/FriendConfig.scala | 6 +++--- modules/setup/src/main/Mappings.scala | 8 +++++++- modules/setup/src/main/OpenConfig.scala | 4 ++-- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/modules/common/src/main/Form.scala b/modules/common/src/main/Form.scala index 5b3e1bf53f..49d8e3b82b 100644 --- a/modules/common/src/main/Form.scala +++ b/modules/common/src/main/Form.scala @@ -172,11 +172,18 @@ object Form { } object fen { - implicit private val fenFormat = formatter.stringFormatter[FEN](_.value, FEN.apply) - val playableStrict = playable(strict = true) - def playable(strict: Boolean) = of[FEN](fenFormat) + implicit val fenFormat = formatter.stringFormatter[FEN](_.value, FEN.apply) + val playableStrict = playable(strict = true) + def playable(strict: Boolean) = of[FEN] .transform[FEN](f => FEN(f.value.trim), identity) .verifying("Invalid position", fen => (Forsyth <<< fen).exists(_.situation playable strict)) + .transform[FEN](if (strict) truncateMoveNumber else identity, identity) + def truncateMoveNumber(fen: FEN) = + (Forsyth <<< fen).fold(fen) { g => + if (g.fullMoveNumber >= 150) + Forsyth >> g.copy(fullMoveNumber = g.fullMoveNumber % 100) // keep the start ply low + else fen + } } def inTheFuture(m: Mapping[DateTime]) = diff --git a/modules/setup/src/main/AiConfig.scala b/modules/setup/src/main/AiConfig.scala index 2f6482d014..546ef3c5d5 100644 --- a/modules/setup/src/main/AiConfig.scala +++ b/modules/setup/src/main/AiConfig.scala @@ -19,7 +19,7 @@ case class AiConfig( val strictFen = true - def >> = (variant.id, timeMode.id, time, increment, days, level, color.name, fen.map(_.value)).some + def >> = (variant.id, timeMode.id, time, increment, days, level, color.name, fen).some def game(user: Option[User]) = fenGame { chessGame => @@ -54,7 +54,7 @@ case class AiConfig( object AiConfig extends BaseConfig { - def from(v: Int, tm: Int, t: Double, i: Int, d: Int, level: Int, c: String, fen: Option[String]) = + def from(v: Int, tm: Int, t: Double, i: Int, d: Int, level: Int, c: String, fen: Option[FEN]) = new AiConfig( variant = chess.variant.Variant(v) err "Invalid game variant " + v, timeMode = TimeMode(tm) err s"Invalid time mode $tm", @@ -63,7 +63,7 @@ object AiConfig extends BaseConfig { days = d, level = level, color = Color(c) err "Invalid color " + c, - fen = fen map FEN.apply + fen = fen ) val default = AiConfig( diff --git a/modules/setup/src/main/ApiAiConfig.scala b/modules/setup/src/main/ApiAiConfig.scala index cb156405a1..6302a6b2bb 100644 --- a/modules/setup/src/main/ApiAiConfig.scala +++ b/modules/setup/src/main/ApiAiConfig.scala @@ -71,7 +71,7 @@ object ApiAiConfig extends BaseConfig { cl: Option[Clock.Config], d: Option[Int], c: Option[String], - pos: Option[String] + pos: Option[FEN] ) = new ApiAiConfig( variant = chess.variant.Variant.orDefault(~v), @@ -79,6 +79,6 @@ object ApiAiConfig extends BaseConfig { daysO = d, color = Color.orDefault(~c), level = l, - fen = pos map FEN.apply + fen = pos ).autoVariant } diff --git a/modules/setup/src/main/ApiConfig.scala b/modules/setup/src/main/ApiConfig.scala index bef447ea14..2ec5cd12ae 100644 --- a/modules/setup/src/main/ApiConfig.scala +++ b/modules/setup/src/main/ApiConfig.scala @@ -50,7 +50,7 @@ object ApiConfig extends BaseHumanConfig { d: Option[Int], r: Boolean, c: Option[String], - pos: Option[String], + pos: Option[FEN], tok: Option[String], msg: Option[String] ) = @@ -60,7 +60,7 @@ object ApiConfig extends BaseHumanConfig { days = d, rated = r, color = Color.orDefault(~c), - position = pos map FEN.apply, + position = pos, acceptByToken = tok, message = msg map Template ).autoVariant diff --git a/modules/setup/src/main/FriendConfig.scala b/modules/setup/src/main/FriendConfig.scala index 910375fd38..572954c301 100644 --- a/modules/setup/src/main/FriendConfig.scala +++ b/modules/setup/src/main/FriendConfig.scala @@ -20,7 +20,7 @@ case class FriendConfig( val strictFen = false - def >> = (variant.id, timeMode.id, time, increment, days, mode.id.some, color.name, fen.map(_.value)).some + def >> = (variant.id, timeMode.id, time, increment, days, mode.id.some, color.name, fen).some def isPersistent = timeMode == TimeMode.Unlimited || timeMode == TimeMode.Correspondence @@ -29,7 +29,7 @@ case class FriendConfig( object FriendConfig extends BaseHumanConfig { - def from(v: Int, tm: Int, t: Double, i: Int, d: Int, m: Option[Int], c: String, fen: Option[String]) = + def from(v: Int, tm: Int, t: Double, i: Int, d: Int, m: Option[Int], c: String, fen: Option[FEN]) = new FriendConfig( variant = chess.variant.Variant(v) err "Invalid game variant " + v, timeMode = TimeMode(tm) err s"Invalid time mode $tm", @@ -38,7 +38,7 @@ object FriendConfig extends BaseHumanConfig { days = d, mode = m.fold(Mode.default)(Mode.orDefault), color = Color(c) err "Invalid color " + c, - fen = fen map FEN.apply + fen = fen ) val default = FriendConfig( diff --git a/modules/setup/src/main/Mappings.scala b/modules/setup/src/main/Mappings.scala index 58e8099ed9..7a313178b4 100644 --- a/modules/setup/src/main/Mappings.scala +++ b/modules/setup/src/main/Mappings.scala @@ -7,6 +7,7 @@ import chess.Mode import chess.{ variant => V } import lila.rating.RatingRange import lila.lobby.Color +import chess.format.FEN private object Mappings { @@ -40,5 +41,10 @@ private object Mappings { val color = text.verifying(Color.names contains _) val level = number.verifying(AiConfig.levels contains _) val speed = number.verifying(Config.speeds contains _) - val fenField = optional(nonEmptyText) + val fenField = optional { + import lila.common.Form.fen._ + of[FEN] + .transform[FEN](f => FEN(f.value.trim), identity) + .transform[FEN](truncateMoveNumber, identity) + } } diff --git a/modules/setup/src/main/OpenConfig.scala b/modules/setup/src/main/OpenConfig.scala index 8bcebd0990..7349c1edd8 100644 --- a/modules/setup/src/main/OpenConfig.scala +++ b/modules/setup/src/main/OpenConfig.scala @@ -31,13 +31,13 @@ object OpenConfig { v: Option[String], cl: Option[Clock.Config], rated: Boolean, - pos: Option[String] + pos: Option[FEN] ) = new OpenConfig( name = n.map(_.trim).filter(_.nonEmpty), variant = chess.variant.Variant.orDefault(~v), clock = cl, rated = rated, - position = pos map FEN.apply + position = pos ).autoVariant }