mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-27 06:25:22 +00:00
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
This commit is contained in:
@@ -71,6 +71,8 @@ class DeliveryTracker {
|
|||||||
// Don't track broadcasts or certain message types
|
// Don't track broadcasts or certain message types
|
||||||
guard message.isPrivate || message.room != nil else { return }
|
guard message.isPrivate || message.room != nil else { return }
|
||||||
|
|
||||||
|
print("[DeliveryTracker] Tracking message \(message.id) to \(recipientNickname)")
|
||||||
|
|
||||||
let delivery = PendingDelivery(
|
let delivery = PendingDelivery(
|
||||||
messageID: message.id,
|
messageID: message.id,
|
||||||
sentAt: Date(),
|
sentAt: Date(),
|
||||||
@@ -101,13 +103,19 @@ class DeliveryTracker {
|
|||||||
pendingLock.lock()
|
pendingLock.lock()
|
||||||
defer { pendingLock.unlock() }
|
defer { pendingLock.unlock() }
|
||||||
|
|
||||||
|
print("[DeliveryTracker] Processing ACK for message \(ack.originalMessageID) from \(ack.recipientNickname)")
|
||||||
|
|
||||||
// Prevent duplicate ACK processing
|
// 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)
|
receivedAckIDs.insert(ack.ackID)
|
||||||
|
|
||||||
// Find the pending delivery
|
// Find the pending delivery
|
||||||
guard var delivery = pendingDeliveries[ack.originalMessageID] else {
|
guard var delivery = pendingDeliveries[ack.originalMessageID] else {
|
||||||
// Message might have already been delivered or timed out
|
// Message might have already been delivered or timed out
|
||||||
|
print("[DeliveryTracker] No pending delivery found for message \(ack.originalMessageID)")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,6 +156,8 @@ class DeliveryTracker {
|
|||||||
guard !sentAckIDs.contains(message.id) else { return nil }
|
guard !sentAckIDs.contains(message.id) else { return nil }
|
||||||
sentAckIDs.insert(message.id)
|
sentAckIDs.insert(message.id)
|
||||||
|
|
||||||
|
print("[DeliveryTracker] Generating ACK for message \(message.id) from \(message.sender)")
|
||||||
|
|
||||||
return DeliveryAck(
|
return DeliveryAck(
|
||||||
originalMessageID: message.id,
|
originalMessageID: message.id,
|
||||||
recipientID: myPeerID,
|
recipientID: myPeerID,
|
||||||
|
|||||||
@@ -902,15 +902,26 @@ class ChatViewModel: ObservableObject {
|
|||||||
for message in messages {
|
for message in messages {
|
||||||
// Only send read receipts for messages from the other peer (not our own)
|
// Only send read receipts for messages from the other peer (not our own)
|
||||||
// and only if the status is delivered (not already read)
|
// and only if the status is delivered (not already read)
|
||||||
if message.senderPeerID == peerID,
|
if message.senderPeerID == peerID {
|
||||||
case .delivered = message.deliveryStatus {
|
if let status = message.deliveryStatus {
|
||||||
// Create and send read receipt
|
switch status {
|
||||||
let receipt = ReadReceipt(
|
case .delivered:
|
||||||
originalMessageID: message.id,
|
// Create and send read receipt
|
||||||
readerID: meshService.myPeerID,
|
let receipt = ReadReceipt(
|
||||||
readerNickname: nickname
|
originalMessageID: message.id,
|
||||||
)
|
readerID: meshService.myPeerID,
|
||||||
meshService.sendReadReceipt(receipt, to: peerID)
|
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)
|
unreadPrivateMessages.remove(peerID)
|
||||||
|
|
||||||
// Send read receipt immediately since we're viewing the chat
|
// Send read receipt immediately since we're viewing the chat
|
||||||
if message.deliveryStatus != nil {
|
let receipt = ReadReceipt(
|
||||||
let receipt = ReadReceipt(
|
originalMessageID: message.id,
|
||||||
originalMessageID: message.id,
|
readerID: meshService.myPeerID,
|
||||||
readerID: meshService.myPeerID,
|
readerNickname: nickname
|
||||||
readerNickname: nickname
|
)
|
||||||
)
|
meshService.sendReadReceipt(receipt, to: peerID)
|
||||||
meshService.sendReadReceipt(receipt, to: peerID)
|
print("[Delivery] Sending immediate read receipt for message \(message.id) from \(message.sender)")
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} 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
|
||||||
@@ -2080,11 +2090,13 @@ extension ChatViewModel: BitchatDelegate {
|
|||||||
|
|
||||||
func didReceiveDeliveryAck(_ ack: DeliveryAck) {
|
func didReceiveDeliveryAck(_ ack: DeliveryAck) {
|
||||||
// Find the message and update its delivery status
|
// 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))
|
updateMessageDeliveryStatus(ack.originalMessageID, status: .delivered(to: ack.recipientNickname, at: ack.timestamp))
|
||||||
}
|
}
|
||||||
|
|
||||||
func didReceiveReadReceipt(_ receipt: ReadReceipt) {
|
func didReceiveReadReceipt(_ receipt: ReadReceipt) {
|
||||||
// Find the message and update its read status
|
// 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))
|
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) {
|
private func updateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) {
|
||||||
|
print("[Delivery] Updating message \(messageID) to status: \(status)")
|
||||||
|
|
||||||
// Update in main messages
|
// Update in main messages
|
||||||
if let index = messages.firstIndex(where: { $0.id == messageID }) {
|
if let index = messages.firstIndex(where: { $0.id == messageID }) {
|
||||||
var updatedMessage = messages[index]
|
var updatedMessage = messages[index]
|
||||||
updatedMessage.deliveryStatus = status
|
updatedMessage.deliveryStatus = status
|
||||||
messages[index] = updatedMessage
|
messages[index] = updatedMessage
|
||||||
|
print("[Delivery] Updated message in main messages")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update in private chats
|
// Update in private chats
|
||||||
@@ -2107,6 +2122,7 @@ extension ChatViewModel: BitchatDelegate {
|
|||||||
updatedMessage.deliveryStatus = status
|
updatedMessage.deliveryStatus = status
|
||||||
chatMessages[index] = updatedMessage
|
chatMessages[index] = updatedMessage
|
||||||
privateChats[peerID] = chatMessages
|
privateChats[peerID] = chatMessages
|
||||||
|
print("[Delivery] Updated message in private chat with \(peerID)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user