From 942913fb6d8f13938735cc181b864319c68b5537 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 6 Jul 2025 21:58:07 +0200 Subject: [PATCH] Add debugging logs for delivery confirmation - Track message IDs through the delivery process - Log ACK generation and processing - Log status updates in ChatViewModel - Log read receipt generation and sending --- bitchat/Services/DeliveryTracker.swift | 12 ++++++- bitchat/ViewModels/ChatViewModel.swift | 50 +++++++++++++++++--------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/bitchat/Services/DeliveryTracker.swift b/bitchat/Services/DeliveryTracker.swift index ca87e691..8fba2ad6 100644 --- a/bitchat/Services/DeliveryTracker.swift +++ b/bitchat/Services/DeliveryTracker.swift @@ -71,6 +71,8 @@ class DeliveryTracker { // Don't track broadcasts or certain message types guard message.isPrivate || message.room != nil else { return } + print("[DeliveryTracker] Tracking message \(message.id) to \(recipientNickname)") + let delivery = PendingDelivery( messageID: message.id, sentAt: Date(), @@ -101,13 +103,19 @@ class DeliveryTracker { pendingLock.lock() defer { pendingLock.unlock() } + print("[DeliveryTracker] Processing ACK for message \(ack.originalMessageID) from \(ack.recipientNickname)") + // Prevent duplicate ACK processing - guard !receivedAckIDs.contains(ack.ackID) else { return } + guard !receivedAckIDs.contains(ack.ackID) else { + print("[DeliveryTracker] Already processed ACK \(ack.ackID)") + return + } receivedAckIDs.insert(ack.ackID) // Find the pending delivery guard var delivery = pendingDeliveries[ack.originalMessageID] else { // Message might have already been delivered or timed out + print("[DeliveryTracker] No pending delivery found for message \(ack.originalMessageID)") return } @@ -148,6 +156,8 @@ class DeliveryTracker { guard !sentAckIDs.contains(message.id) else { return nil } sentAckIDs.insert(message.id) + print("[DeliveryTracker] Generating ACK for message \(message.id) from \(message.sender)") + return DeliveryAck( originalMessageID: message.id, recipientID: myPeerID, diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index ee66dc02..631687d9 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -902,15 +902,26 @@ class ChatViewModel: ObservableObject { for message in messages { // Only send read receipts for messages from the other peer (not our own) // and only if the status is delivered (not already read) - if message.senderPeerID == peerID, - case .delivered = message.deliveryStatus { - // Create and send read receipt - let receipt = ReadReceipt( - originalMessageID: message.id, - readerID: meshService.myPeerID, - readerNickname: nickname - ) - meshService.sendReadReceipt(receipt, to: peerID) + if message.senderPeerID == peerID { + if let status = message.deliveryStatus { + switch status { + case .delivered: + // Create and send read receipt + let receipt = ReadReceipt( + originalMessageID: message.id, + readerID: meshService.myPeerID, + readerNickname: nickname + ) + meshService.sendReadReceipt(receipt, to: peerID) + print("[Delivery] Sending read receipt for message \(message.id)") + case .read: + // Already read, no need to send another receipt + break + default: + // Message not yet delivered, can't mark as read + break + } + } } } } @@ -1779,14 +1790,13 @@ extension ChatViewModel: BitchatDelegate { unreadPrivateMessages.remove(peerID) // Send read receipt immediately since we're viewing the chat - if message.deliveryStatus != nil { - let receipt = ReadReceipt( - originalMessageID: message.id, - readerID: meshService.myPeerID, - readerNickname: nickname - ) - meshService.sendReadReceipt(receipt, to: peerID) - } + let receipt = ReadReceipt( + originalMessageID: message.id, + readerID: meshService.myPeerID, + readerNickname: nickname + ) + meshService.sendReadReceipt(receipt, to: peerID) + print("[Delivery] Sending immediate read receipt for message \(message.id) from \(message.sender)") } } else if message.sender == nickname { // Our own message that was echoed back - ignore it since we already added it locally @@ -2080,11 +2090,13 @@ extension ChatViewModel: BitchatDelegate { func didReceiveDeliveryAck(_ ack: DeliveryAck) { // Find the message and update its delivery status + print("[Delivery] Received ACK for message \(ack.originalMessageID) from \(ack.recipientNickname)") updateMessageDeliveryStatus(ack.originalMessageID, status: .delivered(to: ack.recipientNickname, at: ack.timestamp)) } func didReceiveReadReceipt(_ receipt: ReadReceipt) { // Find the message and update its read status + print("[Delivery] Received READ receipt for message \(receipt.originalMessageID) from \(receipt.readerNickname)") updateMessageDeliveryStatus(receipt.originalMessageID, status: .read(by: receipt.readerNickname, at: receipt.timestamp)) } @@ -2093,11 +2105,14 @@ extension ChatViewModel: BitchatDelegate { } private func updateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) { + print("[Delivery] Updating message \(messageID) to status: \(status)") + // Update in main messages if let index = messages.firstIndex(where: { $0.id == messageID }) { var updatedMessage = messages[index] updatedMessage.deliveryStatus = status messages[index] = updatedMessage + print("[Delivery] Updated message in main messages") } // Update in private chats @@ -2107,6 +2122,7 @@ extension ChatViewModel: BitchatDelegate { updatedMessage.deliveryStatus = status chatMessages[index] = updatedMessage privateChats[peerID] = chatMessages + print("[Delivery] Updated message in private chat with \(peerID)") } }