diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index fb21e3fc..c5fe49b7 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -985,39 +985,50 @@ func nodeInfoAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { } func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { - - if let cmmc = try? CannedMessageModuleConfig(serializedData: packet.decoded.payload) { + + if let adminMessage = try? AdminMessage(serializedData: packet.decoded.payload) { + + if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getCannedMessageModuleMessagesResponse(adminMessage.getCannedMessageModuleMessagesResponse) { - if !cmmc.messages.isEmpty { - - let logString = String.localizedStringWithFormat(NSLocalizedString("mesh.log.cannedmessages.messages.received %@", comment: "Canned Messages Messages Received For: %@"), String(packet.from)) - MeshLogger.log("🥫 \(logString)") - - let fetchNodeRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") - fetchNodeRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) - - do { - let fetchedNode = try context.fetch(fetchNodeRequest) as! [NodeInfoEntity] - if fetchedNode.count == 1 { - let messages = String(cmmc.textFormatString()) - .replacingOccurrences(of: "11: ", with: "") - .replacingOccurrences(of: "\"", with: "") - .trimmingCharacters(in: .whitespacesAndNewlines) - fetchedNode[0].cannedMessageConfig?.messages = messages + if let cmmc = try? CannedMessageModuleConfig(serializedData: packet.decoded.payload) { + + if !cmmc.messages.isEmpty { + + let logString = String.localizedStringWithFormat(NSLocalizedString("mesh.log.cannedmessages.messages.received %@", comment: "Canned Messages Messages Received For: %@"), String(packet.from)) + MeshLogger.log("🥫 \(logString)") + + let fetchNodeRequest: NSFetchRequest = NSFetchRequest.init(entityName: "NodeInfoEntity") + fetchNodeRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) + do { - try context.save() - print("💾 Updated Canned Messages Messages For: \(fetchedNode[0].num)") + let fetchedNode = try context.fetch(fetchNodeRequest) as! [NodeInfoEntity] + if fetchedNode.count == 1 { + let messages = String(cmmc.textFormatString()) + .replacingOccurrences(of: "11: ", with: "") + .replacingOccurrences(of: "\"", with: "") + .trimmingCharacters(in: .whitespacesAndNewlines) + fetchedNode[0].cannedMessageConfig?.messages = messages + do { + try context.save() + print("💾 Updated Canned Messages Messages For: \(fetchedNode[0].num)") + } catch { + context.rollback() + let nsError = error as NSError + print("💥 Error Saving NodeInfoEntity from POSITION_APP \(nsError)") + } + } } catch { - context.rollback() - let nsError = error as NSError - print("💥 Error Saving NodeInfoEntity from POSITION_APP \(nsError)") + print("💥 Error Deserializing ADMIN_APP packet.") } } - } catch { - print("💥 Error Deserializing POSITION_APP packet.") } } + + else if adminMessage.payloadVariant == AdminMessage.OneOf_PayloadVariant.getChannelResponse(adminMessage.getChannelResponse) { + print("I am a channel response") + } } + } func positionPacket (packet: MeshPacket, context: NSManagedObjectContext) { diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index bd752922..40bc81b9 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -61,11 +61,8 @@ public func clearTelemetry(destNum: Int64, metricsType: Int32, context: NSManage } public func deleteChannelMessages(channel: ChannelEntity, context: NSManagedObjectContext) { - let fetchChannelMessagesRequest = NSFetchRequest(entityName: "MessageEntity") - fetchChannelMessagesRequest.predicate = NSPredicate(format: "channel == %i AND toUser == nil AND admin == false", Int32(channel.id)) - fetchChannelMessagesRequest.includesPropertyValues = false do { - let objects = try context.fetch(fetchChannelMessagesRequest) as! [NSManagedObject] + let objects = channel.allPrivateMessages// try context.fetch(fetchChannelMessagesRequest) as! [NSManagedObject] for object in objects { context.delete(object) } @@ -77,11 +74,8 @@ public func deleteChannelMessages(channel: ChannelEntity, context: NSManagedObje public func deleteUserMessages(user: UserEntity, context: NSManagedObjectContext) { - let fetchUserMessagesRequest = NSFetchRequest(entityName: "MessageEntity") - fetchUserMessagesRequest.predicate = NSPredicate(format: "((toUser.num == %lld) OR (fromUser.num == %lld)) AND toUser != nil AND fromUser != nil AND admin == false", Int64(user.num), Int64(user.num)) - fetchUserMessagesRequest.includesPropertyValues = false do { - let objects = try context.fetch(fetchUserMessagesRequest) as! [NSManagedObject] + let objects = user.messageList//try context.fetch(fetchUserMessagesRequest) as! [NSManagedObject] for object in objects { context.delete(object) } diff --git a/Meshtastic/Views/Bluetooth/Connect.swift b/Meshtastic/Views/Bluetooth/Connect.swift index 817c19d5..d9e29e1b 100644 --- a/Meshtastic/Views/Bluetooth/Connect.swift +++ b/Meshtastic/Views/Bluetooth/Connect.swift @@ -210,7 +210,7 @@ struct Connect: View { Button(role: .destructive, action: { if bleManager.connectedPeripheral != nil && bleManager.connectedPeripheral.peripheral.state == CBPeripheralState.connected { - bleManager.disconnectPeripheral() + bleManager.disconnectPeripheral(reconnect: false) isPreferredRadio = false } diff --git a/Meshtastic/Views/Messages/Contacts.swift b/Meshtastic/Views/Messages/Contacts.swift index 06abcafa..d53c365f 100644 --- a/Meshtastic/Views/Messages/Contacts.swift +++ b/Meshtastic/Views/Messages/Contacts.swift @@ -126,8 +126,17 @@ struct Contacts: View { ) { Button(role: .destructive) { - deleteChannelMessages(channel: channel, context: context) - context.refresh(node!.myInfo!, mergeChanges: true) + do { + for message in channel.allPrivateMessages { + context.delete(message) + } + try context.save() + context.refresh(node!.myInfo!, mergeChanges: true) + } catch let error as NSError { + print("Error: \(error.localizedDescription)") + } + //deleteChannelMessages(channel: channel, context: context) + } label: { Text("delete") } diff --git a/Meshtastic/Views/Settings/Channels.swift b/Meshtastic/Views/Settings/Channels.swift index b3cdcc93..4dd5c845 100644 --- a/Meshtastic/Views/Settings/Channels.swift +++ b/Meshtastic/Views/Settings/Channels.swift @@ -86,7 +86,7 @@ struct Channels: View { } } } - if node?.myInfo?.channels?.array.count ?? 0 < 8 { + if node?.myInfo?.channels?.array.count ?? 0 < 8 && node != nil { Button { let key = generateChannelKey(size: 32)