2 // NyukyoDockStatus.swift
5 // Created by Hori,Masaki on 2017/01/23.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private enum DockState: Int {
17 final class NyukyoDockStatus: NSObject {
19 private let number: Int
20 private let controller = NSArrayController()
21 private var didNotify = false
22 private var realTime: TimeInterval = 0.0 {
24 didSet { time = realTime as NSNumber }
27 @objc dynamic var name: String?
28 @objc dynamic var time: NSNumber?
29 @objc dynamic var state: NSNumber? {
31 didSet { updateState() }
33 @objc dynamic var shipId: NSNumber? {
35 didSet { updateState() }
37 @objc dynamic var completeTime: NSNumber?
41 guard case 1...4 = number else { return nil }
47 controller.managedObjectContext = ServerDataStore.default.context
48 controller.entityName = NyukyoDock.entityName
49 controller.fetchPredicate = NSPredicate(#keyPath(NyukyoDock.id), equal: number)
50 controller.automaticallyRearrangesObjects = true
53 bind(NSBindingName(#keyPath(state)), to: controller, withKeyPath: "selection.state")
54 bind(NSBindingName(#keyPath(shipId)), to: controller, withKeyPath: "selection.ship_id")
55 bind(NSBindingName(#keyPath(completeTime)), to: controller, withKeyPath: "selection.complete_time")
60 unbind(NSBindingName(#keyPath(state)))
61 unbind(NSBindingName(#keyPath(shipId)))
62 unbind(NSBindingName(#keyPath(completeTime)))
65 private func invalidate() {
71 private func updateState() {
73 guard let state = state as? Int,
74 let stat = DockState(rawValue: state) else {
76 return Logger.shared.log("unknown State")
86 guard let shipId = shipId as? Int, shipId != 0 else { return }
88 guard let ship = ServerDataStore.default.ship(by: shipId) else {
91 DispatchQueue(label: "NyukyoDockStatus").asyncAfter(deadline: .now() + 0.33) {
103 guard let name = name else {
109 guard let completeTime = completeTime as? Int else {
115 let compTime = TimeInterval(Int(completeTime / 1_000))
116 let diff = compTime - Date().timeIntervalSince1970
118 realTime = max(0, diff)
120 if didNotify { return }
121 if diff >= 1 * 60 { return }
123 let notification = NSUserNotification()
124 let format = LocalizedStrings.dockingWillFinish.string
125 notification.title = String(format: format, name)
126 notification.informativeText = notification.title
128 if UserDefaults.standard[.playFinishNyukyoSound] {
130 notification.soundName = NSUserNotificationDefaultSoundName
133 NSUserNotificationCenter.default.deliver(notification)