From 191cb3ff96c18f5fb63aaa781f06efc94a616f5a Mon Sep 17 00:00:00 2001 From: tors42 <4084220+tors42@users.noreply.github.com> Date: Sun, 18 Aug 2024 09:47:26 +0200 Subject: [PATCH 1/2] Show Swiss position in API --- modules/swiss/src/main/SwissJson.scala | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modules/swiss/src/main/SwissJson.scala b/modules/swiss/src/main/SwissJson.scala index d605acb17e65b..0f9c0b1d3629c 100644 --- a/modules/swiss/src/main/SwissJson.scala +++ b/modules/swiss/src/main/SwissJson.scala @@ -1,5 +1,6 @@ package lila.swiss +import chess.format.Fen import play.api.i18n.Lang import play.api.libs.json.* @@ -179,6 +180,7 @@ object SwissJson: }) .add("isRecentlyFinished" -> swiss.isRecentlyFinished) .add("password" -> swiss.settings.password.isDefined) + .add("position" -> swiss.settings.position.map(fullFen => positionJson(fullFen.opening))) private[swiss] def playerJson(swiss: Swiss, view: SwissPlayer.View): JsObject = playerJsonBase(view, performance = false) ++ Json @@ -296,6 +298,24 @@ object SwissJson: "user" -> player.user ) + // duplicate modules/tournament/src/main/JsonView.scala + private[swiss] def positionJson(fen: Fen.Standard): JsObject = + lila.gathering.Thematic.byFen(fen) match + case Some(pos) => + Json + .obj( + "eco" -> pos.eco, + "name" -> pos.name, + "fen" -> pos.fen, + "url" -> pos.url + ) + case None => + Json + .obj( + "name" -> "Custom position", + "fen" -> fen + ) + private given Writes[SwissRoundNumber] = Writes(n => JsNumber(n.value)) private given Writes[SwissPoints] = Writes(p => JsNumber(BigDecimal(p.value))) private given Writes[Swiss.TieBreak] = Writes(t => JsNumber(t.value)) From 3af7add3b72419dd405764f39c60ffc929897132 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Mon, 19 Aug 2024 08:57:01 +0200 Subject: [PATCH 2/2] refactor into GatheringJson.position --- .../gathering/src/main/GatheringJson.scala | 24 +++++++++++++++++++ modules/swiss/src/main/SwissJson.scala | 21 ++-------------- modules/tournament/src/main/ApiJsonView.scala | 3 ++- modules/tournament/src/main/JsonView.scala | 20 ++-------------- 4 files changed, 30 insertions(+), 38 deletions(-) create mode 100644 modules/gathering/src/main/GatheringJson.scala diff --git a/modules/gathering/src/main/GatheringJson.scala b/modules/gathering/src/main/GatheringJson.scala new file mode 100644 index 0000000000000..321b1e1ae986b --- /dev/null +++ b/modules/gathering/src/main/GatheringJson.scala @@ -0,0 +1,24 @@ +package lila.gathering + +import play.api.libs.json.* +import chess.format.Fen +import lila.common.Json.given + +object GatheringJson: + + def position(fen: Fen.Standard): JsObject = + Thematic.byFen(fen) match + case Some(pos) => + Json + .obj( + "eco" -> pos.eco, + "name" -> pos.name, + "fen" -> pos.fen, + "url" -> pos.url + ) + case None => + Json + .obj( + "name" -> "Custom position", + "fen" -> fen + ) diff --git a/modules/swiss/src/main/SwissJson.scala b/modules/swiss/src/main/SwissJson.scala index 0f9c0b1d3629c..8c5b0ec99a2f9 100644 --- a/modules/swiss/src/main/SwissJson.scala +++ b/modules/swiss/src/main/SwissJson.scala @@ -10,6 +10,7 @@ import lila.core.socket.SocketVersion import lila.db.dsl.{ *, given } import lila.gathering.Condition.WithVerdicts import lila.gathering.GreatPlayer +import lila.gathering.GatheringJson.* import lila.quote.Quote.given final class SwissJson( @@ -180,7 +181,7 @@ object SwissJson: }) .add("isRecentlyFinished" -> swiss.isRecentlyFinished) .add("password" -> swiss.settings.password.isDefined) - .add("position" -> swiss.settings.position.map(fullFen => positionJson(fullFen.opening))) + .add("position" -> swiss.settings.position.map(fullFen => position(fullFen.opening))) private[swiss] def playerJson(swiss: Swiss, view: SwissPlayer.View): JsObject = playerJsonBase(view, performance = false) ++ Json @@ -298,24 +299,6 @@ object SwissJson: "user" -> player.user ) - // duplicate modules/tournament/src/main/JsonView.scala - private[swiss] def positionJson(fen: Fen.Standard): JsObject = - lila.gathering.Thematic.byFen(fen) match - case Some(pos) => - Json - .obj( - "eco" -> pos.eco, - "name" -> pos.name, - "fen" -> pos.fen, - "url" -> pos.url - ) - case None => - Json - .obj( - "name" -> "Custom position", - "fen" -> fen - ) - private given Writes[SwissRoundNumber] = Writes(n => JsNumber(n.value)) private given Writes[SwissPoints] = Writes(p => JsNumber(BigDecimal(p.value))) private given Writes[Swiss.TieBreak] = Writes(t => JsNumber(t.value)) diff --git a/modules/tournament/src/main/ApiJsonView.scala b/modules/tournament/src/main/ApiJsonView.scala index ee84ff8f4293b..685840bce5335 100644 --- a/modules/tournament/src/main/ApiJsonView.scala +++ b/modules/tournament/src/main/ApiJsonView.scala @@ -6,6 +6,7 @@ import lila.common.Json.given import lila.core.i18n.Translate import lila.gathering.Condition import lila.gathering.ConditionHandlers.JSONHandlers.given +import lila.gathering.GatheringJson.* import lila.rating.PerfType final class ApiJsonView(lightUserApi: lila.core.user.LightUserApi)(using Executor): @@ -63,7 +64,7 @@ final class ApiJsonView(lightUserApi: lila.core.user.LightUserApi)(using Executo .add("onlyTitled", tour.conditions.titled.isDefined) .add("teamMember", tour.conditions.teamMember.map(_.teamId)) .add("private", tour.isPrivate) - .add("position", tour.position.map(positionJson)) + .add("position", tour.position.map(position)) .add("schedule", tour.schedule.map(scheduleJson)) .add( "teamBattle", diff --git a/modules/tournament/src/main/JsonView.scala b/modules/tournament/src/main/JsonView.scala index 1c571e36ea425..d36cf75e94a0e 100644 --- a/modules/tournament/src/main/JsonView.scala +++ b/modules/tournament/src/main/JsonView.scala @@ -16,6 +16,7 @@ import lila.core.i18n.Translate import lila.core.socket.SocketVersion import lila.core.user.LightUserApi import lila.gathering.{ Condition, ConditionHandlers, GreatPlayer } +import lila.gathering.GatheringJson.* import lila.memo.CacheApi.* import lila.memo.SettingStore import lila.rating.PerfType @@ -114,7 +115,7 @@ final class JsonView( .add("spotlight" -> tour.spotlight) .add("berserkable" -> tour.berserkable) .add("noStreak" -> tour.noStreak) - .add("position" -> tour.position.ifTrue(full).map(positionJson)) + .add("position" -> tour.position.ifTrue(full).map(position)) .add("verdicts" -> verdicts.map(verdictsFor(_, tour.perfType))) .add("schedule" -> tour.schedule.map(scheduleJson)) .add("private" -> tour.isPrivate) @@ -558,23 +559,6 @@ object JsonView: "increment" -> clock.incrementSeconds ) - private[tournament] def positionJson(fen: Fen.Standard): JsObject = - lila.gathering.Thematic.byFen(fen) match - case Some(pos) => - Json - .obj( - "eco" -> pos.eco, - "name" -> pos.name, - "fen" -> pos.fen, - "url" -> pos.url - ) - case None => - Json - .obj( - "name" -> "Custom position", - "fen" -> fen - ) - private[tournament] given OWrites[Spotlight] = OWrites: s => Json .obj("headline" -> s.headline)