diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index dc285539..0db2595c 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -673,7 +673,9 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph newMessage.messageId = Int64(UInt32.random(in: UInt32(UInt8.max).. 0 { + newMessage.toUser = fetchedUsers.first(where: { $0.num == toUserNum }) + } newMessage.fromUser = fetchedUsers.first(where: { $0.num == fromUserNum }) newMessage.isEmoji = isEmoji newMessage.admin = false @@ -692,7 +694,11 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph var meshPacket = MeshPacket() meshPacket.id = UInt32(newMessage.messageId) - meshPacket.to = UInt32(toUserNum) + if toUserNum > 0 { + meshPacket.to = UInt32(toUserNum) + } else { + meshPacket.to = 4294967295 + } meshPacket.from = UInt32(fromUserNum) meshPacket.decoded = dataMessage meshPacket.decoded.emoji = isEmoji ? 1 : 0 diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index df41ad45..26c7c2b0 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -1260,13 +1260,6 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM do { let fetchedUsers = try context.fetch(messageUsers) as! [UserEntity] - - if fetchedUsers.count <= 1 && fetchedUsers.first(where: { $0.num == packet.from }) == nil { - - //print("Message from another mesh, unable to manage for now") - //return - } - let newMessage = MessageEntity(context: context) newMessage.messageId = Int64(packet.id) newMessage.messageTimestamp = Int32(bitPattern: packet.rxTime) @@ -1278,46 +1271,45 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM newMessage.replyID = Int64(packet.decoded.replyID) } - if fetchedUsers.first(where: { $0.num == packet.to }) != nil { + if fetchedUsers.first(where: { $0.num == packet.to }) != nil && packet.to != 4294967295 { 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.fromUser?.objectWillChange.send() newMessage.toUser?.objectWillChange.send() - var messageSaved = false + var messageSaved = false - do { + do { - try context.save() - MeshLogger.log("💾 Saved a new message for \(newMessage.messageId)") - messageSaved = true - - if messageSaved { - if newMessage.fromUser != nil { - // Create an iOS Notification for the received message and schedule it immediately - let manager = LocalNotificationManager() - manager.notifications = [ - Notification( - id: ("notification.id.\(newMessage.messageId)"), - title: "\(newMessage.fromUser?.longName ?? "Unknown")", - subtitle: "AKA \(newMessage.fromUser?.shortName ?? "???")", - content: messageText) - ] - manager.schedule() - MeshLogger.log("💬 iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "Unknown")") - } + try context.save() + MeshLogger.log("💾 Saved a new message for \(newMessage.messageId)") + messageSaved = true + + if messageSaved { + if newMessage.fromUser != nil { + // Create an iOS Notification for the received message and schedule it immediately + let manager = LocalNotificationManager() + manager.notifications = [ + Notification( + id: ("notification.id.\(newMessage.messageId)"), + title: "\(newMessage.fromUser?.longName ?? "Unknown")", + subtitle: "AKA \(newMessage.fromUser?.shortName ?? "???")", + content: messageText) + ] + manager.schedule() + MeshLogger.log("💬 iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "Unknown")") } - } catch { - context.rollback() - let nsError = error as NSError - MeshLogger.log("💥 Failed to save new MessageEntity \(nsError)") } + } catch { + context.rollback() + let nsError = error as NSError + MeshLogger.log("💥 Failed to save new MessageEntity \(nsError)") + } } catch { MeshLogger.log("💥 Fetch Message To and From Users Error") } diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel.xcdatamodel/contents index 670f7ee5..31ed3498 100644 --- a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel.xcdatamodel/contents +++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel.xcdatamodel/contents @@ -29,7 +29,7 @@ - + diff --git a/Meshtastic/Views/Messages/Contacts.swift b/Meshtastic/Views/Messages/Contacts.swift index 6e9e267b..b33c4cca 100644 --- a/Meshtastic/Views/Messages/Contacts.swift +++ b/Meshtastic/Views/Messages/Contacts.swift @@ -27,7 +27,7 @@ struct Contacts: View { NavigationSplitView { List { - Section(header: Text("Channels")) { + Section(header: Text("Channels (groups)")) { // Display Contacts for the rest of the non admin channels if node != nil { ForEach(node!.myInfo!.channels?.array as! [ChannelEntity], id: \.self) { (channel: ChannelEntity) in @@ -91,7 +91,7 @@ struct Contacts: View { .padding(.bottom, 10) } } - Section(header: Text("Direct Messages")) { + Section(header: Text("Direct Messages (Primary Channel)")) { ForEach(users) { (user: UserEntity) in if user.num != bleManager.userSettings?.preferredNodeNum ?? 0 { NavigationLink(destination: UserMessageList(user: user)) {