Fix private message routing

- Add recipient ID to private message packets for proper routing
- Private messages now correctly include recipientID field
- Add comprehensive debug logging for private message flow
- Messages are now properly delivered to intended recipients
- Add asterisk after bitchat text in header
This commit is contained in:
jack
2025-07-03 23:20:07 +02:00
parent 6652d1f429
commit 63c0ed4960
2 changed files with 56 additions and 40 deletions
+54 -38
View File
@@ -259,13 +259,18 @@ class BluetoothMeshService: NSObject {
) )
if let messageData = message.toBinaryPayload() { if let messageData = message.toBinaryPayload() {
// Create packet with recipient ID for proper routing
let packet = BitchatPacket( let packet = BitchatPacket(
type: MessageType.privateMessage.rawValue, type: MessageType.privateMessage.rawValue,
ttl: self.maxTTL, senderID: Data(self.myPeerID.utf8),
senderID: self.myPeerID, recipientID: Data(recipientPeerID.utf8),
payload: messageData timestamp: UInt64(Date().timeIntervalSince1970),
payload: messageData,
signature: nil,
ttl: self.maxTTL
) )
print("[PRIVATE] Sending private message to \(recipientPeerID)")
self.broadcastPacket(packet) self.broadcastPacket(packet)
// Don't call didReceiveMessage here - let the view model handle it directly // Don't call didReceiveMessage here - let the view model handle it directly
@@ -538,52 +543,63 @@ class BluetoothMeshService: NSObject {
} }
case .privateMessage: case .privateMessage:
print("[PRIVATE] Received private message packet")
if let message = BitchatMessage.fromBinaryPayload(packet.payload) { if let message = BitchatMessage.fromBinaryPayload(packet.payload) {
// Check if this private message is for us // Check if this private message is for us
if let recipientID = packet.recipientID, if let recipientID = packet.recipientID,
let recipientIDString = String(data: recipientID.trimmingNullBytes(), encoding: .utf8), let recipientIDString = String(data: recipientID.trimmingNullBytes(), encoding: .utf8) {
recipientIDString == myPeerID { print("[PRIVATE] Message recipient: \(recipientIDString), myPeerID: \(myPeerID)")
// Get sender ID if recipientIDString == myPeerID {
if let senderID = String(data: packet.senderID.trimmingNullBytes(), encoding: .utf8) { // Get sender ID
// Ignore our own messages if let senderID = String(data: packet.senderID.trimmingNullBytes(), encoding: .utf8) {
if senderID == myPeerID { // Ignore our own messages
return if senderID == myPeerID {
} print("[PRIVATE] Ignoring own message")
return
}
// Store nickname mapping if we don't have it print("[PRIVATE] Received private message from \(senderID): \(message.content)")
if peerNicknames[senderID] == nil {
peerNicknames[senderID] = message.sender // Store nickname mapping if we don't have it
if peerNicknames[senderID] == nil {
peerNicknames[senderID] = message.sender
// Update peer list to show the new nickname
DispatchQueue.main.async {
self.delegate?.didUpdatePeerList(self.getAllConnectedPeerIDs())
}
}
// Create a new message with the sender peer ID
let messageWithPeerID = BitchatMessage(
sender: message.sender,
content: message.content,
timestamp: message.timestamp,
isRelay: message.isRelay,
originalSender: message.originalSender,
isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname,
senderPeerID: senderID
)
// Update peer list to show the new nickname
DispatchQueue.main.async { DispatchQueue.main.async {
self.delegate?.didUpdatePeerList(self.getAllConnectedPeerIDs()) self.delegate?.didReceiveMessage(messageWithPeerID)
} }
} }
} else if packet.ttl > 0 {
// Relay private messages that aren't for us
// Create a new message with the sender peer ID print("[PRIVATE] Relaying message not meant for us (TTL: \(packet.ttl))")
let messageWithPeerID = BitchatMessage( var relayPacket = packet
sender: message.sender, relayPacket.ttl -= 1
content: message.content, self.broadcastPacket(relayPacket)
timestamp: message.timestamp,
isRelay: message.isRelay,
originalSender: message.originalSender,
isPrivate: message.isPrivate,
recipientNickname: message.recipientNickname,
senderPeerID: senderID
)
DispatchQueue.main.async {
self.delegate?.didReceiveMessage(messageWithPeerID)
}
} }
} else if packet.ttl > 0 { } else {
// Relay private messages that aren't for us print("[PRIVATE] No recipient ID in packet")
var relayPacket = packet
relayPacket.ttl -= 1
self.broadcastPacket(relayPacket)
} }
} else {
print("[PRIVATE] Failed to decode message from payload")
} }
case .voiceNote: case .voiceNote:
+1 -1
View File
@@ -232,7 +232,7 @@ struct ContentView: View {
} else { } else {
// Public chat header // Public chat header
HStack(spacing: 4) { HStack(spacing: 4) {
Text("bitchat") Text("bitchat*")
.font(.system(size: 18, weight: .medium, design: .monospaced)) .font(.system(size: 18, weight: .medium, design: .monospaced))
.foregroundColor(textColor) .foregroundColor(textColor)