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? {
31 delegate?.didChangeState(deck: deck)
39 observation = deck.observe(\Deck.mission_2) { _, _ in
41 self.delegate?.didChangeState(deck: deck)
46 final class MissionStatus: NSObject {
48 private enum State: Int {
61 static func valid(number: Int) -> Bool {
63 return 2...4 ~= number
67 private let observer: DeckMissionObserver
69 private(set) var name: String?
70 private(set) var time: TimeInterval?
72 private var state: State = .unknown
73 private var rawState: Int = 0 {
77 state = State(rawValue: rawState) ?? .unknown
80 private var missionId: Int = 0
81 private var milliseconds: Int = 0
82 private var fleetName: String = ""
84 private var didNotify = false
86 weak var delegate: MissionStatusObserver?
88 /// CAUTION: 初回起動時/マスタ更新時にはデータがないので失敗する
91 guard MissionStatus.valid(number: number) else {
98 guard let deck = ServerDataStore.default.deck(by: number) else {
103 self.observer = DeckMissionObserver(deck: deck)
107 observer.delegate = self
110 private func updateState() {
119 case .hasMission, .earlyReturn:
120 name = ServerDataStore.default.masterMission(by: missionId)?.name ?? "Unknown"
123 Logger.shared.log("unknown State")
127 delegate?.didUpdate(state: self)
131 extension MissionStatus: DockInformationUpdater {
137 delegate?.didUpdate(state: self)
140 guard let name = name else {
145 let compTime = TimeInterval(Int(milliseconds / 1_000))
146 let diff = compTime - Date().timeIntervalSince1970
148 // set to 0. if diff is less than 0.
151 // notify UserNotification.
161 let notification = NSUserNotification()
162 let format = LocalizedStrings.missionWillReturnMessage.string
163 notification.title = String(format: format, fleetName)
164 let txtFormat = LocalizedStrings.missionWillReturnInformation.string
165 notification.informativeText = String(format: txtFormat, fleetName, name)
167 if UserDefaults.standard[.playFinishMissionSound] {
169 notification.soundName = NSUserNotificationDefaultSoundName
172 NSUserNotificationCenter.default.deliver(notification)
178 extension MissionStatus: DeckMissionObserverDelegate {
180 func didChangeState(deck: Deck) {
182 rawState = deck.mission_0
183 missionId = deck.mission_1
184 milliseconds = deck.mission_2
185 fleetName = deck.name