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() }
28 dynamic var shipId: NSNumber? {
29 didSet { updateState() }
31 dynamic var completeTime: NSNumber?
34 guard 1...4 ~= number else { return nil }
36 controller = NSArrayController()
38 controller.managedObjectContext = ServerDataStore.default.context
39 controller.entityName = NyukyoDock.entityName
40 controller.fetchPredicate = NSPredicate(format: "id = %ld", number)
41 controller.automaticallyRearrangesObjects = true
44 bind(#keyPath(state), to: controller, withKeyPath: "selection.state")
45 bind(#keyPath(shipId), to: controller, withKeyPath: "selection.ship_id")
46 bind(#keyPath(completeTime), to: controller, withKeyPath: "selection.complete_time")
49 unbind(#keyPath(state))
50 unbind(#keyPath(shipId))
51 unbind(#keyPath(completeTime))
54 private func updateState() {
55 guard let state = state as? Int,
56 let stat = DockState(rawValue: state)
57 else { return print("unknown State") }
65 guard let shipId = shipId as? Int,
68 guard let ship = ServerDataStore.default.ship(by: shipId)
71 DispatchQueue(label: "NyukyoDockStatus")
72 .asyncAfter(deadline: .now() + 0.33) {
81 guard let name = name else {
85 guard let completeTime = completeTime as? Int
91 let compTime = TimeInterval(Int(completeTime / 1_000))
92 let diff = compTime - Date().timeIntervalSince1970
94 realTime = diff < 0 ? 0 : diff
96 if didNotify { return }
97 if diff >= 1 * 60 { return }
99 let notification = NSUserNotification()
100 let format = NSLocalizedString("%@ Will Finish Docking.", comment: "%@ Will Finish Docking.")
101 notification.title = String(format: format, name)
102 notification.informativeText = notification.title
103 if UserDefaults.standard.playFinishNyukyoSound {
104 notification.soundName = NSUserNotificationDefaultSoundName
106 NSUserNotificationCenter.default.deliver(notification)