FetchAnnouncementsManager.swift 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import Combine
  2. import Foundation
  3. import SwiftDate
  4. import Swinject
  5. protocol FetchAnnouncementsManager {}
  6. final class BaseFetchAnnouncementsManager: FetchAnnouncementsManager, Injectable {
  7. private let processQueue = DispatchQueue(label: "BaseFetchAnnouncementsManager.processQueue")
  8. @Injected() var announcementsStorage: AnnouncementsStorage!
  9. @Injected() var nightscoutManager: NightscoutManager!
  10. @Injected() var apsManager: APSManager!
  11. @Injected() var settingsManager: SettingsManager!
  12. private var lifetime = Lifetime()
  13. private let timer = DispatchTimer(timeInterval: 5.minutes.timeInterval)
  14. init(resolver: Resolver) {
  15. injectServices(resolver)
  16. subscribe()
  17. }
  18. private func subscribe() {
  19. timer.publisher
  20. .receive(on: processQueue)
  21. .flatMap { _ -> AnyPublisher<[Announcement], Never> in
  22. guard self.settingsManager.settings.allowAnnouncements else {
  23. return Just([]).eraseToAnyPublisher()
  24. }
  25. debug(.nightscout, "FetchAnnouncementsManager heartbeat")
  26. debug(.nightscout, "Start fetching announcements")
  27. return self.nightscoutManager.fetchAnnouncements()
  28. }
  29. .sink { announcements in
  30. guard let last = announcements.filter({ $0.createdAt > self.announcementsStorage.syncDate() })
  31. .sorted(by: { $0.createdAt < $1.createdAt })
  32. .last
  33. else { return }
  34. self.announcementsStorage.storeAnnouncements([last], enacted: false)
  35. if self.settingsManager.settings.allowAnnouncements, let recent = self.announcementsStorage.recent(),
  36. recent.action != nil
  37. {
  38. debug(.nightscout, "New announcements found")
  39. self.apsManager.enactAnnouncement(recent)
  40. }
  41. }
  42. .store(in: &lifetime)
  43. timer.fire()
  44. timer.resume()
  45. }
  46. }