Traverse generations to send messages

This commit is contained in:
Kgothatso Ngako
2026-07-08 11:14:44 +02:00
parent 916bf9e77a
commit a6f98fec36
3 changed files with 37 additions and 8 deletions

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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(