Implement hashtag rooms feature

- Add room field to BitchatMessage structure
- Update BinaryProtocol to encode/decode room information
- Create room management in ChatViewModel (join/leave/switch rooms)
- Add BluetoothMeshService support for room messages
- Implement rooms UI in sidebar with unread counts
- Create clickable hashtags in messages to join rooms
- Add room persistence across app restarts
- Filter message display by current room selection
This commit is contained in:
jack
2025-07-05 19:35:37 +02:00
parent bb2edd4e23
commit 3d7232222c
5 changed files with 426 additions and 47 deletions
+21 -1
View File
@@ -193,6 +193,7 @@ extension BitchatMessage {
// - Recipient nickname length + data
// - Sender peer ID length + data
// - Mentions array
// - Room hashtag
var flags: UInt8 = 0
if isRelay { flags |= 0x01 }
@@ -201,6 +202,7 @@ extension BitchatMessage {
if recipientNickname != nil { flags |= 0x08 }
if senderPeerID != nil { flags |= 0x10 }
if mentions != nil && !mentions!.isEmpty { flags |= 0x20 }
if room != nil { flags |= 0x40 }
data.append(flags)
@@ -267,6 +269,12 @@ extension BitchatMessage {
}
}
// Room hashtag
if let room = room, let roomData = room.data(using: .utf8) {
data.append(UInt8(min(roomData.count, 255)))
data.append(roomData.prefix(255))
}
return data
}
@@ -292,6 +300,7 @@ extension BitchatMessage {
let hasRecipientNickname = (flags & 0x08) != 0
let hasSenderPeerID = (flags & 0x10) != 0
let hasMentions = (flags & 0x20) != 0
let hasRoom = (flags & 0x40) != 0
// Timestamp
guard offset + 8 <= dataCopy.count else {
@@ -389,6 +398,16 @@ extension BitchatMessage {
}
}
// Room
var room: String? = nil
if hasRoom && offset < dataCopy.count {
let length = Int(dataCopy[offset]); offset += 1
if offset + length <= dataCopy.count {
room = String(data: dataCopy[offset..<offset+length], encoding: .utf8)
offset += length
}
}
let message = BitchatMessage(
sender: sender,
content: content,
@@ -398,7 +417,8 @@ extension BitchatMessage {
isPrivate: isPrivate,
recipientNickname: recipientNickname,
senderPeerID: senderPeerID,
mentions: mentions
mentions: mentions,
room: room
)
return message
}
+3 -1
View File
@@ -133,8 +133,9 @@ struct BitchatMessage: Codable, Equatable {
let recipientNickname: String?
let senderPeerID: String?
let mentions: [String]? // Array of mentioned nicknames
let room: String? // Room hashtag (e.g., "#general")
init(sender: String, content: String, timestamp: Date, isRelay: Bool, originalSender: String? = nil, isPrivate: Bool = false, recipientNickname: String? = nil, senderPeerID: String? = nil, mentions: [String]? = nil) {
init(sender: String, content: String, timestamp: Date, isRelay: Bool, originalSender: String? = nil, isPrivate: Bool = false, recipientNickname: String? = nil, senderPeerID: String? = nil, mentions: [String]? = nil, room: String? = nil) {
self.id = UUID().uuidString
self.sender = sender
self.content = content
@@ -145,6 +146,7 @@ struct BitchatMessage: Codable, Equatable {
self.recipientNickname = recipientNickname
self.senderPeerID = senderPeerID
self.mentions = mentions
self.room = room
}
}