2022-06-04 07:41:52 -07:00
//
// U s e r E n t i t y E x t e n s i o n . s w i f t
2023-03-26 09:08:08 -07:00
// M e s h t a s t i c
2022-06-04 07:41:52 -07:00
//
2022-10-17 18:52:49 -07:00
// C o p y r i g h t ( c ) G a r t h V a n d e r H o u w e n 6 / 3 / 2 2 .
2022-06-04 07:41:52 -07:00
//
import Foundation
2024-05-26 12:15:50 -07:00
import CoreData
2024-06-07 22:09:20 -05:00
import MeshtasticProtobufs
2022-06-04 07:41:52 -07:00
extension UserEntity {
2023-03-06 10:33:18 -08:00
2022-06-04 07:41:52 -07:00
var messageList : [ MessageEntity ] {
2024-07-23 19:10:00 -07:00
let context = PersistenceController . shared . container . viewContext
let fetchRequest = MessageEntity . fetchRequest ( )
2024-08-03 07:02:51 -07:00
fetchRequest . sortDescriptors = [ NSSortDescriptor ( key : " messageTimestamp " , ascending : true ) ]
2024-07-23 19:10:00 -07:00
fetchRequest . predicate = NSPredicate ( format : " ((toUser == %@) OR (fromUser == %@)) AND toUser != nil AND fromUser != nil AND isEmoji == false AND admin = false AND portNum != 10 " , self , self )
return ( try ? context . fetch ( fetchRequest ) ) ? ? [ MessageEntity ] ( )
2022-06-04 07:41:52 -07:00
}
2023-03-06 10:33:18 -08:00
2023-09-09 21:23:14 -07:00
var sensorMessageList : [ MessageEntity ] {
2024-07-23 19:10:00 -07:00
let context = PersistenceController . shared . container . viewContext
let fetchRequest = MessageEntity . fetchRequest ( )
2024-08-03 07:02:51 -07:00
fetchRequest . sortDescriptors = [ NSSortDescriptor ( key : " messageTimestamp " , ascending : true ) ]
2024-07-23 19:10:00 -07:00
fetchRequest . predicate = NSPredicate ( format : " (fromUser == %@) AND portNum = 10 " , self )
return ( try ? context . fetch ( fetchRequest ) ) ? ? [ MessageEntity ] ( )
2023-09-09 21:23:14 -07:00
}
2024-05-29 16:40:07 -05:00
2023-08-28 21:46:04 -07:00
var unreadMessages : Int {
2025-09-20 12:42:16 -07:00
let unreadMessages = messageList . filter { ( $0 as AnyObject ) . read = = false && ( $0 as AnyObject ) . isEmoji = = false }
2023-08-29 07:53:52 -07:00
return unreadMessages . count
2023-08-28 21:46:04 -07:00
}
2024-12-12 22:44:39 -08:00
// / S V G I m a g e s f o r V e n d o r s w h o a r e s i g n e d p r o j e c t b a c k e r s
2024-07-15 22:48:26 -05:00
var hardwareImage : String ? {
guard let hwModel else { return nil }
switch hwModel {
2024-12-12 08:53:10 -08:00
// / H e l t e c
2024-12-12 22:44:39 -08:00
case " HELTECHT62 " :
return " HELTECHT62 "
case " HELTECMESHNODET114 " :
return " HELTECMESHNODET114 "
case " HELTECV3 " :
return " HELTECV3 "
2025-07-26 09:09:49 -07:00
case " HELTECMESHPOCKET " :
return " HELTECMESHPOCKET "
2024-12-12 22:44:39 -08:00
case " HELTECVISIONMASTERE213 " :
return " HELTECVISIONMASTERE213 "
case " HELTECVISIONMASTERE290 " :
return " HELTECVISIONMASTERE290 "
case " HELTECWIRELESSPAPER " , " HELTECWIRELESSPAPERV10 " :
return " HELTECWIRELESSPAPER "
case " HELTECWIRELESSTRACKER " , " HELTECWIRELESSTRACKERV10 " :
return " HELTECWIRELESSTRACKER "
case " HELTECWSLV3 " :
return " HELTECWSLV3 "
2024-12-12 08:53:10 -08:00
// / L i l y G O
2024-12-12 16:06:48 -08:00
case " TDECK " :
return " TDECK "
case " TECHO " :
return " TECHO "
case " TWATCHS3 " :
return " TWATCHS3 "
case " LILYGOTBEAMS3CORE " :
return " LILYGOTBEAMS3CORE "
2024-12-12 08:53:10 -08:00
case " TBEAM " , " TBEAM_V0P7 " :
return " TBEAM "
case " TLORAC6 " :
return " TLORAC6 "
2024-12-12 16:06:48 -08:00
case " TLORAT3S3EPAPER " :
return " TLORAT3S3EPAPER "
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
case " TLORAT3S3V1 " , " TLORAT3S3 " :
2024-12-12 16:06:48 -08:00
return " TLORAT3S3V1 "
2025-01-01 11:20:46 -08:00
case " TLORAV211P6 " :
return " TLORAV211P6 "
case " TLORAV211P8 " :
return " TLORAV211P8 "
2024-12-13 09:34:32 -08:00
// / S e e e d S t u d i o
case " SENSECAPINDICATOR " :
2024-12-19 23:08:14 -08:00
return " SENSECAPINDICATOR "
2024-12-13 09:34:32 -08:00
case " TRACKERT1000E " :
2024-12-19 23:08:14 -08:00
return " TRACKERT1000E "
2024-12-13 09:34:32 -08:00
case " SEEEDXIAOS3 " :
2024-12-19 23:08:14 -08:00
return " SEEEDXIAOS3 "
2024-12-13 09:34:32 -08:00
case " WIOWM1110 " :
2024-12-19 23:08:14 -08:00
return " WIOWM1110 "
2025-07-14 17:12:30 -07:00
case " SEEEDSOLARNODE " :
return " SEEEDSOLARNODE "
case " SEEEDWIOTRACKERL1 " :
return " SEEEDWIOTRACKERL1 "
2024-12-13 09:34:32 -08:00
// / R A K W i r e l e s s
case " RAK4631 " :
2024-12-19 23:08:14 -08:00
return " RAK4631 "
2024-12-13 09:34:32 -08:00
case " RAK11310 " :
2024-12-19 23:08:14 -08:00
return " RAK11310 "
2024-12-13 09:34:32 -08:00
case " WISMESHTAP " :
2024-12-19 23:08:14 -08:00
return " WISMESHTAP "
2024-12-12 16:06:48 -08:00
// / B & Q C o n s u l t i n g
2024-07-15 22:48:26 -05:00
case " NANOG1 " , " NANOG1EXPLORER " :
2024-12-13 09:49:03 -08:00
return " NANOG1 "
2024-07-15 22:48:26 -05:00
case " NANOG2ULTRA " :
2024-12-13 09:49:03 -08:00
return " NANOG2ULTRA "
2024-12-12 08:53:10 -08:00
case " STATIONG2 " :
2024-12-13 09:49:03 -08:00
return " STATIONG2 "
2024-12-13 09:34:32 -08:00
// / D I Y D e v i c e s
case " RPIPICO " :
return " RPIPICO "
2024-07-15 22:48:26 -05:00
default :
return " UNSET "
}
}
2022-06-04 07:41:52 -07:00
}
2025-06-15 09:47:27 -07:00
public func createUser ( num : Int64 , context : NSManagedObjectContext ) throws -> UserEntity {
// V a l i d a t e I n p u t
guard num >= 0 else {
throw CoreDataError . invalidInput ( message : " User number cannot be negative. " )
}
var newUser : UserEntity ! // U s e a n i m p l i c i t l y u n w r a p p e d o p t i o n a l , b u t e n s u r e i t ' s a s s i g n e d
context . performAndWait {
newUser = UserEntity ( context : context )
newUser . num = num
2025-06-18 16:44:21 -07:00
let userId = num . toHex ( )
newUser . userId = userId
2025-06-15 09:47:27 -07:00
let last4 = String ( userId . suffix ( 4 ) )
newUser . longName = " Meshtastic \( last4 ) "
newUser . shortName = last4
newUser . hwModel = " UNSET "
}
2024-05-26 12:15:50 -07:00
return newUser
}
2025-06-15 09:47:27 -07:00
enum CoreDataError : Error , LocalizedError {
case invalidInput ( message : String )
case saveFailed ( message : String )
case entityCreationFailed ( message : String ) // I n c a s e U s e r E n t i t y ( c o n t e x t : ) f a i l s f o r s o m e r e a s o n
var errorDescription : String ? {
switch self {
case . invalidInput ( let message ) :
return " Core Data Input Error: \( message ) "
case . saveFailed ( let message ) :
return " Core Data Save Error: \( message ) "
case . entityCreationFailed ( let message ) :
return " Core Data Entity Creation Error: \( message ) "
}
}
}