6 // Created by Hori,Masaki on 2017/01/23.
7 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 private enum State: Int {
20 final class MissionStatus: NSObject {
22 private let number: Int
23 private let controller: NSArrayController
24 private var didNotify = false
25 private var realTime: TimeInterval = 0.0 {
27 didSet { time = realTime as NSNumber }
30 @objc dynamic var name: String?
31 @objc dynamic var time: NSNumber?
32 @objc dynamic var state: NSNumber?
33 @objc dynamic var missionId: NSNumber? {
35 didSet { updateState() }
37 @objc dynamic var milliseconds: NSNumber?
38 @objc dynamic var fleetName: String?
42 guard case 2...4 = number else { return nil }
45 controller = NSArrayController()
49 controller.managedObjectContext = ServerDataStore.default.context
50 controller.entityName = Deck.entityName
51 controller.fetchPredicate = NSPredicate(format: "id = %ld", number)
52 controller.automaticallyRearrangesObjects = true
55 bind(NSBindingName(#keyPath(state)), to: controller, withKeyPath: "selection.mission_0")
56 bind(NSBindingName(#keyPath(missionId)), to: controller, withKeyPath: "selection.mission_1")
57 bind(NSBindingName(#keyPath(milliseconds)), to: controller, withKeyPath: "selection.mission_2")
58 bind(NSBindingName(#keyPath(fleetName)), to: controller, withKeyPath: "selection.name")
63 unbind(NSBindingName(#keyPath(state)))
64 unbind(NSBindingName(#keyPath(missionId)))
65 unbind(NSBindingName(#keyPath(milliseconds)))
66 unbind(NSBindingName(#keyPath(fleetName)))
69 private func updateState() {
71 guard let state = state as? Int,
72 let stat = State(rawValue: state) else {
74 print("unknown State")
78 if stat == .none || stat == .finish {
80 if stat == .none { didNotify = false }
88 guard let missionId = self.missionId as? Int else { return }
90 guard let mission = ServerDataStore.default.masterMission(by: missionId) else {
93 DispatchQueue(label: "MissionStatus")
94 .asyncAfter(deadline: .now() + 0.33) {
112 guard let milliSeconds = milliseconds as? Int else {
119 let compTime = TimeInterval(Int(milliSeconds / 1_000))
120 let diff = compTime - Date().timeIntervalSince1970
122 realTime = diff < 0 ? 0 : diff
124 if didNotify { return }
125 if diff >= 1 * 60 { return }
127 guard let fleetName = fleetName else { return }
129 let notification = NSUserNotification()
130 let format = NSLocalizedString("%@ Will Return From Mission.", comment: "%@ Will Return From Mission.")
131 notification.title = String(format: format, fleetName)
132 let txtFormat = NSLocalizedString("%@ Will Return From %@.", comment: "%@ Will Return From %@.")
133 notification.informativeText = String(format: txtFormat, fleetName, name!)
135 if UserDefaults.standard[.playFinishMissionSound] {
137 notification.soundName = NSUserNotificationDefaultSoundName
140 NSUserNotificationCenter.default.deliver(notification)