Handle some nulls, properly identify and serialized assorted admin packets

This commit is contained in:
Garth Vander Houwen 2023-01-06 00:56:44 -08:00
parent 21f96c334f
commit 630986487c
5 changed files with 51 additions and 37 deletions

View file

@ -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<NSFetchRequestResult> = 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<NSFetchRequestResult> = 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) {

View file

@ -61,11 +61,8 @@ public func clearTelemetry(destNum: Int64, metricsType: Int32, context: NSManage
}
public func deleteChannelMessages(channel: ChannelEntity, context: NSManagedObjectContext) {
let fetchChannelMessagesRequest = NSFetchRequest<NSFetchRequestResult>(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<NSFetchRequestResult>(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)
}

View file

@ -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
}

View file

@ -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")
}

View file

@ -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)