Skip to content

Commit ec45aee

Browse files
authored
Merge branch 'lichess-org:master' into patch-11
2 parents 5c127f5 + 4e3389e commit ec45aee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+243
-121
lines changed

app/views/cms.scala

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,17 @@ import lila.common.String.shorten
1010

1111
object cms:
1212

13-
def render(p: CmsPage.Render)(using Context) = frag(
14-
editButton(p),
15-
rawHtml(p.html)
16-
)
13+
def render(page: CmsPage.Render)(using Context) =
14+
if !page.live && !isGranted(_.Pages)
15+
then p("Oops, looks like there will be something here soon... but not yet!")
16+
else
17+
frag(
18+
editButton(page),
19+
!page.live option span(cls := "cms__draft text", dataIcon := licon.Eye)(
20+
"This draft is not published"
21+
),
22+
rawHtml(page.html)
23+
)
1724

1825
def editButton(p: CmsPage.Render)(using Context) =
1926
isGranted(_.Pages) option a(

app/views/practice/show.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,5 @@ object show:
3030
),
3131
csp = analysisCsp.some,
3232
zoomable = true
33-
) :
33+
):
3434
main(cls := "analyse")

app/views/ublog/form.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ object form:
7777
trans.ublog.safeToUseImages(),
7878
fragList(
7979
List(
80-
"unsplash.com" -> "https://unsplash.com",
81-
"creativecommons.org" -> "https://search.creativecommons.org",
82-
"pixabay.com" -> "https://pixabay.com",
83-
"pexels.com" -> "https://pexels.com",
84-
"piqsels.com" -> "https://piqsels.com",
85-
"freeimages.com" -> "https://freeimages.com"
80+
"unsplash.com" -> "https://unsplash.com",
81+
"commons.wikimedia.org" -> "https://commons.wikimedia.org",
82+
"pixabay.com" -> "https://pixabay.com",
83+
"pexels.com" -> "https://pexels.com",
84+
"piqsels.com" -> "https://piqsels.com",
85+
"freeimages.com" -> "https://freeimages.com"
8686
).map: (name, url) =>
8787
a(href := url, targetBlank)(name)
8888
)

app/views/ublog/post.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ object post:
109109
div(cls := "ublog-post__markup expand-text")(markup),
110110
post.isLichess option div(cls := "ublog-post__lichess")(
111111
views.html.base.bits.connectLinks,
112-
p(cls := "ublog-post__patron-info")(a(href := routes.Plan.index)(trans.lichessPatronInfo()))
112+
p(a(href := routes.Plan.index)(trans.lichessPatronInfo()))
113113
),
114114
div(cls := "ublog-post__footer")(
115115
post.live && ~post.discuss option a(

modules/relay/src/main/RelayFetch.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,12 @@ private object RelayFetch:
241241
given Reads[RoundJsonPairing] = Json.reads
242242
given Reads[RoundJson] = Json.reads
243243

244-
case class GameJson(moves: List[String], result: Option[String]):
244+
case class GameJson(moves: List[String], result: Option[String], chess960: Option[Int] = none):
245245
def outcome = result.flatMap(Outcome.fromResult)
246246
def toPgn(extraTags: Tags = Tags.empty): PgnStr =
247+
val fenTag = chess960.flatMap(chess.variant.Chess960.positionToFen).map(pos => Tag(_.FEN, pos.value))
247248
val outcomeTag = outcome.map(o => Tag(_.Result, Outcome.showResult(o.some)))
248-
val tags = outcomeTag.foldLeft(extraTags)(_ + _)
249+
val tags = extraTags ++ Tags(List(fenTag, outcomeTag).flatten)
249250
val strMoves = moves
250251
.map(_ split ' ')
251252
.mapWithIndex: (move, index) =>

modules/relay/src/main/RelayGame.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ case class RelayGame(
99
variant: chess.variant.Variant,
1010
root: Root,
1111
ending: Option[PgnImport.End],
12-
index: Option[Int] = none[Int]
12+
index: Option[Int] = none
1313
):
1414

1515
def staticTagsMatch(chapterTags: Tags): Boolean =
@@ -64,5 +64,5 @@ private object RelayGame:
6464
Pgn(g.tags, InitialComments.empty, lila.study.PgnDump.rootToTree(g.root)).render
6565
.toList
6666
,
67-
mul => RelayFetch.multiPgnToGames(mul).toOption.get
67+
mul => RelayFetch.multiPgnToGames(mul).fold(e => throw e, identity)
6868
)

modules/relay/src/main/RelaySync.scala

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ final private class RelaySync(
4343
case _ =>
4444
createChapter(study, game).flatMap: chapter =>
4545
chapters.find(_.isEmptyInitial).ifTrue(chapter.order == 2).so { initial =>
46-
studyApi.deleteChapter(study.id, initial.id):
47-
actorApi.Who(study.ownerId, sri)
46+
studyApi.deleteChapter(study.id, initial.id)(who(study.ownerId))
4847
} inject SyncResult
4948
.ChapterResult(chapter.id, true, chapter.root.mainline.size)
5049
.some
@@ -71,14 +70,23 @@ final private class RelaySync(
7170
study: Study,
7271
game: RelayGame,
7372
chapter: Chapter
74-
): Fu[SyncResult.ChapterResult] =
75-
updateChapterTags(tour, study, chapter, game) zip
76-
updateChapterTree(study, chapter, game) map: (tagUpdate, nbMoves) =>
77-
SyncResult.ChapterResult(chapter.id, tagUpdate, nbMoves)
73+
): Fu[SyncResult.ChapterResult] = for
74+
chapter <- updateInitialPosition(study.id, chapter, game)
75+
tagUpdate <- updateChapterTags(tour, study, chapter, game)
76+
nbMoves <- updateChapterTree(study, chapter, game)
77+
yield SyncResult.ChapterResult(chapter.id, tagUpdate, nbMoves)
78+
79+
private def updateInitialPosition(studyId: StudyId, chapter: Chapter, game: RelayGame): Fu[Chapter] =
80+
if game.root.fen == chapter.root.fen
81+
then fuccess(chapter)
82+
else
83+
studyApi
84+
.resetRoot(studyId, chapter.id, game.root.withoutChildren)(who(chapter.ownerId))
85+
.dmap(_ | chapter)
7886

7987
private type NbMoves = Int
8088
private def updateChapterTree(study: Study, chapter: Chapter, game: RelayGame): Fu[NbMoves] =
81-
val who = actorApi.Who(chapter.ownerId, sri)
89+
val by = who(chapter.ownerId)
8290
game.root.mainline.foldLeft(UciPath.root -> none[Branch]) {
8391
case ((parentPath, None), gameNode) =>
8492
val path = parentPath + gameNode.id
@@ -90,7 +98,7 @@ final private class RelaySync(
9098
studyId = study.id,
9199
position = Position(chapter, path).ref,
92100
clock = c.some
93-
)(who)
101+
)(by)
94102
path -> none
95103
case (found, _) => found
96104
} match
@@ -101,7 +109,7 @@ final private class RelaySync(
101109
studyId = study.id,
102110
position = Position(chapter, path).ref,
103111
toMainline = true
104-
)(who) >> chapterRepo.setRelayPath(chapter.id, path)
112+
)(by) >> chapterRepo.setRelayPath(chapter.id, path)
105113
} >> newNode.so: node =>
106114
node.mainline
107115
.foldM(Position(chapter, path).ref): (position, n) =>
@@ -117,7 +125,7 @@ final private class RelaySync(
117125
lastMoveAt = nowInstant
118126
)
119127
.some
120-
)(who) inject position + n
128+
)(by) inject position + n
121129
.inject:
122130
if chapter.root.children.nodes.isEmpty && node.mainline.nonEmpty then
123131
studyApi.reloadChapters(study)
@@ -146,7 +154,7 @@ final private class RelaySync(
146154
studyId = study.id,
147155
chapterId = chapter.id,
148156
tags = chapterNewTags
149-
)(actorApi.Who(chapter.ownerId, sri)) >> {
157+
)(who(chapter.ownerId)) >> {
150158
val newEnd = chapter.tags.outcome.isEmpty && tags.outcome.isDefined
151159
newEnd so onChapterEnd(tour, study, chapter)
152160
} inject true
@@ -197,7 +205,7 @@ final private class RelaySync(
197205
)
198206
.some
199207
)
200-
studyApi.doAddChapter(study, chapter, sticky = false, actorApi.Who(study.ownerId, sri)) andDo
208+
studyApi.doAddChapter(study, chapter, sticky = false, who(study.ownerId)) andDo
201209
multiboard.invalidate(study.id) inject chapter
202210
}
203211

@@ -208,7 +216,8 @@ final private class RelaySync(
208216
clock = none
209217
)
210218

211-
private val sri = Sri("")
219+
private val sri = Sri("")
220+
private def who(userId: UserId) = actorApi.Who(userId, sri)
212221

213222
private def vs(tags: Tags) = s"${tags(_.White) | "?"} - ${tags(_.Black) | "?"}"
214223

modules/study/src/main/PgnTags.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ object PgnTags:
4848
Event,
4949
Round,
5050
Board,
51-
Annotator
51+
Annotator,
52+
FEN
5253
)
5354

5455
val typesToString = sortedTypes mkString ","

modules/study/src/main/StudyApi.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,13 @@ final class StudyApi(
284284
fufail(s"Invalid delNode $studyId $position") andDo
285285
reloadSriBecauseOf(study, who.sri, chapter.id)
286286

287+
def resetRoot(studyId: StudyId, chapterId: StudyChapterId, newRoot: lila.tree.Root)(who: Who) =
288+
sequenceStudyWithChapter(studyId, chapterId):
289+
case Study.WithChapter(study, prevChapter) =>
290+
val chapter = prevChapter.copy(root = newRoot)
291+
chapterRepo.update(chapter) andDo
292+
sendTo(study.id)(_.updateChapter(chapter.id, who)) inject chapter.some
293+
287294
def clearAnnotations(studyId: StudyId, chapterId: StudyChapterId)(who: Who) =
288295
sequenceStudyWithChapter(studyId, chapterId):
289296
case Study.WithChapter(study, chapter) =>

modules/study/src/test/MultiPgnTest.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class MultiPgnTest extends munit.FunSuite:
88
val max = Max(100)
99

1010
test("split empty string"):
11-
val pgn = PgnStr("")
11+
val pgn = PgnStr("")
1212
val multi = MultiPgn.split(pgn, max)
1313
assertEquals(multi.value, Nil)
1414

@@ -18,8 +18,9 @@ class MultiPgnTest extends munit.FunSuite:
1818
multi = MultiPgn.split(pgn, max)
1919
yield assertEquals(multi.value.size, 1)
2020

21-
val games = List(PgnFixtures.pgn3, PgnFixtures.pgn4, PgnFixtures.pgn5, PgnFixtures.pgn6, PgnFixtures.pgn7).map(PgnStr(_))
21+
val games = List(PgnFixtures.pgn3, PgnFixtures.pgn4, PgnFixtures.pgn5, PgnFixtures.pgn6, PgnFixtures.pgn7)
22+
.map(PgnStr(_))
2223
test("split mutitple games"):
23-
val pgn = PgnStr(games.mkString("\n\n"))
24+
val pgn = PgnStr(games.mkString("\n\n"))
2425
val multi = MultiPgn.split(pgn, max)
2526
assertEquals(multi.value.size, games.size)

project/Dependencies.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ object Dependencies {
1717
val alleycats = "org.typelevel" %% "alleycats-core" % "2.10.0"
1818
val scalalib = "com.github.ornicar" %% "scalalib" % "9.5.5"
1919
val hasher = "com.roundeights" %% "hasher" % "1.3.1"
20-
val chess = "org.lichess" %% "scalachess" % "15.7.6"
20+
val chess = "org.lichess" %% "scalachess" % "15.7.7"
2121
val compression = "org.lichess" %% "compression" % "1.10"
2222
val maxmind = "com.maxmind.geoip2" % "geoip2" % "4.0.1"
2323
val prismic = "io.prismic" %% "scala-kit" % "1.2.19_lila-3.2"

translation/dest/dgt/vi-VN.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
<string name="thisPageAllowsConnectingDgtBoard">Trang này cho phép bạn kết nối bàn cờ DGT của mình với Lichess và sử dụng nó để chơi cờ.</string>
88
<string name="toConnectTheDgtBoard">Để kết nối với Bảng điện tử bàn cờ DGT, bạn sẽ cần cài đặt %s.</string>
99
<string name="downloadHere">Bạn có thể tải về phần mềm tại đây: %s.</string>
10-
<string name="ifLiveChessRunningOnThisComputer">Nếu %1$s đang chạy trên máy tính này, bạn có thể kiểm tra kết nối của mình với nó trước %2$s.</string>
10+
<string name="ifLiveChessRunningOnThisComputer">Nếu %1$s đang chạy trên máy tính này, bạn có thể kiểm tra kết nối của mình với nó bằng cách %2$s.</string>
1111
<string name="openingThisLink">mở liên kết này</string>
1212
<string name="ifLiveChessRunningElsewhere">Nếu %1$s đang chạy trên một máy khác hoặc cổng khác, bạn sẽ cần đặt địa chỉ IP và cổng tại đây trong %2$s.</string>
13-
<string name="configurationSection">Phần cấu hình</string>
13+
<string name="configurationSection">Phần Cấu hình</string>
1414
<string name="keepPlayPageOpen">Trang ván đấu cần được mở trên trình duyệt của bạn. Nó không cần phải hiển thị, bạn có thể thu nhỏ nó hoặc đặt nó cạnh trang ván đấu Lichess, nhưng đừng đóng nó nếu không bàn cờ sẽ ngừng hoạt động.</string>
1515
<string name="boardWillAutoConnect">Bàn cờ sẽ tự động kết nối với bất kỳ ván đấu nào đang diễn ra hoặc bất kỳ ván cờ mới nào bắt đầu. Khả năng chọn ván đấu để chơi sắp ra mắt.</string>
16-
<string name="timeControlsForCasualGames">Kiểm soát thời gian cho các ván cờ không xếp hạng: chỉ Cờ nhanh, Cờ chậm và Cờ qua thư.</string>
17-
<string name="timeControlsForRatedGames">Kiểm soát thời gian cho các ván cờ có tính Elo: Cờ Chậm, Cờ qua thư và một số thể loại Cờ Nhanh bao gồm 15+10 và 20+0</string>
16+
<string name="timeControlsForCasualGames">Kiểu thời gian cho các ván cờ không xếp hạng: chỉ Cờ nhanh, Cờ chậm và Cờ qua thư.</string>
17+
<string name="timeControlsForRatedGames">Kiểu thời gian cho các ván cờ có xếp hạng: Cờ chậm, Cờ qua thư và một số thể loại Cờ nhanh bao gồm 15+10 và 20+0</string>
1818
<string name="whenReadySetupBoard">Khi đã sẵn sàng, hãy thiết lập bàn cờ của bạn rồi nhấp vào %s.</string>
1919
<string name="ifMoveNotDetected">Nếu không phát hiện được nước cờ</string>
2020
<string name="checkYouHaveMadeOpponentsMove">Kiểm tra xem bạn đã thực hiện nước đi của đối thủ trên bàn cờ DGT trước chưa. Hoàn nguyên nước đi của bạn. Chơi lại.</string>
@@ -36,7 +36,7 @@
3636
<string name="announceAllMoves">Thông báo tất cả các nước đi</string>
3737
<string name="selectAnnouncePreference">Chọn CÓ để thông báo cả nước đi của bạn và nước đi của đối thủ. Chọn KHÔNG để chỉ thông báo nước đi của đối thủ.</string>
3838
<string name="announceMoveFormat">Thông báo định dạng nước đi</string>
39-
<string name="moveFormatDescription">SAN là tiêu chuẩn của Lichess như \"Nf6\". UCI phổ biến trên các động cơ như \"g8f6\".</string>
39+
<string name="moveFormatDescription">SAN là tiêu chuẩn của Lichess như \"Nf6\". UCI phổ biến trên các động cơ cờ vua như \"g8f6\".</string>
4040
<string name="keywords">Các từ khóa</string>
4141
<string name="keywordFormatDescription">Từ khóa có định dạng JSON. Chúng được sử dụng để dịch các nước đi và kết quả sang ngôn ngữ của bạn. Mặc định là tiếng Anh nhưng bạn có thể thoải mái thay đổi nó.</string>
4242
<string name="debug">Bắt lỗi</string>

translation/dest/onboarding/eu-ES.xml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,17 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<resources></resources>
2+
<resources>
3+
<string name="welcome">Ongi etrori!</string>
4+
<string name="welcomeToLichess">Ongi etorri lichess.org-era!</string>
5+
<string name="thisIsYourProfilePage">Hau zure profilaren orrialdea da.</string>
6+
<string name="enabledKidModeSuggestion" comment="%s is 'Kid mode'.">Kontu hau haur batek erabiliko du? Agian %s aktibatu nahiko duzu.</string>
7+
<string name="whatNowSuggestions">Eta orain zer? Hemen dituzu gomendio batzuk:</string>
8+
<string name="learnChessRules">Ikasi xakearen arauak</string>
9+
<string name="improveWithChessTacticsPuzzles">Hobetu zure xakea taktika ariketekin.</string>
10+
<string name="playTheArtificialIntelligence">Jokatu Adimen Artifizialaren aurka.</string>
11+
<string name="playOpponentsFromAroundTheWorld">Jokatu mundu osoko aurkariekin.</string>
12+
<string name="followYourFriendsOnLichess">Jarraitu zure lagunak Lichessen.</string>
13+
<string name="playInTournaments">Jokatu txapelketak.</string>
14+
<string name="learnFromXAndY" comment="%1$s is Study&#10;%2$s is Videos&#10;&#10;They are both links to pages titled that way, and the title is used verbatim.">Ikasi %1$s eta %2$s erabiliz.</string>
15+
<string name="configureLichess">Konfiguratu Lichess nahi duzun moduan.</string>
16+
<string name="exploreTheSiteAndHaveFun">Esploratu eta ondo pasatu :)</string>
17+
</resources>

translation/dest/onboarding/fr-FR.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="welcome">Bienvenue!</string>
4-
<string name="welcomeToLichess">Bienvenue sur lichess.org!</string>
3+
<string name="welcome">Bienvenue !</string>
4+
<string name="welcomeToLichess">Bienvenue sur lichess.org !</string>
55
<string name="thisIsYourProfilePage">Voici votre profil.</string>
6-
<string name="enabledKidModeSuggestion" comment="%s is 'Kid mode'.">Un enfant utilisera-t-il ce compte? Songez à activer le %s.</string>
6+
<string name="enabledKidModeSuggestion" comment="%s is 'Kid mode'.">Un enfant utilisera-t-il ce compte ? Songez à activer le %s.</string>
77
<string name="whatNowSuggestions">Et maintenant? Quelques suggestions :</string>
88
<string name="learnChessRules">Apprendre les règles des échecs</string>
99
<string name="improveWithChessTacticsPuzzles">Améliorez-vous en résolvant des problèmes de tactique.</string>

translation/dest/patron/eu-ES.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,7 @@ Edo %s.</string>
7979
<string name="nowOneMonth">Orain hilabeterako Lichess Babeslea zara!</string>
8080
<string name="downgradeNextMonth">Hilabetean EZ dizugu berriz kobratuko eta zure kontua ohiko izatera pasatuko da.</string>
8181
<string name="changeCurrency">Aldatu moneta</string>
82+
<string name="paymentDetails">Ordainketaren xehetasunak</string>
83+
<string name="updatePaymentMethod">Eguneratu ordainketa modua</string>
84+
<string name="stripeManageSub">Kudeatu zure harpidetza eta deskargatu faktura eta ordainagiriak</string>
8285
</resources>

translation/dest/patron/uk-UA.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,7 @@
8484
<string name="nowOneMonth">Тепер Ви Покровитель Lichess на один місяць!</string>
8585
<string name="downgradeNextMonth">Через один місяць з Вас НЕ буде списано кошти знову, а Ваш обліковий запис Lichess буде повернено до звичайного.</string>
8686
<string name="changeCurrency">Змінити валюту</string>
87+
<string name="paymentDetails">Деталі оплати</string>
88+
<string name="updatePaymentMethod">Оновити спосіб оплати</string>
89+
<string name="stripeManageSub">Керувати своєю підпискою та завантажити ваші чеки</string>
8790
</resources>

translation/dest/preferences/eu-ES.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<string name="inputMovesWithVoice">Egin jokaldiak zure ahotsarekin</string>
5252
<string name="snapArrowsToValidMoves" comment="snapArrowsToValidMoves&#10;&#10;The 'arrows' are for quick annotations you can do on the board, by holding right mouse button. With this setting enabled, it means the arrows will align themselves to places were pieces can move.">Marraztutako geziak legezko jokaldietara mugatu</string>
5353
<string name="sayGgWpAfterLosingOrDrawing" comment="sayGgWpAfterLosingOrDrawing&#10;&#10;When enabled, this setting will automatically send 'Good game, well played' to your opponent if you are lose or draw the game. It's meant as a courtesy message.&#10;&#10;The message will be sent in ENGLISH.&#10;&#10;It is up to you how to deal with this. For example, you may want to put '(message will be sent in English)' in your translated text as one example. Or you can leave the actual English text and put a brief translation in your own language.">Txateam \"Good game, well played\" esan partida galdu edo berdintzean</string>
54-
<string name="yourPreferencesHaveBeenSaved">Zure hobespenak ondo gorde dira.</string>
54+
<string name="yourPreferencesHaveBeenSaved">Zure ezarpenak ondo gorde dira.</string>
5555
<string name="scrollOnTheBoardToReplayMoves">Mugitu taula gainean jokaldiak ikusteko</string>
5656
<string name="correspondenceEmailNotification">Jaso posta elektronikoz zure posta-bidezko partiden jakinarazpenen zerrenda egunero</string>
5757
<string name="notifyStreamStart">Streamerra zuzenean dago</string>

0 commit comments

Comments
 (0)