From bf4a572299a64d19d0b164fcc82f7eeae4ec243d Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 4 Jul 2025 19:00:24 +0200 Subject: [PATCH] Fix critical room functionality issues - Fix room field not being copied when creating messageWithPeerID in BluetoothMeshService - This was causing all room messages to appear in main chat - Fix room member tracking by ensuring senderPeerID is included - Change room color from orange to blue to differentiate from private messages - Clean up room members when peers disconnect to fix member count - Add debug logging to track room field through message flow --- bitchat/Services/BluetoothMeshService.swift | 10 ++++++++-- bitchat/ViewModels/ChatViewModel.swift | 11 +++++++++++ bitchat/Views/ContentView.swift | 4 ++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/bitchat/Services/BluetoothMeshService.swift b/bitchat/Services/BluetoothMeshService.swift index 35720f39..1f0b1939 100644 --- a/bitchat/Services/BluetoothMeshService.swift +++ b/bitchat/Services/BluetoothMeshService.swift @@ -527,6 +527,8 @@ class BluetoothMeshService: NSObject { room: room ) + print("[DEBUG-SEND] Creating message with room: \(room ?? "nil")") + if let messageData = message.toBinaryPayload() { // Sign the message payload (no encryption for broadcasts) let signature: Data? @@ -1198,6 +1200,7 @@ class BluetoothMeshService: NSObject { // Parse broadcast message (not encrypted) if let message = BitchatMessage.fromBinaryPayload(packet.payload) { + print("[DEBUG-RECV] Received message with room: \(message.room ?? "nil"), content: \(message.content)") // Store nickname mapping peerNicknamesLock.lock() @@ -1213,7 +1216,8 @@ class BluetoothMeshService: NSObject { isPrivate: false, recipientNickname: nil, senderPeerID: senderID, - mentions: message.mentions + mentions: message.mentions, + room: message.room ) DispatchQueue.main.async { @@ -1309,7 +1313,9 @@ class BluetoothMeshService: NSObject { originalSender: message.originalSender, isPrivate: message.isPrivate, recipientNickname: message.recipientNickname, - senderPeerID: senderID + senderPeerID: senderID, + mentions: message.mentions, + room: message.room ) DispatchQueue.main.async { diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index f833cfaa..b408a15e 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -765,6 +765,17 @@ extension ChatViewModel: BitchatDelegate { connectedPeers = peers isConnected = !peers.isEmpty + // Clean up room members who disconnected + for (room, memberIDs) in roomMembers { + // Remove disconnected peers from room members + let activeMembers = memberIDs.filter { memberID in + memberID == meshService.myPeerID || peers.contains(memberID) + } + if activeMembers != memberIDs { + roomMembers[room] = activeMembers + } + } + // Force UI update objectWillChange.send() diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 85994c74..28e9be00 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -215,7 +215,7 @@ struct ContentView: View { }) { Text("\(currentRoom) (\(memberCount))") .font(.system(size: 18, weight: .medium, design: .monospaced)) - .foregroundColor(Color.orange) + .foregroundColor(Color.blue) } .buttonStyle(.plain) @@ -511,7 +511,7 @@ struct ContentView: View { HStack { Text(room) .font(.system(size: 14, design: .monospaced)) - .foregroundColor(viewModel.currentRoom == room ? Color.orange : textColor) + .foregroundColor(viewModel.currentRoom == room ? Color.blue : textColor) Spacer()