FetchAnnouncementsManager.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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: 1.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 announcements.filter({ $0.createdAt > self.announcementsStorage.syncDate() }).isNotEmpty else { return }
  31. self.announcementsStorage.storeAnnouncements(announcements, enacted: false)
  32. if self.settingsManager.settings.allowAnnouncements, let recent = self.announcementsStorage.recent(),
  33. recent.action != nil
  34. {
  35. debug(.nightscout, "New announcements found")
  36. self.apsManager.enactAnnouncement(recent)
  37. }
  38. }
  39. .store(in: &lifetime)
  40. timer.fire()
  41. timer.resume()
  42. }
  43. }