add get user messages

This commit is contained in:
2026-05-02 18:03:12 +07:00
parent 439391ff6e
commit 77f4ea71b1
2 changed files with 44 additions and 1 deletions

View File

@@ -30,6 +30,7 @@ import rust.nostr.sdk.Tag
import rust.nostr.sdk.Timestamp
import rust.nostr.sdk.UnsignedEvent
import rust.nostr.sdk.UnwrappedGift
import rust.nostr.sdk.extractMessagingRelayList
class Nostr {
var client: Client? = null
@@ -88,6 +89,14 @@ class Nostr {
getUserMetadata()
}
suspend fun isSignedByUser(event: Event): Boolean {
return try {
signer?.getPublicKey()?.toBech32() == event.author().toBech32()
} catch (e: Exception) {
false
}
}
suspend fun getUserMetadata() {
val userPubkey = signer?.getPublicKey() ?: return
@@ -110,9 +119,34 @@ class Nostr {
client?.subscribe(target = target, id = "user-metadata", closeOn = opts)
}
suspend fun getUserMessages(msgRelayList: Event) {
val userPubkey = signer?.getPublicKey() ?: return
val relays = extractMessagingRelayList(msgRelayList)
// Ensure relay connections
relays.forEach { relay ->
client?.addRelay(relay, RelayCapabilities.none())
client?.connectRelay(relay)
}
// Construct a filter for gift wrap events
val filter = Filter().kind(Kind.fromStd(KindStandard.GIFT_WRAP)).pubkey(userPubkey)
val target = mutableMapOf<RelayUrl, List<Filter>>()
relays.forEach { relay ->
target[relay] = listOf(filter)
}
client?.subscribe(
target = ReqTarget.manual(target),
id = "user-messages",
closeOn = null
)
}
suspend fun handleNotifications(onMetadataUpdate: (PublicKey, Metadata) -> Unit) {
val now = Timestamp.now()
val notifications = client?.notifications()
val processedEvent = mutableSetOf<EventId>()
while (true) {
val notification = notifications?.next() ?: break
@@ -126,6 +160,9 @@ class Nostr {
is RelayMessageEnum.EventMsg -> {
val event = message.event
// Prevent processing duplicate events
if (processedEvent.contains(event.id())) continue
processedEvent.add(event.id())
if (event.kind().asStd() == KindStandard.METADATA) {
try {
@@ -136,6 +173,12 @@ class Nostr {
}
}
if (event.kind().asStd() == KindStandard.INBOX_RELAYS) {
if (isSignedByUser(event = event)) {
getUserMessages(msgRelayList = event)
}
}
if (event.kind().asStd() == KindStandard.GIFT_WRAP) {
try {
val rumor = extractRumor(event)