Skip to content

Commit

Permalink
Merge branch 'master' into holding-down-move-buttons
Browse files Browse the repository at this point in the history
  • Loading branch information
ornicar authored Dec 11, 2024
2 parents 4c91620 + 5ee0899 commit b14dbce
Show file tree
Hide file tree
Showing 98 changed files with 453 additions and 222 deletions.
2 changes: 0 additions & 2 deletions modules/memo/src/main/ParallelMongoQueue.scala
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ final class ParallelMongoQueue[A: BSONHandler](
import ParallelQueue.*
private given BSONDocumentHandler[Entry[A]] = Macros.handler[Entry[A]]

println(s"$name ${coll.name}")

def enqueue(a: A): Fu[Entry[A]] = workQueue:
status(a).flatMap:
case Some(entry) => fuccess(entry)
Expand Down
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
39 changes: 23 additions & 16 deletions modules/relay/src/main/RelayListing.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ final class RelayListing(

val defaultRoundToLink = cacheApi[RelayTourId, Option[RelayRound]](32, "relay.defaultRoundToLink"):
_.expireAfterWrite(5 seconds).buildAsyncFuture: tourId =>
tourWithUnfinishedRounds(tourId).mapz(RelayListing.defaultRoundToLink)
tourWithRounds(tourId).mapz(RelayListing.defaultRoundToLink)

def active: Fu[List[RelayCard]] = activeCache.get({})

Expand All @@ -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 All @@ -84,7 +91,7 @@ final class RelayListing(
yield t.focus(_.tour.tier).replace(visualTier.some)

private def getSpots: Fu[List[Spot]] = for
rawTours <- toursWithUnfinishedRounds
rawTours <- toursWithRounds
tours = rawTours.flatMap(decreaseTierIfDistantNextRound)
groups <- groupRepo.byTours(tours.map(_.tour.id))
yield
Expand All @@ -95,7 +102,7 @@ final class RelayListing(
tours.filter(t => group.tours.contains(t.tour.id)).toNel.map(Spot.GroupWithTours(group, _))
ungroupedTours ::: groupedTours

private def toursWithUnfinishedRounds: Fu[List[RelayTour.WithRounds]] =
private def toursWithRounds: Fu[List[RelayTour.WithRounds]] =
val max = 200
colls.tour
.aggregateList(max): framework =>
Expand All @@ -108,7 +115,7 @@ final class RelayListing(
)
.map(_.flatMap(readTourRound))

private def tourWithUnfinishedRounds(id: RelayTourId): Fu[Option[RelayTour.WithRounds]] =
private def tourWithRounds(id: RelayTourId): Fu[Option[RelayTour.WithRounds]] =
colls.tour
.aggregateOne(): framework =>
import framework.*
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
2 changes: 1 addition & 1 deletion modules/room/src/main/RoomSocket.scala
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ object RoomSocket:
def subscribeChat(rooms: RoomsMap, busChan: BusChan.Select)(using FlairGet, Executor) =
lila.common.Bus.subscribeFun(busChan(BusChan).chan, BusChan.global.chan):
case lila.core.chat.ChatLine(id, line, json) if line.userIdMaybe.isDefined =>
rooms.tellIfPresent(id.into(RoomId), (NotifyVersion)("message", json, line.troll))
rooms.tellIfPresent(id.into(RoomId), NotifyVersion("message", json, line.troll))
case lila.core.chat.OnTimeout(id, userId) =>
rooms.tellIfPresent(id.into(RoomId), NotifyVersion("chat_timeout", userId, troll = false))
case lila.core.chat.OnReinstate(id, userId) =>
Expand Down
4 changes: 2 additions & 2 deletions modules/round/src/main/RoundSocket.scala
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,10 @@ final class RoundSocket(
case lila.core.chat.ChatLine(id, l, json) =>
val line = lila.chat.RoundLine(l, json, id.value.endsWith("/w"))
rounds.tellIfPresent(GameId.take(id.value), line)
case lila.core.chat.OnTimeout(id, userId) =>
case lila.core.chat.OnTimeout(id, userId) if id.value.endsWith("/w") =>
send:
RP.Out.tellRoom(GameId.take(id.value).into(RoomId), makeMessage("chat_timeout", userId))
case lila.core.chat.OnReinstate(id, userId) =>
case lila.core.chat.OnReinstate(id, userId) if id.value.endsWith("/w") =>
send:
RP.Out.tellRoom(GameId.take(id.value).into(RoomId), makeMessage("chat_reinstate", userId))

Expand Down
2 changes: 1 addition & 1 deletion project/BuildSettings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ object BuildSettings {
import Dependencies._

val lilaVersion = "4.0"
val globalScalaVersion = "3.5.2"
val globalScalaVersion = "3.6.2"

def buildSettings =
Defaults.coreDefaultSettings ++ Seq(
Expand Down
Binary file modified public/images/flags/SY.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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 b14dbce

Please sign in to comment.