6 // Created by Hori,Masaki on 2017/01/23.
7 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 protocol MissionStatusObserver: class {
14 func didUpdate(state: MissionStatus)
17 protocol DeckMissionObserverDelegate: class {
19 func didChangeState(deck: Deck)
22 final class DeckMissionObserver {
24 private let deck: Deck
25 private var observation: NSKeyValueObservation?
27 weak var delegate: DeckMissionObserverDelegate? {
30 delegate?.didChangeState(deck: deck)
38 observation = deck.observe(\Deck.mission_2) { _, _ in
39 self.delegate?.didChangeState(deck: deck)
44 final class MissionStatus: NSObject {
46 private enum State: Int {
56 static func valid(number: Int) -> Bool {
58 return 2...4 ~= number
62 private let observer: DeckMissionObserver
64 private(set) var name: String?
65 private(set) var time: TimeInterval?
67 private var state: State = .unknown
68 private var rawState: Int = 0 {
71 state = State(rawValue: rawState) ?? .unknown
74 private var missionId: Int = 0
75 private var milliseconds: Int = 0
76 private var fleetName: String = ""
78 private var didNotify = false
80 weak var delegate: MissionStatusObserver?
82 /// CAUTION: 初回起動時/マスタ更新時にはデータがないので失敗する
85 guard MissionStatus.valid(number: number) else { return nil }
89 guard let deck = ServerDataStore.default.deck(by: number) else { return nil }
90 self.observer = DeckMissionObserver(deck: deck)
94 observer.delegate = self
97 private func updateState() {
106 case .hasMission, .earlyReturn:
107 name = ServerDataStore.default.masterMission(by: missionId)?.name ?? "Unknown"
110 Logger.shared.log("unknown State")
113 delegate?.didUpdate(state: self)
117 extension MissionStatus: DockInformationUpdater {
122 delegate?.didUpdate(state: self)
125 guard let name = name else { return }
127 let compTime = TimeInterval(Int(milliseconds / 1_000))
128 let diff = compTime - Date().timeIntervalSince1970
130 // set to 0. if diff is less than 0.
133 // notify UserNotification.
134 if didNotify { return }
135 if diff >= 1 * 60 { return }
137 let notification = NSUserNotification()
138 let format = LocalizedStrings.missionWillReturnMessage.string
139 notification.title = String(format: format, fleetName)
140 let txtFormat = LocalizedStrings.missionWillReturnInformation.string
141 notification.informativeText = String(format: txtFormat, fleetName, name)
143 if UserDefaults.standard[.playFinishMissionSound] {
145 notification.soundName = NSUserNotificationDefaultSoundName
148 NSUserNotificationCenter.default.deliver(notification)
154 extension MissionStatus: DeckMissionObserverDelegate {
156 func didChangeState(deck: Deck) {
158 rawState = deck.mission_0
159 missionId = deck.mission_1
160 milliseconds = deck.mission_2
161 fleetName = deck.name