From 9264e95af0584abce1e5cfa8352c15b8f8c22964 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Mon, 18 May 2026 23:24:35 +0200 Subject: [PATCH] Log the giftwraps --- .../compose/database/dao/NostrDao.kt | 67 ++++++++++--------- .../compose/database/model/GiftWrapMessage.kt | 9 +++ .../compose/database/model/GiftWrapSeal.kt | 9 +++ 3 files changed, 54 insertions(+), 31 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/NostrDao.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/NostrDao.kt index ace670a9..5014d079 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/NostrDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/dao/NostrDao.kt @@ -181,7 +181,7 @@ abstract class NostrDao( profilePublicKeysToSync[relayURL]?.add(nostrEvent.pubKey) } } else { - logger.w("We somehow have an unsignedNostrEvent: $nostrEvent") + logger.w("We somehow have an unsignedNostrEvent/giftwrap event: $nostrEvent") } // Index reposts first because they have the contained posts... @@ -322,6 +322,7 @@ abstract class NostrDao( } nostrEvent.toGiftWrapMessageWithReceiverPTag()?.let { giftWrapMessage -> + logger.d("giftWrapMessage: $giftWrapMessage") val giftWrapReceiverProfile = database.profileDao().getProfileByPublicKey(giftWrapMessage.receiverPublicKey) if (giftWrapReceiverProfile == null) { @@ -369,46 +370,50 @@ abstract class NostrDao( giftWrapSeal.decryptGiftWrapPayload( activeUserPrivateKey )?.let { giftWrapPayload -> - database.giftWrapUnsignedDao().upsert( giftWrapPayload ) - val chatRoomId = Musig2.aggregateKeys( - giftWrapPayload.receiverPublicKeys() - ).value.toHex() - // Process chatMessage and chatRoom stuff... - // Find or create chatRoom - val chatRoom = database.chatRoomDao().findChatRoomById( - chatRoomId - ) + val receiverPublicKeys = giftWrapPayload.receiverPublicKeys() + logger.d("receiverPublicKeys: $receiverPublicKeys") - if (chatRoom == null) { - database.chatRoomDao().upsert( - ChatRoom( - id = chatRoomId, - userPublicKey = SeedManager.activeKeyPair().pubKey.toHex(), - subject = null, // TODO: Get subject from tags... + if (receiverPublicKeys.isNotEmpty()) { + val chatRoomId = Musig2.aggregateKeys( + giftWrapPayload.receiverPublicKeys() + ).value.toHex() + // Process chatMessage and chatRoom stuff... + // Find or create chatRoom + val chatRoom = database.chatRoomDao().findChatRoomById( + chatRoomId + ) + + if (chatRoom == null) { + database.chatRoomDao().upsert( + ChatRoom( + id = chatRoomId, + userPublicKey = SeedManager.activeKeyPair().pubKey.toHex(), + subject = null, // TODO: Get subject from tags... + createdAt = giftWrapPayload.createdAt, + initialGiftWrapUnsignedId = giftWrapPayload.id + ) + ) + } else { + // TODO: Update subject from tags... + } + + // Save chatMessage + database.chatMessageDao().upsert( + ChatMessage( + id = giftWrapPayload.id, + senderPublicKey = giftWrapPayload.publicKey, + isUserMessage = SeedManager.activePublicKey().toHex() == giftWrapPayload.publicKey, + chatRoomId = chatRoomId, createdAt = giftWrapPayload.createdAt, - initialGiftWrapUnsignedId = giftWrapPayload.id + content = giftWrapPayload.content, ) ) - } else { - // TODO: Update subject from tags... } - // Save chatMessage - database.chatMessageDao().upsert( - ChatMessage( - id = giftWrapPayload.id, - senderPublicKey = giftWrapPayload.publicKey, - isUserMessage = SeedManager.activePublicKey().toHex() == giftWrapPayload.publicKey, - chatRoomId = chatRoomId, - createdAt = giftWrapPayload.createdAt, - content = giftWrapPayload.content, - ) - ) - } } } diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapMessage.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapMessage.kt index fd1fb340..17939214 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapMessage.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapMessage.kt @@ -5,9 +5,12 @@ import ac.cord.auxiliary.compose.database.model.traits.NostrEventEntity import ac.cord.auxiliary.compose.database.model.traits.SoftDeletableEntity import ac.cord.auxiliary.compose.database.model.traits.TimestampedEntity import ac.cord.auxiliary.compose.database.model.traits.UserViewableEntity +import ac.cord.auxiliary.compose.network.serialization.encodeToJsonString import androidx.room3.Entity import androidx.room3.ForeignKey +import androidx.room3.Ignore import androidx.room3.PrimaryKey +import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Kind import com.vitorpamplona.quartz.nip01Core.core.TagArray @@ -80,6 +83,9 @@ data class GiftWrapMessage( override val deletedAt: Instant? = null, // Who this message should be seen by (used to derive conversationId) ): NostrEventEntity, TimestampedEntity, LocalStoreEntity, UserViewableEntity, SoftDeletableEntity { + @Ignore + private val logger = Logger.withTag("GiftWrapMessage") + suspend fun decryptGiftWrapSeal( privateKey: ByteArray ): GiftWrapSeal? { @@ -97,6 +103,7 @@ data class GiftWrapMessage( content = content, sig = signature ) + logger.d("giftWrapEvent: ${giftWrapEvent.toJson()}") val nostrSigner = NostrSignerInternal( keyPair = KeyPair(privKey = privateKey) @@ -105,6 +112,8 @@ data class GiftWrapMessage( giftWrapEvent.unwrapOrNull( nostrSigner )?.let { giftWrapSeal -> + + logger.d("giftWrapSeal: ${giftWrapSeal.toJson()}") return GiftWrapSeal( id = giftWrapSeal.id, publicKey = giftWrapSeal.pubKey, diff --git a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapSeal.kt b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapSeal.kt index bfe95913..d6175cf9 100644 --- a/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapSeal.kt +++ b/composeApp/src/commonMain/kotlin/ac/cord/auxiliary/compose/database/model/GiftWrapSeal.kt @@ -4,9 +4,12 @@ import ac.cord.auxiliary.compose.database.model.traits.LocalStoreEntity import ac.cord.auxiliary.compose.database.model.traits.SoftDeletableEntity import ac.cord.auxiliary.compose.database.model.traits.TimestampedEntity import ac.cord.auxiliary.compose.database.model.traits.UserViewableEntity +import ac.cord.auxiliary.compose.network.serialization.encodeToJsonString import androidx.room3.Entity import androidx.room3.ForeignKey +import androidx.room3.Ignore import androidx.room3.PrimaryKey +import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Kind import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair @@ -66,6 +69,9 @@ data class GiftWrapSeal( override val deletedAt: Instant? = null, // Who this message should be seen by (used to derive conversationId) ): TimestampedEntity, LocalStoreEntity, UserViewableEntity, SoftDeletableEntity { + @Ignore + private val logger = Logger.withTag("GiftWrapMessage") + suspend fun decryptGiftWrapPayload( privateKey: ByteArray ): GiftWrapPayload? { @@ -78,6 +84,7 @@ data class GiftWrapSeal( content = content, sig = signature ) + logger.d("sealedRumorEvent: ${sealedRumorEvent.toJson()}") val nostrSigner = NostrSignerInternal( keyPair = KeyPair(privKey = privateKey) @@ -86,6 +93,8 @@ data class GiftWrapSeal( sealedRumorEvent.unsealOrNull( nostrSigner )?.let { giftWrapPayload -> + logger.d("giftWrapPayload: ${giftWrapPayload.toJson()}") + return GiftWrapPayload( id = giftWrapPayload.id, publicKey = giftWrapPayload.pubKey,