From caef40addcf490d6c5ee0d7f71eeeefe22a93839 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 13 Feb 2024 14:21:49 -0800 Subject: [PATCH] Handle incoming store and forward messages --- Meshtastic/Helpers/BLEManager.swift | 13 ++----------- Meshtastic/Helpers/MeshPackets.swift | 25 +++++++++++++++++++------ Meshtastic/Views/Nodes/NodeList.swift | 2 +- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 9dc704d3..d4528061 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -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) } } } diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index d2e6a8f1..c25edc2f 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -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)") ] diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index 48bfeb80..500ca491 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -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!)