From a6f98fec365b5dd6104944297c86cbadceef8726 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Wed, 8 Jul 2026 11:14:44 +0200 Subject: [PATCH] Traverse generations to send messages --- .../compose/database/dao/ChatMessageDao.kt | 3 ++ .../torch/compose/database/model/ChatRoom.kt | 28 +++++++++++++++++++ .../repository/DatabaseMarmotRepository.kt | 14 ++++------ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatMessageDao.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatMessageDao.kt index 4490e849..3e06eb61 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatMessageDao.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/database/dao/ChatMessageDao.kt @@ -24,6 +24,9 @@ interface ChatMessageDao { @Query("SELECT * FROM ChatMessage WHERE marmotInnerEventId = :marmotInnerEventId ORDER BY createdAt DESC") fun getChatMessagesByMarmotInnerEventId(marmotInnerEventId: HexKey): ChatMessage? + @Query("SELECT COUNT(*) FROM ChatMessage WHERE chatRoomId = :chatRoomId AND senderPublicKey = :senderPublicKey") + fun countChatMessagesBySenderPublicKey(chatRoomId: HexKey, senderPublicKey: HexKey): Int + @Upsert suspend fun upsert(chatMessage: at.torch.compose.database.model.ChatMessage): Long } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/database/model/ChatRoom.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/database/model/ChatRoom.kt index 800fcf36..f85f9e39 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/database/model/ChatRoom.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/database/model/ChatRoom.kt @@ -9,6 +9,11 @@ import at.torch.compose.database.model.traits.SoftDeletableEntity import at.torch.compose.database.model.traits.TimestampedEntity import at.torch.compose.database.model.traits.UserViewableEntity import co.touchlab.kermit.Logger +import com.vitorpamplona.quartz.marmot.mls.codec.TlsReader +import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup +import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState +import com.vitorpamplona.quartz.marmot.mls.schedule.SecretTree +import com.vitorpamplona.quartz.marmot.mls.tree.RatchetTree import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray import fr.acinq.bitcoin.PrivateKey @@ -120,5 +125,28 @@ data class ChatRoom( return chatRoomXOnlyPublicKey.publicKey.toHex() } + + } + + fun toMlsGroup(sentGenerations: Int): MlsGroup? { + return mlsGroupState?.let { + val mlsGroup = MlsGroup.restore( + MlsGroupState.decodeTls( + mlsGroupState.hexToByteArray() + ) + ) + + logger.i("${userPublicKey} sent $sentGenerations messsages in ${id}") + mlsGroup.traverseGenerations(sentGenerations) + + mlsGroup + } + } +} + +private fun MlsGroup.traverseGenerations(generations: Int) { + val plainByteArray = ByteArray(0) + for (index in 0 until generations) { + encrypt(plainByteArray) } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/database/repository/DatabaseMarmotRepository.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/database/repository/DatabaseMarmotRepository.kt index e6a7f3d5..46afbd2b 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/database/repository/DatabaseMarmotRepository.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/database/repository/DatabaseMarmotRepository.kt @@ -15,8 +15,6 @@ import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageUtils import com.vitorpamplona.quartz.marmot.mls.crypto.Ed25519 import com.vitorpamplona.quartz.marmot.mls.crypto.MlsCryptoProvider import com.vitorpamplona.quartz.marmot.mls.crypto.X25519 -import com.vitorpamplona.quartz.marmot.mls.group.MlsGroup -import com.vitorpamplona.quartz.marmot.mls.group.MlsGroupState import com.vitorpamplona.quartz.marmot.mls.messages.KeyPackageBundle import com.vitorpamplona.quartz.marmot.mls.messages.MlsKeyPackage import com.vitorpamplona.quartz.marmot.mls.tree.Capabilities @@ -110,12 +108,12 @@ class DatabaseMarmotRepository( nostrSignerSync: NostrSignerSync ) { database.chatRoomDao().findChatRoomById(marmotInnerEvent.chatRoomId)?.let { localChatRoom -> - localChatRoom.chatRoom.mlsGroupState?.let { - val mlsGroup = MlsGroup.restore( - MlsGroupState.decodeTls( - localChatRoom.chatRoom.mlsGroupState.hexToByteArray() - ) - ) + val sentGenerations: Int = database.chatMessageDao().countChatMessagesBySenderPublicKey( + chatRoomId = localChatRoom.chatRoom.id, + senderPublicKey = nostrSignerSync.pubKey + ) + + localChatRoom.chatRoom.toMlsGroup(sentGenerations)?.let { mlsGroup -> logger.d("mlsGroup: $mlsGroup") val groupEvent = database.marmotOutboundDao().encryptAndSendMarmotInnerEvent(