mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 10:45:20 +00:00
Nostr DMs: ensure delivered/read acks are sent even without Noise key mapping by falling back to direct Nostr (geohash-style) acks to sender pubkey
This commit is contained in:
@@ -4480,10 +4480,18 @@ class ChatViewModel: ObservableObject, BitchatDelegate {
|
|||||||
privateChatManager.sanitizeChat(for: ephemeralPeerID)
|
privateChatManager.sanitizeChat(for: ephemeralPeerID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send delivery ack via Nostr embedded if not previously read and we know sender's Noise key
|
// Send delivery ack via Nostr embedded
|
||||||
if !wasReadBefore, let key = actualSenderNoiseKey {
|
if !wasReadBefore {
|
||||||
SecureLogger.log("Sending DELIVERED ack for \(messageId.prefix(8))… via router", category: SecureLogger.session, level: .debug)
|
if let key = actualSenderNoiseKey {
|
||||||
messageRouter.sendDeliveryAck(messageId, to: key.hexEncodedString())
|
SecureLogger.log("Sending DELIVERED ack for \(messageId.prefix(8))… via router", category: SecureLogger.session, level: .debug)
|
||||||
|
messageRouter.sendDeliveryAck(messageId, to: key.hexEncodedString())
|
||||||
|
} else if let id = try? NostrIdentityBridge.getCurrentNostrIdentity() {
|
||||||
|
// Fallback: no Noise mapping yet — send directly to sender's Nostr pubkey
|
||||||
|
let nt = NostrTransport()
|
||||||
|
nt.senderPeerID = meshService.myPeerID
|
||||||
|
nt.sendDeliveryAckGeohash(for: messageId, toRecipientHex: senderPubkey, from: id)
|
||||||
|
SecureLogger.log("Sent DELIVERED ack directly to Nostr pub=\(senderPubkey.prefix(8))… for mid=\(messageId.prefix(8))…", category: SecureLogger.session, level: .debug)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if wasReadBefore {
|
if wasReadBefore {
|
||||||
@@ -4494,11 +4502,19 @@ class ChatViewModel: ObservableObject, BitchatDelegate {
|
|||||||
let ephemeralPeerID = unifiedPeerService.peers.first(where: { $0.noisePublicKey == key })?.id {
|
let ephemeralPeerID = unifiedPeerService.peers.first(where: { $0.noisePublicKey == key })?.id {
|
||||||
unreadPrivateMessages.remove(ephemeralPeerID)
|
unreadPrivateMessages.remove(ephemeralPeerID)
|
||||||
}
|
}
|
||||||
if !sentReadReceipts.contains(messageId), let key = actualSenderNoiseKey {
|
if !sentReadReceipts.contains(messageId) {
|
||||||
let receipt = ReadReceipt(originalMessageID: messageId, readerID: meshService.myPeerID, readerNickname: nickname)
|
if let key = actualSenderNoiseKey {
|
||||||
SecureLogger.log("Viewing chat; sending READ ack for \(messageId.prefix(8))… via router", category: SecureLogger.session, level: .debug)
|
let receipt = ReadReceipt(originalMessageID: messageId, readerID: meshService.myPeerID, readerNickname: nickname)
|
||||||
messageRouter.sendReadReceipt(receipt, to: key.hexEncodedString())
|
SecureLogger.log("Viewing chat; sending READ ack for \(messageId.prefix(8))… via router", category: SecureLogger.session, level: .debug)
|
||||||
sentReadReceipts.insert(messageId)
|
messageRouter.sendReadReceipt(receipt, to: key.hexEncodedString())
|
||||||
|
sentReadReceipts.insert(messageId)
|
||||||
|
} else if let id = try? NostrIdentityBridge.getCurrentNostrIdentity() {
|
||||||
|
let nt = NostrTransport()
|
||||||
|
nt.senderPeerID = meshService.myPeerID
|
||||||
|
nt.sendReadReceiptGeohash(messageId, toRecipientHex: senderPubkey, from: id)
|
||||||
|
sentReadReceipts.insert(messageId)
|
||||||
|
SecureLogger.log("Viewing chat; sent READ ack directly to Nostr pub=\(senderPubkey.prefix(8))… for mid=\(messageId.prefix(8))…", category: SecureLogger.session, level: .debug)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if shouldMarkAsUnread {
|
if shouldMarkAsUnread {
|
||||||
|
|||||||
Reference in New Issue
Block a user