From 5f15f0c3b13915f3b3815dd10accf0197a69d20e Mon Sep 17 00:00:00 2001 From: nrobi144 Date: Tue, 10 Feb 2026 16:34:07 +0200 Subject: [PATCH] fix: address Copilot review comments - ChessPosition: include all fields in equals/hashCode - AcceptedGamesRegistry: add thread safety with synchronized - ChessEventBroadcaster: use valid filter for connection trigger - ChessEventBroadcaster: fix misleading relayResults - Remove println debug logging from ChessSubscription/Broadcaster - UserProfileScreen: use proper JSON parsing via MetadataEvent Co-Authored-By: Claude Opus 4.5 --- .../amethyst/model/nip64Chess/ChessAction.kt | 2 +- .../topNavFeeds/FeedTopNavFilterState.kt | 1 + .../model/topNavFeeds/chess/ChessFeedFlow.kt | 2 +- .../topNavFeeds/chess/ChessTopNavFilter.kt | 2 +- .../chess/ChessTopNavPerRelayFilter.kt | 2 +- .../chess/ChessTopNavPerRelayFilterSet.kt | 2 +- .../amethyst/ui/note/NoteCompose.kt | 3 + .../amethyst/ui/note/types/Chess.kt | 12 ++- .../loggedIn/chess/AndroidChessAdapter.kt | 7 +- .../screen/loggedIn/chess/ChessGameScreen.kt | 6 +- .../screen/loggedIn/chess/ChessLobbyScreen.kt | 2 +- .../loggedIn/chess/ChessSubscription.kt | 2 +- .../loggedIn/chess/ChessViewModelFactory.kt | 2 +- .../loggedIn/chess/ChessViewModelNew.kt | 2 +- .../loggedIn/chess/NewChessGameButton.kt | 2 +- .../loggedIn/chess/dal/ChessFeedFilter.kt | 2 +- .../ui/screen/loggedIn/home/HomeScreen.kt | 2 + .../loggedIn/home/NewChessGameButton.kt | 2 +- .../nip64Chess/FilterHomePostsByChess.kt | 2 +- .../commons/chess/AcceptedGamesRegistry.kt | 20 +++-- .../amethyst/commons/chess/ChessBoard.kt | 2 +- .../commons/chess/ChessBroadcastBanner.kt | 35 +++++--- .../amethyst/commons/chess/ChessConfig.kt | 2 +- .../commons/chess/ChessEventCollector.kt | 2 +- .../commons/chess/ChessEventPolling.kt | 2 +- .../amethyst/commons/chess/ChessGameLoader.kt | 7 +- .../amethyst/commons/chess/ChessGameViewer.kt | 2 +- .../amethyst/commons/chess/ChessLobbyCards.kt | 7 +- .../amethyst/commons/chess/ChessLobbyLogic.kt | 7 +- .../amethyst/commons/chess/ChessLobbyState.kt | 2 +- .../commons/chess/ChessPieceVectors.kt | 2 +- .../commons/chess/ChessRelayFetchHelper.kt | 2 +- .../amethyst/commons/chess/ChessSyncBanner.kt | 2 +- .../commons/chess/IUserMetadataProvider.kt | 2 +- .../commons/chess/InteractiveChessBoard.kt | 2 +- .../amethyst/commons/chess/LiveChessGame.kt | 86 +++++++++++++++---- .../amethyst/commons/chess/MoveNavigator.kt | 2 +- .../amethyst/commons/chess/PGNMetadata.kt | 2 +- .../chess/subscription/ChessFilterBuilder.kt | 2 +- .../ChessSubscriptionController.kt | 2 +- .../subscription/ChessSubscriptionState.kt | 2 +- .../chess/subscription/ChessTimeWindows.kt | 2 +- .../commons/data/UserMetadataCache.kt | 2 +- .../commons/profile/ProfileBroadcastBanner.kt | 2 +- .../commons/profile/ProfileBroadcastStatus.kt | 2 +- .../commons/chess/ChessEventBroadcaster.kt | 26 +++--- .../amethyst/desktop/chess/ChessScreen.kt | 2 +- .../desktop/chess/DesktopChessAdapter.kt | 2 +- .../desktop/chess/DesktopChessEventCache.kt | 2 +- .../desktop/chess/DesktopChessViewModelNew.kt | 2 +- .../subscriptions/ChessSubscription.kt | 7 +- .../amethyst/desktop/ui/UserProfileScreen.kt | 41 ++++----- .../quartz/nip64Chess/ChessEngine.kt | 2 +- .../quartz/nip64Chess/ChessGame.kt | 2 +- .../quartz/nip64Chess/ChessGameEvent.kt | 2 +- .../nip64Chess/ChessGameNameGenerator.kt | 2 +- .../quartz/nip64Chess/ChessMove.kt | 2 +- .../quartz/nip64Chess/ChessPosition.kt | 10 ++- .../nip64Chess/ChessStateReconstructor.kt | 13 ++- .../quartz/nip64Chess/JesterEvents.kt | 2 +- .../quartz/nip64Chess/LiveChessEvents.kt | 2 +- .../quartz/nip64Chess/LiveChessGameEvents.kt | 2 +- .../quartz/nip64Chess/LiveChessGameState.kt | 3 +- .../quartz/nip64Chess/PGNParser.kt | 4 +- .../quartz/nip64Chess/ChessGameEventTest.kt | 2 +- .../quartz/nip64Chess/JesterEventTest.kt | 2 +- .../quartz/nip64Chess/PGNParserTest.kt | 2 +- .../nip64Chess/ChessEngine.jvmAndroid.kt | 12 ++- .../nip64Chess/ChessStateReconstructorTest.kt | 2 +- 69 files changed, 255 insertions(+), 152 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip64Chess/ChessAction.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip64Chess/ChessAction.kt index 15f472440..143f6ce8b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip64Chess/ChessAction.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip64Chess/ChessAction.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt index c759c7ce3..03bea20ea 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt @@ -89,6 +89,7 @@ class FeedTopNavFilterState( CHESS -> { ChessFeedFlow(followsRelays, proxyRelays) } + else -> { val note = LocalCache.checkGetOrCreateAddressableNote(listName) if (note != null) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessFeedFlow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessFeedFlow.kt index 869899635..2d323ad74 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessFeedFlow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessFeedFlow.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavFilter.kt index 109c40efa..de820177d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavFilter.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilter.kt index 07080dd13..49da8bb5f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilter.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilterSet.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilterSet.kt index cf1a7c6ca..cfc589883 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilterSet.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/chess/ChessTopNavPerRelayFilterSet.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index bf8b7a221..3681fd981 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -925,6 +925,7 @@ private fun RenderNoteRow( nav, ) } + is LiveChessGameChallengeEvent -> { RenderLiveChessChallenge( baseNote, @@ -933,6 +934,7 @@ private fun RenderNoteRow( nav, ) } + is LiveChessGameEndEvent -> { RenderLiveChessGameEnd( baseNote, @@ -941,6 +943,7 @@ private fun RenderNoteRow( nav, ) } + is ClassifiedsEvent -> { RenderClassifieds( noteEvent, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Chess.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Chess.kt index b0f7c33d9..af7b3d472 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Chess.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Chess.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -107,8 +107,12 @@ fun RenderLiveChessChallenge( val borderColor = when { - isOpenChallenge -> Color(0xFF4CAF50) // Green for open - isIncomingChallenge -> Color(0xFFFFA726) // Orange for incoming + isOpenChallenge -> Color(0xFF4CAF50) + + // Green for open + isIncomingChallenge -> Color(0xFFFFA726) + + // Orange for incoming else -> MaterialTheme.colorScheme.outline // Gray for sent } @@ -191,7 +195,7 @@ fun RenderLiveChessChallenge( gameId = gameId, challengerPubkey = challengerPubkey, challengerDisplayName = note.author?.toBestDisplayName(), - challengerAvatarUrl = note.author?.info?.profilePicture(), + challengerAvatarUrl = note.author?.profilePicture(), opponentPubkey = event.opponentPubkey(), challengerColor = event.playerColor() ?: ChessColor.WHITE, createdAt = event.createdAt, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/AndroidChessAdapter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/AndroidChessAdapter.kt index fa0f694a4..18c639ec4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/AndroidChessAdapter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/AndroidChessAdapter.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -398,12 +398,11 @@ class AndroidRelayFetcher( class AndroidMetadataProvider : IUserMetadataProvider { override fun getDisplayName(pubkey: String): String { val user = LocalCache.getOrCreateUser(pubkey) - return user.info?.bestName() - ?: user.pubkeyDisplayHex() + return user.toBestDisplayName() } override fun getPictureUrl(pubkey: String): String? { val user = LocalCache.getOrCreateUser(pubkey) - return user.info?.profilePicture() + return user.profilePicture() } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessGameScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessGameScreen.kt index 5c8d6fd08..f5e5c86f2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessGameScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessGameScreen.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -213,9 +213,11 @@ fun ChessGameScreen( is ChessBroadcastStatus.Failed -> { // Could implement retry logic here } + is ChessBroadcastStatus.Desynced -> { chessViewModel.forceRefresh() } + else -> { } } }, @@ -240,6 +242,7 @@ fun ChessGameScreen( } } } + gameState == null -> { // Game not found - show error with back button Column( @@ -286,6 +289,7 @@ fun ChessGameScreen( } } } + else -> { // Resolve opponent display name val opponentDisplayName = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessLobbyScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessLobbyScreen.kt index f7250f45e..2062caca8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessLobbyScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessLobbyScreen.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessSubscription.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessSubscription.kt index 8aabd38ff..9028de195 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessSubscription.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessSubscription.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelFactory.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelFactory.kt index b8a048c99..b4c33a68d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelFactory.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelFactory.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelNew.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelNew.kt index 478cef480..9c0156997 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelNew.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/ChessViewModelNew.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/NewChessGameButton.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/NewChessGameButton.kt index 72af11e89..c0baa2135 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/NewChessGameButton.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/NewChessGameButton.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/dal/ChessFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/dal/ChessFeedFilter.kt index 9e37136c2..4ffd267a1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/dal/ChessFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/dal/ChessFeedFilter.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt index 34573d217..3b945df3d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt @@ -250,9 +250,11 @@ fun HomeScreenFloatingButton( is LocationState.LocationResult.Loading -> { } } } + CHESS -> { NewChessGameButton(accountViewModel, nav) } + else -> { NewNoteButton(nav) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/NewChessGameButton.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/NewChessGameButton.kt index b10d7918d..ca4bbefb7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/NewChessGameButton.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/NewChessGameButton.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip64Chess/FilterHomePostsByChess.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip64Chess/FilterHomePostsByChess.kt index dee4dcbc0..3999badfc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip64Chess/FilterHomePostsByChess.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip64Chess/FilterHomePostsByChess.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/AcceptedGamesRegistry.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/AcceptedGamesRegistry.kt index 4268e4be8..eb7b528af 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/AcceptedGamesRegistry.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/AcceptedGamesRegistry.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -29,19 +29,29 @@ package com.vitorpamplona.amethyst.commons.chess */ object AcceptedGamesRegistry { private val acceptedGameIds = mutableSetOf() + private val lock = Any() fun markAsAccepted(gameId: String) { - acceptedGameIds.add(gameId) + synchronized(lock) { + acceptedGameIds.add(gameId) + } } - fun wasAccepted(gameId: String): Boolean = acceptedGameIds.contains(gameId) + fun wasAccepted(gameId: String): Boolean = + synchronized(lock) { + acceptedGameIds.contains(gameId) + } fun clear() { - acceptedGameIds.clear() + synchronized(lock) { + acceptedGameIds.clear() + } } /** Remove old entries - call periodically to prevent memory leak */ fun clearOldEntries(keepGameIds: Set) { - acceptedGameIds.retainAll(keepGameIds) + synchronized(lock) { + acceptedGameIds.retainAll(keepGameIds) + } } } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBoard.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBoard.kt index 61811c2d1..dc0cec5bb 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBoard.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBoard.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBroadcastBanner.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBroadcastBanner.kt index c3cda3a7c..e876cfe80 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBroadcastBanner.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessBroadcastBanner.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -149,12 +149,17 @@ fun ChessBroadcastBanner( @Composable private fun getStatusBackgroundColor(status: ChessBroadcastStatus): Color = when (status) { - is ChessBroadcastStatus.Failed, is ChessBroadcastStatus.Desynced -> + is ChessBroadcastStatus.Failed, is ChessBroadcastStatus.Desynced -> { MaterialTheme.colorScheme.errorContainer - is ChessBroadcastStatus.Success -> + } + + is ChessBroadcastStatus.Success -> { MaterialTheme.colorScheme.primaryContainer - else -> + } + + else -> { MaterialTheme.colorScheme.surfaceContainer + } } private fun getStatusIcon(status: ChessBroadcastStatus): ImageVector = @@ -171,14 +176,21 @@ private fun getStatusIcon(status: ChessBroadcastStatus): ImageVector = @Composable private fun getStatusIconColor(status: ChessBroadcastStatus): Color = when (status) { - is ChessBroadcastStatus.Failed, is ChessBroadcastStatus.Desynced -> + is ChessBroadcastStatus.Failed, is ChessBroadcastStatus.Desynced -> { MaterialTheme.colorScheme.error - is ChessBroadcastStatus.Success -> + } + + is ChessBroadcastStatus.Success -> { MaterialTheme.colorScheme.primary - is ChessBroadcastStatus.WaitingForOpponent -> + } + + is ChessBroadcastStatus.WaitingForOpponent -> { MaterialTheme.colorScheme.secondary - else -> + } + + else -> { MaterialTheme.colorScheme.primary + } } private fun getStatusText(status: ChessBroadcastStatus): String = @@ -205,10 +217,13 @@ private fun getStatusDetail(status: ChessBroadcastStatus): String = @Composable private fun getStatusDetailColor(status: ChessBroadcastStatus): Color = when (status) { - is ChessBroadcastStatus.Failed, is ChessBroadcastStatus.Desynced -> + is ChessBroadcastStatus.Failed, is ChessBroadcastStatus.Desynced -> { MaterialTheme.colorScheme.error - else -> + } + + else -> { MaterialTheme.colorScheme.primary + } } private fun getStatusProgress(status: ChessBroadcastStatus): Float? = diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessConfig.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessConfig.kt index fb3f2061a..71a25aa4e 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessConfig.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessConfig.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventCollector.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventCollector.kt index 1f26d3409..c15195dbf 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventCollector.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventCollector.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventPolling.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventPolling.kt index 8a81bfbe0..f73db65d9 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventPolling.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventPolling.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameLoader.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameLoader.kt index e3458667c..f0557e2ab 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameLoader.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameLoader.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -126,7 +126,10 @@ object ChessGameLoader { LoadGameResult.Error("Failed to convert reconstructed state to live state") } } - is ReconstructionResult.Error -> LoadGameResult.Error(result.message) + + is ReconstructionResult.Error -> { + LoadGameResult.Error(result.message) + } } } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameViewer.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameViewer.kt index 1eb4ad2a1..1fcc1ab3c 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameViewer.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessGameViewer.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyCards.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyCards.kt index b070673e2..e9f23f8f7 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyCards.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyCards.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -301,7 +301,10 @@ fun CompletedGameCard( val resultColor = when { isDraw -> MaterialTheme.colorScheme.onSurfaceVariant - didUserWin -> Color(0xFF4CAF50) // Green + + didUserWin -> Color(0xFF4CAF50) + + // Green else -> Color(0xFFF44336) // Red } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyLogic.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyLogic.kt index 32e1b4311..56ae30b3d 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyLogic.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyLogic.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -389,6 +389,7 @@ class ChessLobbyLogic( state.setBroadcastStatus(ChessBroadcastStatus.Idle) state.setError(null) } + is LoadGameResult.Error -> { state.setError("Failed to load game: ${result.message}") state.setBroadcastStatus(ChessBroadcastStatus.Idle) @@ -518,6 +519,7 @@ class ChessLobbyLogic( // Auto-select the game for Desktop (Android uses route navigation) state.selectGame(startEventId) } + is LoadGameResult.Error -> { state.setError("Failed to load game: ${result.message}") state.setBroadcastStatus(ChessBroadcastStatus.Idle) @@ -549,6 +551,7 @@ class ChessLobbyLogic( state.setBroadcastStatus(ChessBroadcastStatus.Idle) state.setError(null) } + is LoadGameResult.Error -> { // Check again if game was added while we were fetching // (e.g., by acceptChallenge completing in parallel) @@ -582,6 +585,7 @@ class ChessLobbyLogic( is LoadGameResult.Success -> { state.replaceGameState(startEventId, result.liveState) } + is LoadGameResult.Error -> { // Don't overwrite error for periodic refresh failures } @@ -754,6 +758,7 @@ class ChessLobbyLogic( pollingDelegate.addGameId(startEventId) } } + is LoadGameResult.Error -> { // Failed to load game - continue with others } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyState.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyState.kt index 75b458172..5ebcd39f0 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyState.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessLobbyState.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessPieceVectors.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessPieceVectors.kt index 52f119caf..e5034553d 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessPieceVectors.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessPieceVectors.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt index e9b05b77f..4a713d379 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessSyncBanner.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessSyncBanner.kt index 5db641ed9..e449e838c 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessSyncBanner.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessSyncBanner.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/IUserMetadataProvider.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/IUserMetadataProvider.kt index 3c6da8c01..c10c9a90c 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/IUserMetadataProvider.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/IUserMetadataProvider.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/InteractiveChessBoard.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/InteractiveChessBoard.kt index 8326d778a..c91613b26 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/InteractiveChessBoard.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/InteractiveChessBoard.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/LiveChessGame.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/LiveChessGame.kt index 08ed60340..977c452b6 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/LiveChessGame.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/LiveChessGame.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -266,15 +266,25 @@ fun LiveChessGameScreen( // Show appropriate controls based on game state when { - gameStatus is GameStatus.Finished -> + gameStatus is GameStatus.Finished -> { GameEndInfo( result = (gameStatus as GameStatus.Finished).result, playerColor = gameState.playerColor, isSpectator = isSpectator, ) - gameState.isPendingChallenge -> PendingChallengeInfo() - isSpectator -> SpectatorInfo() - else -> GameControls(onResign = onResign) + } + + gameState.isPendingChallenge -> { + PendingChallengeInfo() + } + + isSpectator -> { + SpectatorInfo() + } + + else -> { + GameControls(onResign = onResign) + } } } } @@ -422,6 +432,7 @@ private fun GameInfoHeader( color = MaterialTheme.colorScheme.onSurfaceVariant, ) } + isSpectator -> { Text( text = "Spectating", @@ -437,6 +448,7 @@ private fun GameInfoHeader( color = MaterialTheme.colorScheme.onSurfaceVariant, ) } + else -> { Text( text = "vs $opponentName", @@ -456,17 +468,26 @@ private fun GameInfoHeader( val resultText = when { result == GameResult.DRAW -> "Draw" + (result == GameResult.WHITE_WINS && playerColor == Color.WHITE) || (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> "You won!" + else -> "You lost" } val resultColor = when { - result == GameResult.DRAW -> MaterialTheme.colorScheme.secondary + result == GameResult.DRAW -> { + MaterialTheme.colorScheme.secondary + } + (result == GameResult.WHITE_WINS && playerColor == Color.WHITE) || - (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> + (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> { ComposeColor(0xFF4CAF50) - else -> MaterialTheme.colorScheme.error + } + + else -> { + MaterialTheme.colorScheme.error + } } Text( text = resultText, @@ -475,6 +496,7 @@ private fun GameInfoHeader( fontWeight = FontWeight.Bold, ) } + else -> { val turnText = if (currentTurn == playerColor) { @@ -685,27 +707,33 @@ private fun GameEndOverlay( } Quadruple("", "Game Over", winnerText, MaterialTheme.colorScheme.surfaceVariant) } - playerWon -> + + playerWon -> { Quadruple( "", "Victory!", "Congratulations!", ComposeColor(0xFF4CAF50).copy(alpha = 0.95f), ) - isDraw -> + } + + isDraw -> { Quadruple( "", "Draw", "Game ended in a draw", MaterialTheme.colorScheme.surfaceVariant, ) - else -> + } + + else -> { Quadruple( "", "Defeat", "Better luck next time!", ComposeColor(0xFFE57373).copy(alpha = 0.95f), ) + } } // Animated visibility @@ -828,27 +856,47 @@ private fun GameEndInfo( ) { val resultText = when { - isSpectator -> + isSpectator -> { when (result) { GameResult.WHITE_WINS -> "White wins" GameResult.BLACK_WINS -> "Black wins" GameResult.DRAW -> "Draw" GameResult.IN_PROGRESS -> "In progress" } - result == GameResult.DRAW -> "Game drawn" + } + + result == GameResult.DRAW -> { + "Game drawn" + } + (result == GameResult.WHITE_WINS && playerColor == Color.WHITE) || - (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> "You won!" - else -> "You lost" + (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> { + "You won!" + } + + else -> { + "You lost" + } } val backgroundColor = when { - isSpectator -> MaterialTheme.colorScheme.surfaceVariant - result == GameResult.DRAW -> MaterialTheme.colorScheme.secondaryContainer + isSpectator -> { + MaterialTheme.colorScheme.surfaceVariant + } + + result == GameResult.DRAW -> { + MaterialTheme.colorScheme.secondaryContainer + } + (result == GameResult.WHITE_WINS && playerColor == Color.WHITE) || - (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> + (result == GameResult.BLACK_WINS && playerColor == Color.BLACK) -> { ComposeColor(0xFF4CAF50).copy(alpha = 0.3f) - else -> MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.5f) + } + + else -> { + MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.5f) + } } Box( diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/MoveNavigator.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/MoveNavigator.kt index 8fd4a6de5..f9a1b51c3 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/MoveNavigator.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/MoveNavigator.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/PGNMetadata.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/PGNMetadata.kt index 398f8657a..16441b52d 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/PGNMetadata.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/PGNMetadata.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessFilterBuilder.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessFilterBuilder.kt index 603e50321..90ff1070e 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessFilterBuilder.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessFilterBuilder.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionController.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionController.kt index e5de7c850..4539e42a2 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionController.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionController.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionState.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionState.kt index 623dbe7a6..27c43f37c 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionState.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessSubscriptionState.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessTimeWindows.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessTimeWindows.kt index 35b4c2548..85267bfff 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessTimeWindows.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/subscription/ChessTimeWindows.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/data/UserMetadataCache.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/data/UserMetadataCache.kt index df93422ec..ac0c4b47f 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/data/UserMetadataCache.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/data/UserMetadataCache.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastBanner.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastBanner.kt index ab2932f14..3009fd10b 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastBanner.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastBanner.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastStatus.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastStatus.kt index 58bb239e9..c5906088d 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastStatus.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/profile/ProfileBroadcastStatus.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt b/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt index 8c3332230..ac6e7d896 100644 --- a/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt +++ b/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -67,21 +67,19 @@ class ChessEventBroadcaster( val targetRelays = ChessConfig.CHESS_RELAYS.map { NormalizedRelayUrl(it) }.toSet() val subId = newSubId() - println("[ChessEventBroadcaster] Broadcasting event ${event.id.take(8)} to ${targetRelays.size} relays") - // Step 1: Check which relays are already connected val initialConnected = client.connectedRelaysFlow().value val alreadyConnected = targetRelays.intersect(initialConnected) val needsConnection = targetRelays - alreadyConnected - println("[ChessEventBroadcaster] Already connected: ${alreadyConnected.size}, needs connection: ${needsConnection.size}") - // Step 2: If some relays need connection, open a subscription to trigger it if (needsConnection.isNotEmpty()) { + // Use a valid filter with recent since timestamp to trigger connection + // without expecting real results val dummyFilter = Filter( kinds = listOf(JesterProtocol.KIND), - ids = listOf("trigger_connection_${System.currentTimeMillis()}"), + since = (System.currentTimeMillis() / 1000) + 3600, // 1 hour in future = no results limit = 1, ) @@ -97,9 +95,7 @@ class ChessEventBroadcaster( override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, - ) { - println("[ChessEventBroadcaster] EOSE from ${relay.url}") - } + ) { } } // Open subscription to all target relays (triggers connection) @@ -107,23 +103,21 @@ class ChessEventBroadcaster( client.openReqSubscription(subId, filterMap, listener) // Wait for relays to connect (poll with timeout) - val connected = waitForRelays(targetRelays, 5000L) - println("[ChessEventBroadcaster] After waiting: ${connected.size}/${targetRelays.size} connected") + waitForRelays(targetRelays, 5000L) // Close the dummy subscription client.close(subId) } // Step 3: Send the event and wait for OK responses - println("[ChessEventBroadcaster] Sending event with sendAndWaitForResponse...") val success = client.sendAndWaitForResponse(event, targetRelays, timeoutSeconds) - println("[ChessEventBroadcaster] Broadcast complete: success=$success") - + // Note: sendAndWaitForResponse only returns aggregate success (any relay accepted) + // We don't have per-relay results, so relayResults is empty return BroadcastResult( success = success, - relayResults = targetRelays.associateWith { success }, - message = if (success) "Event accepted by relay(s)" else "No relay accepted the event", + relayResults = emptyMap(), + message = if (success) "Event accepted by at least one relay" else "No relay accepted the event", ) } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt index 0e3150d8c..537cdd2f5 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessAdapter.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessAdapter.kt index 7774a57e3..f80a3f6a6 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessAdapter.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessAdapter.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessEventCache.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessEventCache.kt index 34009233a..c779afebd 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessEventCache.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessEventCache.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessViewModelNew.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessViewModelNew.kt index 7ae6555c3..895aed70a 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessViewModelNew.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/DesktopChessViewModelNew.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt index 967446d56..81d9bbde2 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -104,10 +104,7 @@ class DesktopChessSubscriptionController( ) { // Add chess events to local cache for persistence if (event.kind in CHESS_EVENT_KINDS) { - val isNew = DesktopChessEventCache.add(event) - if (isNew) { - println("[ChessSubscription] Cached new event: kind=${event.kind}, id=${event.id.take(8)}") - } + DesktopChessEventCache.add(event) } onEvent(event, isLive, relay, forFilters) } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt index 6c8a9b503..704a8f03a 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt @@ -201,21 +201,25 @@ fun UserProfileScreen( relays = configuredRelays, pubKeyHex = pubKeyHex, onEvent = { event, _, _, _ -> - try { - val content = event.content - displayName = extractJsonField(content, "display_name") ?: extractJsonField(content, "name") - about = extractJsonField(content, "about") - picture = extractJsonField(content, "picture") - - // Store MetadataEvent for editing (only for own profile) - if (isOwnProfile && event is MetadataEvent) { - val current = latestMetadataEvent - if (current == null || event.createdAt > current.createdAt) { - latestMetadataEvent = event + if (event is MetadataEvent) { + try { + val metadata = event.contactMetaData() + if (metadata != null) { + displayName = metadata.displayName ?: metadata.name + about = metadata.about + picture = metadata.picture } + + // Store MetadataEvent for editing (only for own profile) + if (isOwnProfile) { + val current = latestMetadataEvent + if (current == null || event.createdAt > current.createdAt) { + latestMetadataEvent = event + } + } + } catch (e: Exception) { + // Ignore parse errors } - } catch (e: Exception) { - // Ignore parse errors } }, ) @@ -688,17 +692,6 @@ fun UserProfileScreen( } } -/** - * Simple JSON field extractor (not production-ready, just for demo). - */ -private fun extractJsonField( - json: String, - field: String, -): String? { - val regex = """"$field"\s*:\s*"([^"]*)"""".toRegex() - return regex.find(json)?.groupValues?.get(1) -} - /** * Follows a user by publishing an updated contact list event. */ diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.kt index b0d07c4ff..0ae8c39d4 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGame.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGame.kt index cea81c573..083ab167a 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGame.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGame.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEvent.kt index b0d89cea0..664c60b0b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEvent.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameNameGenerator.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameNameGenerator.kt index 959e9e903..4a36d1bf1 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameNameGenerator.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameNameGenerator.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessMove.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessMove.kt index ed2e0f9c7..e715719d5 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessMove.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessMove.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessPosition.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessPosition.kt index e590a73e8..9f92fddbf 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessPosition.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessPosition.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -177,13 +177,19 @@ data class ChessPosition( if (other !is ChessPosition) return false return board.contentDeepEquals(other.board) && activeColor == other.activeColor && - moveNumber == other.moveNumber + moveNumber == other.moveNumber && + castlingRights == other.castlingRights && + enPassantSquare == other.enPassantSquare && + halfMoveClock == other.halfMoveClock } override fun hashCode(): Int { var result = board.contentDeepHashCode() result = 31 * result + activeColor.hashCode() result = 31 * result + moveNumber + result = 31 * result + castlingRights.hashCode() + result = 31 * result + (enPassantSquare?.hashCode() ?: 0) + result = 31 * result + halfMoveClock return result } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructor.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructor.kt index b59e8e2a6..65849aa77 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructor.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructor.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -155,14 +155,21 @@ object ChessStateReconstructor { val result = parseGameResult(gameResult) GameStatus.Finished(result) } + engine.isCheckmate() -> { val winner = engine.getSideToMove().opposite() GameStatus.Finished( if (winner == Color.WHITE) GameResult.WHITE_WINS else GameResult.BLACK_WINS, ) } - engine.isStalemate() -> GameStatus.Finished(GameResult.DRAW) - else -> GameStatus.InProgress + + engine.isStalemate() -> { + GameStatus.Finished(GameResult.DRAW) + } + + else -> { + GameStatus.InProgress + } } // Get the head event ID (for linking next move) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEvents.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEvents.kt index f4f510793..32ec8c390 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEvents.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEvents.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessEvents.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessEvents.kt index 13ab21098..0c2119a51 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessEvents.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessEvents.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameEvents.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameEvents.kt index cbbd8e796..4381f832c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameEvents.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameEvents.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameState.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameState.kt index f7c44e620..7e0daed77 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameState.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/LiveChessGameState.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -464,6 +464,7 @@ class LiveChessGameState( _gameStatus.value = GameStatus.Finished(GameResult.getResultForWinner(winner)) // In a real implementation, you'd publish GameEnd event here } + engine.isStalemate() -> { _gameStatus.value = GameStatus.Finished(GameResult.DRAW) // In a real implementation, you'd publish GameEnd event here diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParser.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParser.kt index 9394f5768..e9793b405 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParser.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParser.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -258,11 +258,13 @@ object PGNParser { val kingSide = move.toSquare.contains("g") current.makeCastlingMove(kingSide) } + move.fromSquare != null -> { // Move with disambiguation (we can infer full source) // For now, just use simplified move makeSimplifiedMove(current, move) } + else -> { // Regular move makeSimplifiedMove(current, move) diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEventTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEventTest.kt index 25e104f12..e470989d5 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEventTest.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessGameEventTest.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEventTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEventTest.kt index a293e1e30..1c96c2e92 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEventTest.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/JesterEventTest.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParserTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParserTest.kt index 7e2fc0ad8..fb1d55ded 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParserTest.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip64Chess/PGNParserTest.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.jvmAndroid.kt b/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.jvmAndroid.kt index 831a694fb..42f5dd891 100644 --- a/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.jvmAndroid.kt +++ b/quartz/src/jvmAndroid/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessEngine.jvmAndroid.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -231,8 +231,14 @@ actual class ChessEngine { val sameFile = ambiguous.any { it.from.file == fromSquare.file } val sameRank = ambiguous.any { it.from.rank == fromSquare.rank } when { - !sameFile -> sb.append(fileChar(fromSquare)) - !sameRank -> sb.append(rankChar(fromSquare)) + !sameFile -> { + sb.append(fileChar(fromSquare)) + } + + !sameRank -> { + sb.append(rankChar(fromSquare)) + } + else -> { sb.append(fileChar(fromSquare)) sb.append(rankChar(fromSquare)) diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructorTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructorTest.kt index 3cacf93c0..2b2e0326f 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructorTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip64Chess/ChessStateReconstructorTest.kt @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2025 Vitor Pamplona * * Permission is hereby granted, free of charge, to any person obtaining a copy of