2 // NyukyoDockStatus.swift
5 // Created by Hori,Masaki on 2017/01/23.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 fileprivate enum DockState: Int {
16 class NyukyoDockStatus: NSObject {
17 private let number: Int
18 private let controller: NSArrayController
19 private var didNotify = false
20 private var realTime: TimeInterval = 0.0 {
21 didSet { time = realTime as NSNumber }
23 dynamic var name: String?
24 dynamic var time: NSNumber?
25 dynamic var state: NSNumber? {
26 didSet { updateState() }
30 guard 1...4 ~= number else { return nil }
32 controller = NSArrayController()
34 controller.managedObjectContext = ServerDataStore.default.managedObjectContext
35 controller.entityName = Entity.nyukyoDock.name
36 controller.fetchPredicate = NSPredicate(format: "id = %ld", number)
37 controller.automaticallyRearrangesObjects = true
40 bind("state", to: controller, withKeyPath: "selection.state")
43 private func updateState() {
44 guard let stat = DockState(rawValue: state as! Int)
45 else { return print("unknown State") }
53 guard let si = controller.value(forKeyPath: "selection.ship_id") as? Int,
56 guard let ship = ServerDataStore.default.ship(byId: si)
59 DispatchQueue(label: "NyukyoDockStatus")
60 .asyncAfter(deadline: .now() + 0.33) {
73 guard let t = controller.value(forKeyPath: "selection.complete_time") as? Int
79 let compTime = TimeInterval(Int(t / 1_000))
81 let diff = compTime - now.timeIntervalSince1970
83 if diff < 0 { realTime = 0 }
84 else { realTime = diff }
86 if didNotify { return }
87 if diff >= 1 * 60 { return }
89 let notification = NSUserNotification()
90 let format = NSLocalizedString("%@ Will Finish Docking.", comment: "%@ Will Finish Docking.")
91 notification.title = String(format: format, name!)
92 notification.informativeText = notification.title
93 if UserDefaults.standard.playFinishNyukyoSound {
94 notification.soundName = NSUserNotificationDefaultSoundName
96 NSUserNotificationCenter.default.deliver(notification)