Fix read receipts using wrong peer ID

- Read receipts were being sent to the current ephemeral peer ID instead of the message's senderPeerID
- This caused read receipts to be lost when peer IDs changed between sessions
- Now using message.senderPeerID consistently for all read receipt sending
- Added detailed logging to track which peer ID receives the read receipt
This commit is contained in:
jack
2025-07-06 22:30:33 +02:00
parent ab5af1546d
commit 1fec1ee315
2 changed files with 37 additions and 20 deletions
@@ -708,6 +708,7 @@ class BluetoothMeshService: NSObject {
} }
func sendReadReceipt(_ receipt: ReadReceipt, to recipientID: String) { func sendReadReceipt(_ receipt: ReadReceipt, to recipientID: String) {
print("[DeliveryTracker] Sending read receipt for message \(receipt.originalMessageID) to \(recipientID)")
messageQueue.async { [weak self] in messageQueue.async { [weak self] in
guard let self = self else { return } guard let self = self else { return }
@@ -737,6 +738,7 @@ class BluetoothMeshService: NSObject {
ttl: 3 // Limited TTL for receipts ttl: 3 // Limited TTL for receipts
) )
print("[DeliveryTracker] Broadcasting read receipt packet to \(recipientID)")
// Send immediately without delay // Send immediately without delay
self.broadcastPacket(packet) self.broadcastPacket(packet)
} }
+35 -20
View File
@@ -914,13 +914,18 @@ class ChatViewModel: ObservableObject {
switch status { switch status {
case .delivered: case .delivered:
// Create and send read receipt // Create and send read receipt
let receipt = ReadReceipt( // Use the senderPeerID from the message to ensure it goes to the right peer
originalMessageID: message.id, if let messageSenderID = message.senderPeerID {
readerID: meshService.myPeerID, let receipt = ReadReceipt(
readerNickname: nickname originalMessageID: message.id,
) readerID: meshService.myPeerID,
meshService.sendReadReceipt(receipt, to: peerID) readerNickname: nickname
print("[Delivery] Sending read receipt for message \(message.id)") )
meshService.sendReadReceipt(receipt, to: messageSenderID)
print("[Delivery] Sending read receipt for message \(message.id) to peer \(messageSenderID)")
} else {
print("[Delivery] Cannot send read receipt for message \(message.id) - no senderPeerID")
}
case .read: case .read:
// Already read, no need to send another receipt // Already read, no need to send another receipt
print("[Delivery] Message \(message.id) already marked as read") print("[Delivery] Message \(message.id) already marked as read")
@@ -934,12 +939,17 @@ class ChatViewModel: ObservableObject {
// No delivery status - this might be an older message // No delivery status - this might be an older message
// Send read receipt anyway for backwards compatibility // Send read receipt anyway for backwards compatibility
print("[Delivery] Message \(message.id) has no delivery status, sending read receipt anyway") print("[Delivery] Message \(message.id) has no delivery status, sending read receipt anyway")
let receipt = ReadReceipt( if let messageSenderID = message.senderPeerID {
originalMessageID: message.id, let receipt = ReadReceipt(
readerID: meshService.myPeerID, originalMessageID: message.id,
readerNickname: nickname readerID: meshService.myPeerID,
) readerNickname: nickname
meshService.sendReadReceipt(receipt, to: peerID) )
meshService.sendReadReceipt(receipt, to: messageSenderID)
print("[Delivery] Sending read receipt for old message \(message.id) to peer \(messageSenderID)")
} else {
print("[Delivery] Cannot send read receipt for old message \(message.id) - no senderPeerID")
}
} }
} }
} }
@@ -1816,13 +1826,18 @@ extension ChatViewModel: BitchatDelegate {
unreadPrivateMessages.remove(peerID) unreadPrivateMessages.remove(peerID)
// Send read receipt immediately since we're viewing the chat // Send read receipt immediately since we're viewing the chat
let receipt = ReadReceipt( // Use the senderPeerID from the message, not the current peerID
originalMessageID: message.id, if let messageSenderID = message.senderPeerID {
readerID: meshService.myPeerID, let receipt = ReadReceipt(
readerNickname: nickname originalMessageID: message.id,
) readerID: meshService.myPeerID,
meshService.sendReadReceipt(receipt, to: peerID) readerNickname: nickname
print("[Delivery] Sending immediate read receipt for message \(message.id) from \(message.sender)") )
meshService.sendReadReceipt(receipt, to: messageSenderID)
print("[Delivery] Sending immediate read receipt for message \(message.id) from \(message.sender) to peer \(messageSenderID)")
} else {
print("[Delivery] Cannot send read receipt - message has no senderPeerID")
}
} }
} else if message.sender == nickname { } else if message.sender == nickname {
// Our own message that was echoed back - ignore it since we already added it locally // Our own message that was echoed back - ignore it since we already added it locally