Meshtastic-Apple/Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
2026-04-16 12:10:00 -07:00

63 lines
1.9 KiB
Swift

//
// ChannelEntityExtension.swift
// Meshtastic
//
// Copyright(c) Garth Vander Houwen 11/7/22.
//
import Foundation
import SwiftData
import MeshtasticProtobufs
extension ChannelEntity {
@MainActor
var allPrivateMessages: [MessageEntity] {
let context = PersistenceController.shared.context
let channelIndex = self.index
var descriptor = FetchDescriptor<MessageEntity>(
predicate: #Predicate<MessageEntity> { msg in
msg.channel == channelIndex && msg.toUser == nil && msg.isEmoji == false
},
sortBy: [SortDescriptor(\.messageTimestamp, order: .forward)]
)
return (try? context.fetch(descriptor)) ?? []
}
@MainActor
var mostRecentPrivateMessage: MessageEntity? {
let context = PersistenceController.shared.context
let channelIndex = self.index
var descriptor = FetchDescriptor<MessageEntity>(
predicate: #Predicate<MessageEntity> { msg in
msg.channel == channelIndex && msg.toUser == nil && msg.isEmoji == false
},
sortBy: [SortDescriptor(\.messageTimestamp, order: .reverse)]
)
descriptor.fetchLimit = 1
return try? context.fetch(descriptor).first
}
@MainActor
func unreadMessages(context: ModelContext) -> Int {
let channelIndex = self.index
let descriptor = FetchDescriptor<MessageEntity>(
predicate: #Predicate<MessageEntity> { msg in
msg.channel == channelIndex && msg.toUser == nil && msg.isEmoji == false && msg.read == false
}
)
return (try? context.fetchCount(descriptor)) ?? 0
}
@MainActor
var unreadMessages: Int { unreadMessages(context: PersistenceController.shared.context) }
var protoBuf: Channel {
var channel = Channel()
channel.index = self.index
channel.settings.name = self.name ?? ""
channel.settings.psk = self.psk ?? Data()
channel.role = Channel.Role(rawValue: Int(self.role)) ?? Channel.Role.secondary
channel.settings.moduleSettings.positionPrecision = UInt32(self.positionPrecision)
channel.settings.moduleSettings.isMuted = self.mute
return channel
}
}