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() {
105 case .hasMission, .earlyReturn:
106 name = ServerDataStore.default.masterMission(by: missionId)?.name ?? "Unknown"
109 Logger.shared.log("unknown State")
112 delegate?.didUpdate(state: self)
116 extension MissionStatus: DockInformationUpdater {
121 delegate?.didUpdate(state: self)
124 guard let name = name else { return }
126 let compTime = TimeInterval(Int(milliseconds / 1_000))
127 let diff = compTime - Date().timeIntervalSince1970
129 // set to 0. if diff is less than 0.
132 // notify UserNotification.
133 if didNotify { return }
134 if diff >= 1 * 60 { return }
136 let notification = NSUserNotification()
137 let format = LocalizedStrings.missionWillReturnMessage.string
138 notification.title = String(format: format, fleetName)
139 let txtFormat = LocalizedStrings.missionWillReturnInformation.string
140 notification.informativeText = String(format: txtFormat, fleetName, name)
142 if UserDefaults.standard[.playFinishMissionSound] {
144 notification.soundName = NSUserNotificationDefaultSoundName
147 NSUserNotificationCenter.default.deliver(notification)
153 extension MissionStatus: DeckMissionObserverDelegate {
155 func didChangeState(deck: Deck) {
157 rawState = deck.mission_0
158 missionId = deck.mission_1
159 milliseconds = deck.mission_2
160 fleetName = deck.name