OSDN Git Service

Fleetを7隻に対応
[kcd/KCD.git] / KCD / NyukyoDockStatus.swift
1 //
2 //  NyukyoDockStatus.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/23.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 private enum DockState: Int {
12     
13     case empty = 0
14     case hasShip = 1
15 }
16
17 final class NyukyoDockStatus: NSObject {
18     
19     private let number: Int
20     private let controller = NSArrayController()
21     private var didNotify = false
22     private var realTime: TimeInterval = 0.0 {
23         
24         didSet { time = realTime as NSNumber }
25     }
26     
27     @objc dynamic var name: String?
28     @objc dynamic var time: NSNumber?
29     @objc dynamic var state: NSNumber? {
30         
31         didSet { updateState() }
32     }
33     @objc dynamic var shipId: NSNumber? {
34         
35         didSet { updateState() }
36     }
37     @objc dynamic var completeTime: NSNumber?
38     
39     init?(number: Int) {
40         
41         guard case 1...4 = number else { return nil }
42         
43         self.number = number
44         
45         super.init()
46         
47         controller.managedObjectContext = ServerDataStore.default.context
48         controller.entityName = NyukyoDock.entityName
49         controller.fetchPredicate = NSPredicate(#keyPath(NyukyoDock.id), equal: number)
50         controller.automaticallyRearrangesObjects = true
51         controller.fetch(nil)
52         
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")
56     }
57     
58     deinit {
59         
60         unbind(NSBindingName(#keyPath(state)))
61         unbind(NSBindingName(#keyPath(shipId)))
62         unbind(NSBindingName(#keyPath(completeTime)))
63     }
64     
65     private func updateState() {
66         
67         guard let state = state as? Int,
68             let stat = DockState(rawValue: state) else {
69                 
70                 return Logger.shared.log("unknown State")
71         }
72         
73         if stat == .empty {
74             
75             didNotify = false
76             name = nil
77             time = nil
78             
79             return
80         }
81         
82         guard let shipId = shipId as? Int, shipId != 0 else { return }
83         
84         guard let ship = ServerDataStore.default.ship(by: shipId) else {
85             
86             name = "Unknown"
87             DispatchQueue(label: "NyukyoDockStatus").asyncAfter(deadline: .now() + 0.33) {
88                 
89                 self.updateState()
90             }
91             return
92         }
93         
94         name = ship.name
95     }
96     
97     func update() {
98         
99         guard let name = name else {
100             
101             time = nil
102             return
103         }
104         
105         guard let completeTime = completeTime as? Int else {
106             
107             self.name = nil
108             time = nil
109             return
110         }
111         
112         let compTime = TimeInterval(Int(completeTime / 1_000))
113         let diff = compTime - Date().timeIntervalSince1970
114         
115         realTime = max(0, diff)
116         
117         if didNotify { return }
118         if diff >= 1 * 60 { return }
119         
120         let notification = NSUserNotification()
121         let format = LocalizedStrings.dockingWillFinish.string
122         notification.title = String(format: format, name)
123         notification.informativeText = notification.title
124         
125         if UserDefaults.standard[.playFinishNyukyoSound] {
126             
127             notification.soundName = NSUserNotificationDefaultSoundName
128         }
129         
130         NSUserNotificationCenter.default.deliver(notification)
131         
132         didNotify = true
133     }
134 }