Handle incoming store and forward messages

This commit is contained in:
Garth Vander Houwen 2024-02-13 14:21:49 -08:00
parent d4ff24cb16
commit caef40addc
3 changed files with 22 additions and 18 deletions

View file

@ -2403,18 +2403,10 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate
func storeAndForwardPacket(packet: MeshPacket, connectedNodeNum: Int64, context: NSManagedObjectContext) {
if let storeAndForwardMessage = try? StoreAndForward(serializedData: packet.decoded.payload) {
// Handle the text variant as a text message packet
if storeAndForwardMessage.variant == StoreAndForward.OneOf_Variant.text(packet.decoded.payload) {
MeshLogger.log("📮 Store and Forward history text message received \(storeAndForwardMessage)")
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context)
return
}
// Handle each of the store and forward request / response messages
switch storeAndForwardMessage.rr {
case .unset:
MeshLogger.log("📮 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context)
case .routerError:
MeshLogger.log("☠️ Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
case .routerHeartbeat:
@ -2486,14 +2478,13 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate
case .clientAbort:
MeshLogger.log("🛑 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
case .UNRECOGNIZED:
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context)
MeshLogger.log("📮 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
case .routerTextDirect:
MeshLogger.log("💬 Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context)
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, storeForward: true, context: context)
case .routerTextBroadcast:
MeshLogger.log("✉️ Store and Forward \(storeAndForwardMessage.rr) message received \(storeAndForwardMessage)")
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, context: context)
textMessageAppPacket(packet: packet, connectedNode: connectedNodeNum, storeForward: true, context: context)
}
}
}

View file

@ -721,9 +721,20 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage
}
}
func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSManagedObjectContext) {
func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, storeForward: Bool = false, context: NSManagedObjectContext) {
if let messageText = String(bytes: packet.decoded.payload, encoding: .utf8) {
var messageText = String(bytes: packet.decoded.payload, encoding: .utf8)
var storeForwardBroadcast = false
if storeForward {
if let storeAndForwardMessage = try? StoreAndForward(serializedData: packet.decoded.payload) {
messageText = String(bytes: storeAndForwardMessage.text, encoding: .utf8)
if storeAndForwardMessage.rr == .routerTextBroadcast {
storeForwardBroadcast = true
}
}
}
if messageText?.count ?? 0 > 0 {
MeshLogger.log("💬 \("mesh.log.textmessage.received".localized)")
@ -753,13 +764,15 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
}
if fetchedUsers.first(where: { $0.num == packet.to }) != nil && packet.to != 4294967295 {
newMessage.toUser = fetchedUsers.first(where: { $0.num == packet.to })
if !storeForwardBroadcast {
newMessage.toUser = fetchedUsers.first(where: { $0.num == packet.to })
}
}
if fetchedUsers.first(where: { $0.num == packet.from }) != nil {
newMessage.fromUser = fetchedUsers.first(where: { $0.num == packet.from })
}
newMessage.messagePayload = messageText
newMessage.messagePayloadMarkdown = generateMessageMarkdown(message: messageText)
newMessage.messagePayloadMarkdown = generateMessageMarkdown(message: messageText!)
if packet.to != 4294967295 && newMessage.fromUser != nil {
newMessage.fromUser?.lastMessage = Date()
}
@ -790,7 +803,7 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
id: ("notification.id.\(newMessage.messageId)"),
title: "\(newMessage.fromUser?.longName ?? "unknown".localized)",
subtitle: "AKA \(newMessage.fromUser?.shortName ?? "?")",
content: messageText,
content: messageText!,
target: "message",
path: "meshtastic://open-dm?userid=\(newMessage.fromUser?.num ?? 0)&id=\(newMessage.messageId)"
)
@ -822,7 +835,7 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
id: ("notification.id.\(newMessage.messageId)"),
title: "\(newMessage.fromUser?.longName ?? "unknown".localized)",
subtitle: "AKA \(newMessage.fromUser?.shortName ?? "?")",
content: messageText,
content: messageText!,
target: "message",
path: "meshtastic://messages/channel/\(newMessage.messageId)")
]

View file

@ -85,7 +85,7 @@ struct NodeList: View {
} label: {
Label("Trace Route", systemImage: "signpost.right.and.left")
}
if node.isStoreForwardRouter {
if true {//node.isStoreForwardRouter {
Button {
let success = bleManager.requestStoreAndForwardClientHistory(fromUser: connectedNode!.user!, toUser: node.user!)