Skip to content

Commit

Permalink
Merge branch 'master' into scala-3.6.2
Browse files Browse the repository at this point in the history
  • Loading branch information
ornicar authored Dec 11, 2024
2 parents 7df8032 + 29c995c commit 6e24d43
Show file tree
Hide file tree
Showing 95 changed files with 446 additions and 222 deletions.
8 changes: 0 additions & 8 deletions modules/api/src/main/GameApiV2.scala
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ final class GameApiV2(

import GameApiV2.*

private val keepAliveInterval = 70.seconds // play's idleTimeout = 75s

def exportOne(game: Game, config: OneConfig)(using Translate): Fu[String] =
game.pgnImport.ifTrue(config.imported) match
case Some(imported) => fuccess(imported.pgn.value)
Expand Down Expand Up @@ -149,7 +147,6 @@ final class GameApiV2(
.throttle(config.perSecond.value, 1 second)
.via(upgradeOngoingGame)
.via(preparationFlow(config, realPlayers))
.keepAlive(keepAliveInterval, () => emptyMsgFor(config))

def exportByIds(config: ByIdsConfig)(using Translate): Source[String, ?] =
Source.futureSource:
Expand Down Expand Up @@ -264,11 +261,6 @@ final class GameApiV2(
case Format.PGN => pgnDump.formatter(config.flags)
case Format.JSON => jsonFormatter(config)

private def emptyMsgFor(config: Config) =
config.format match
case Format.PGN => "\n"
case Format.JSON => "{}\n"

private def jsonFormatter(config: Config)(using Translate) =
(
game: Game,
Expand Down
3 changes: 1 addition & 2 deletions modules/api/src/main/PgnDump.scala
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,4 @@ final class PgnDump(
analysis: Option[Analysis],
teams: Option[GameTeams],
realPlayers: Option[RealPlayers]
) =>
apply(game, initialFen, analysis, flags, teams, realPlayers).dmap(annotator.toPgnString).dmap(_.value)
) => apply(game, initialFen, analysis, flags, teams, realPlayers).map(annotator.toPgnString).dmap(_.value)
4 changes: 3 additions & 1 deletion modules/relay/src/main/RelayCard.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ case class RelayCard(
tour: RelayTour,
display: RelayRound, // which round to show on the tour link
link: RelayRound, // which round to actually link to
group: Option[RelayGroup.Name]
group: Option[RelayGroup.Name],
alts: List[RelayRound.WithTour] // other notable tours of the group
) extends RelayRound.AndTourAndGroup:

def errors: List[String] =
val round = display
~round.sync.log.lastErrors.some
Expand Down
17 changes: 10 additions & 7 deletions modules/relay/src/main/RelayGroup.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,18 @@ object RelayGroup:
def make = Id(ThreadLocalRandom.nextString(8))

opaque type Name = String
object Name extends OpaqueString[Name]
object Name extends OpaqueString[Name]:
extension (name: Name)
def shortTourName(tour: RelayTour.Name): RelayTour.Name =
if tour.value.startsWith(name.value)
then RelayTour.Name(tour.value.drop(name.value.size + 1).dropWhile(!_.isLetterOrDigit))
else tour

case class WithTours(group: RelayGroup, tours: List[RelayTour.IdName]):
def withShorterTourNames = copy(tours = tours.map: tour =>
if tour.name.value.startsWith(group.name.value)
then
val shortName = tour.name.value.drop(group.name.value.size + 1).dropWhile(!_.isLetterOrDigit)
tour.copy(name = RelayTour.Name(shortName))
else tour)
def withShorterTourNames = copy(
tours = tours.map: tour =>
tour.copy(name = group.name.shortTourName(tour.name))
)

private[relay] object form:
import play.api.data.*
Expand Down
31 changes: 19 additions & 12 deletions modules/relay/src/main/RelayListing.scala
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,16 @@ final class RelayListing(
spots <- getSpots
selected = spots.flatMap:
case Spot.UngroupedTour(t) =>
t.rounds.find(!_.isFinished).map(Selected(t, _, none))
t.rounds.find(!_.isFinished).map(Selected(t, _, none)).map(NonEmptyList.one)
case Spot.GroupWithTours(group, tours) =>
val all = for
tour <- tours.toList
round <- tour.rounds
round <- tour.rounds.find(!_.isFinished)
yield Selected(tour, round, group.name.some)
// sorted preserves the original ordering while adding its own
all.sorted(using Ordering.by(s => (tierPriority(s.t.tour), !s.round.hasStarted))).headOption
withLinkRound = selected.map: s =>
RelayCard(
s.t.tour,
s.round,
link = RelayListing.defaultRoundToLink(s.t) | s.round,
s.group
)
sorted = withLinkRound.sortBy: t =>
all.sorted(using Ordering.by(s => (tierPriority(s.t.tour), !s.round.hasStarted))).take(3).toNel
cards = selected.map(toRelayCard)
sorted = cards.sortBy: t =>
val startAt = t.display.startedAt.orElse(t.display.startsAtTime)
val crowdRelevant = startAt.exists(_.isBefore(nowInstant.plusHours(1)))
(
Expand All @@ -62,11 +56,24 @@ final class RelayListing(
yield
spotlightCache = sorted
.filter(_.tour.spotlight.exists(_.enabled))
.filterNot(_.display.isFinished)
.filter: tr =>
tr.display.hasStarted || tr.display.startsAtTime.exists(_.isBefore(nowInstant.plusMinutes(30)))
sorted

private def toRelayCard(s: NonEmptyList[Selected]): RelayCard =
val main = s.head
RelayCard(
tour = main.t.tour,
display = main.round,
link = RelayListing.defaultRoundToLink(main.t) | main.round,
group = main.group,
alts = s.tail
.filter(_.round.hasStarted)
.take(2)
.map: s =>
s.round.withTour(s.t.tour)
)

private def tierPriority(t: RelayTour) = -t.tier.so(_.v)

private def decreaseTierIfDistantNextRound(t: RelayTour.WithRounds): Option[RelayTour.WithRounds] = for
Expand Down
5 changes: 2 additions & 3 deletions modules/relay/src/main/RelayTour.scala
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,10 @@ case class RelayTour(

def path: String = s"/broadcast/$slug/$id"

def tierIs(selector: RelayTour.Tier.Selector) =
tier.fold(false)(_ == selector(RelayTour.Tier))
def tierIs(selector: RelayTour.Tier.Selector) = tier.has(selector(RelayTour.Tier))

def studyVisibility: Visibility =
if tier.contains(RelayTour.Tier.`private`)
if tier.has(RelayTour.Tier.`private`)
then Visibility.`private`
else Visibility.public

Expand Down
12 changes: 10 additions & 2 deletions modules/relay/src/main/ui/RelayTourUi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ final class RelayTourUi(helpers: Helpers, ui: RelayUi):
val tier = RelayTour.Tier(selector)
val selected = active.filter(_.tour.tierIs(selector))
selected.nonEmpty.option(st.section(cls := s"relay-cards relay-cards--tier-$tier"):
selected.map:
card.render(_, live = _.display.hasStarted)
selected.map: sel =>
card.render(sel, live = _.display.hasStarted, alts = sel.alts)
)
Page(trc.liveBroadcasts.txt())
.css("bits.relay.index")
Expand Down Expand Up @@ -240,6 +240,7 @@ final class RelayTourUi(helpers: Helpers, ui: RelayUi):
def render[A <: RelayRound.AndTourAndGroup](
tr: A,
live: A => Boolean,
alts: List[RelayRound.WithTour] = Nil,
errors: List[String] = Nil
)(using Context) =
link(tr.tour, tr.path, live(tr))(
Expand All @@ -259,6 +260,13 @@ final class RelayTourUi(helpers: Helpers, ui: RelayUi):
else tr.display.startedAt.orElse(tr.display.startsAtTime).map(momentFromNow)
),
h3(cls := "relay-card__title")(tr.group.fold(tr.tour.name.value)(_.value)),
tr.group
.ifTrue(alts.nonEmpty)
.map: group =>
ul(cls := "relay-card__alts"):
alts.map: alt =>
li(group.shortTourName(alt.tour.name))
,
if errors.nonEmpty
then ul(cls := "relay-card__errors")(errors.map(li(_)))
else truncatedPlayers(tr.tour)
Expand Down
82 changes: 81 additions & 1 deletion translation/dest/broadcast/ta-IN.xml
Original file line number Diff line number Diff line change
@@ -1,2 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="broadcasts">ஒளிபரப்புகள்</string>
<string name="myBroadcasts">எனது ஒளிபரப்புகள்</string>
<plurals name="nbBroadcasts">
<item quantity="one">%s ஒளிபரப்பு</item>
<item quantity="other">%s ஒளிபரப்புகள்</item>
</plurals>
<string name="liveBroadcasts">நேரலை பந்தய ஒளிபரப்புகள்</string>
<string name="broadcastCalendar">ஒளிபரப்பு நாட்காட்டி</string>
<string name="newBroadcast">புதிய நேரலை ஒளிபரப்பு</string>
<string name="subscribedBroadcasts">சந்தாதார ஒளிபரப்புகள்</string>
<string name="aboutBroadcasts">ஒளிபரப்புகள் பற்றி</string>
<string name="howToUseLichessBroadcasts">லிசெஸ் ஒளிபரப்புகளை எவ்வாறு பயன்படுத்துவது.</string>
<string name="theNewRoundHelp">புதிய சுற்றிலும் முந்தையதைப் போலவே அதே உறுப்பினர்களும் பங்களிப்பாளர்களும் இருப்பார்கள்.</string>
<string name="addRound">ஒரு சுற்று சேர்க்கவும்</string>
<string name="ongoing">தொடரும்</string>
<string name="upcoming">எதிர்வரும்</string>
<string name="completed">முற்றிற்று</string>
<string name="completedHelp">லிசெஸ் சுற்று நிறைவைக் கண்டறிகிறது, ஆனால் அதை தவறாகப் புரிந்து கொள்ளலாம். கைமுறையாக அமைக்க இதைப் பயன்படுத்தவும்.</string>
<string name="roundName">சுற்றுப் பெயர்</string>
<string name="roundNumber">சுற்று எண்</string>
<string name="tournamentName">பந்தயப் பெயர்</string>
<string name="tournamentDescription">பந்தயத்தின் குறுகிய விளக்கம்</string>
<string name="fullDescription">பந்தயத்தின் முழு விளக்கம்</string>
<string name="fullDescriptionHelp">பந்தயத்தின் நீண்ட விளக்கம் கட்டாயமற்றது. %1$s கிடைக்கிறது. நீளம் %2$s எழுத்துகளுக்குக் குறைவாக இருக்க வேண்டும்.</string>
<string name="sourceSingleUrl" comment="An input box. The user can add the external URL the PGN playback of the game is coming from, to set up their event broadcast.&#10;&#10;Could be alternatively stated as &quot;Source URL for the PGN&quot;.">PGN ஆதார URL</string>
<string name="sourceUrlHelp">PGN புதுப்பிப்புகளைப் பெற லிசெஸ் சரிபார்க்கும் URL. இது இணையத்திலிருந்து பொதுவில் அணுகக்கூடியதாக இருக்க வேண்டும்.</string>
<string name="sourceGameIds">64 லிசெஸ் ஆட்ட அடையாளங்கள் வரை, இடைவெளிகளால் பிரிக்கப்பட்டது.</string>
<string name="startDateTimeZone">பந்தயம் உள்ளூர் நேர மண்டலத்தில் துவங்கும் தேதி: %s</string>
<string name="startDateHelp">நிகழ்வு எப்போது துவங்கும் என்பது உங்களுக்குத் தெரிந்தால், கட்டாயமற்றது</string>
<string name="currentGameUrl">தற்போதைய ஆட்ட URL</string>
<string name="downloadAllRounds">அனைத்து சுற்றுகளையும் பதிவிறக்கவும்</string>
<string name="resetRound">இந்த சுற்றை மீட்டமைக்கவும்</string>
<string name="deleteRound">இந்த சுற்றை நீக்கு</string>
<string name="definitivelyDeleteRound">சுற்று மற்றும் அதன் அனைத்து ஆட்டங்களையும் கண்டிப்பாக நீக்கவும்.</string>
<string name="deleteAllGamesOfThisRound">இந்த சுற்றின் அனைத்து ஆட்டங்களையும் நீக்கு. அவற்றை மீண்டும் உருவாக்க, ஆதாரமானது செயற்பாட்டில் இருக்க வேண்டும்.</string>
<string name="editRoundStudy">சுற்று ஆய்வைத் திருத்து</string>
<string name="deleteTournament">இப்பந்தயத்தை நீக்கு</string>
<string name="definitivelyDeleteTournament">முழு பந்தயத்தையும், அதன் அனைத்து சுற்றுகளையும் அதன் அனைத்து ஆட்டங்களையும் கண்டிப்பாக நீக்கவும்.</string>
<string name="showScores">விளையாட்டு முடிவுகளின் அடிப்படையில் வீரர்களின் மதிப்பெண்களைக் காட்டு</string>
<string name="replacePlayerTags">கட்டாயமற்றது: வீரர்களின் பெயர்கள், மதிப்பீடுகள் மற்றும் தலைப்புகளை மாற்றவும்</string>
<string name="fideFederations">FIDE பேரவை</string>
<string name="top10Rating">சிறந்த 10 மதிப்பீடு</string>
<string name="fidePlayers">FIDE வீரர்கள்</string>
<string name="fidePlayerNotFound">FIDE வீரர்கள் கிடைக்கவில்லை</string>
<string name="fideProfile">FIDE சுயவிவரம்</string>
<string name="ageThisYear">இந்த ஆண்டு அகவை</string>
<string name="unrated" comment="Please do not translate simply as &quot;casual&quot;. &quot;Unrated&quot; here refers to tournaments that are organised outside of Lichess. The rating in question will usually align to a FIDE federation.">மதிப்பிடப்படாதது</string>
<string name="recentTournaments">சமீபத்திய பந்தயங்கள்</string>
<string name="openLichess">லிசெஸ் இல் திறக்கவும்</string>
<string name="teams">கூட்டணி</string>
<string name="boards">பலகைகள்</string>
<string name="overview">மேலோட்டம்</string>
<string name="subscribeTitle">ஒவ்வொரு சுற்று தொடங்கும் போதும் அறிவிப்பு பெற சந்தா பதியவும். உங்கள் கணக்கு விருப்பத்தேர்வுகளில் ஒளிபரப்புகளுக்கான மணி அல்லது தூண்டு அறிவிப்புகளை இயக்கலாம்.</string>
<string name="uploadImage">பந்தயத்தின் படத்தை பதிவேற்றவும்</string>
<string name="noBoardsYet">இன்னும் பலகைகள் இல்லை. ஆட்டங்கள் பதிவேற்றப்பட்டதும் இவை தோன்றும்.</string>
<string name="boardsCanBeLoaded" comment="%s is 'Broadcaster App'">பலகைகளை ஆதாரத்துடன் அல்லது %s வழியாக ஏற்றலாம்</string>
<string name="startsAfter">%sக்குப் பிறகு துவங்குகிறது</string>
<string name="startVerySoon">மிக விரைவில் ஒளிபரப்பு துவங்கும்.</string>
<string name="notYetStarted">ஒளிபரப்பு இன்னும் துவங்கவில்லை.</string>
<string name="officialWebsite">அதிகாரப்பூர்வ இணையதளம்</string>
<string name="standings">நிலைகள்</string>
<string name="officialStandings">அதிகாரப்பூர்வ நிலைகள்</string>
<string name="iframeHelp" comment="%s is 'webmasters page'">%s இல் கூடுதல் தேர்வுரிமை</string>
<string name="webmastersPage">இணையவல்லுநர் பக்கம்</string>
<string name="pgnSourceHelp" comment="%s is 'streaming API'">இந்தச் சுற்றுக்கான பொது, நிகழ்நேர PGN ஆதாரம். வேகமான மற்றும் திறமையான ஒத்திசைவுக்கு நாங்கள் %s ஐ வழங்குகிறோம்.</string>
<string name="embedThisBroadcast">இந்த ஒளிபரப்பை உங்கள் இணையதளத்தில் உட்பொதிக்கவும்</string>
<string name="embedThisRound">உங்கள் இணையதளத்தில் %s ஐ உட்பொதிக்கவும்</string>
<string name="ratingDiff">மதிப்பீடு வேறுபாடு</string>
<string name="gamesThisTournament">இப்பந்தயத்தில்லுள்ள ஆட்டங்கள்</string>
<string name="score">மதிப்பெண்</string>
<string name="allTeams">அனைத்து கூட்டணிகள்</string>
<string name="tournamentFormat">பந்தய வடிவம்</string>
<string name="tournamentLocation">பந்தய இடம்</string>
<string name="topPlayers">சிறந்த வீரர்கள்</string>
<string name="timezone">நேர மண்டலம்</string>
<string name="fideRatingCategory">FIDE மதிப்பீடு வகை</string>
<string name="optionalDetails">விருப்ப விவரங்கள்</string>
<string name="pastBroadcasts">கடந்த ஒளிபரப்புகள்</string>
<string name="allBroadcastsByMonth">மாதம்தோறும் அனைத்து ஒளிபரப்புகளையும் பார்க்க</string>
</resources>
Loading

0 comments on commit 6e24d43

Please sign in to comment.