OSDN Git Service

無駄な行や改行を削除
[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         controller = NSArrayController()
45         
46         super.init()
47         
48         controller.managedObjectContext = ServerDataStore.default.context
49         controller.entityName = NyukyoDock.entityName
50         controller.fetchPredicate = NSPredicate(#keyPath(NyukyoDock.id), equal: number)
51         controller.automaticallyRearrangesObjects = true
52         controller.fetch(nil)
53         
54         bind(NSBindingName(#keyPath(state)), to: controller, withKeyPath: "selection.state")
55         bind(NSBindingName(#keyPath(shipId)), to: controller, withKeyPath: "selection.ship_id")
56         bind(NSBindingName(#keyPath(completeTime)), to: controller, withKeyPath: "selection.complete_time")
57     }
58     
59     deinit {
60         
61         unbind(NSBindingName(#keyPath(state)))
62         unbind(NSBindingName(#keyPath(shipId)))
63         unbind(NSBindingName(#keyPath(completeTime)))
64     }
65     
66     private func updateState() {
67         
68         guard let state = state as? Int,
69             let stat = DockState(rawValue: state) else {
70                 
71                 print("unknown State")
72                 return
73         }
74         
75         if stat == .empty {
76             
77             didNotify = false
78             name = nil
79             time = nil
80             
81             return
82         }
83         
84         guard let shipId = shipId as? Int, shipId != 0 else { return }
85         
86         guard let ship = ServerDataStore.default.ship(by: shipId) else {
87             
88             name = "Unknown"
89             DispatchQueue(label: "NyukyoDockStatus").asyncAfter(deadline: .now() + 0.33) {
90                 
91                 self.updateState()
92             }
93             return
94         }
95         
96         name = ship.name
97     }
98     
99     func update() {
100         
101         guard let name = name else {
102             
103             time = nil
104             return
105         }
106         
107         guard let completeTime = completeTime as? Int else {
108             
109             self.name = nil
110             time = nil
111             return
112         }
113         
114         let compTime = TimeInterval(Int(completeTime / 1_000))
115         let diff = compTime - Date().timeIntervalSince1970
116         
117         realTime = diff < 0 ? 0 : diff
118         
119         if didNotify { return }
120         if diff >= 1 * 60 { return }
121         
122         let notification = NSUserNotification()
123         let format = LocalizedStrings.dockingWillFinish.string
124         notification.title = String(format: format, name)
125         notification.informativeText = notification.title
126         
127         if UserDefaults.standard[.playFinishNyukyoSound] {
128             
129             notification.soundName = NSUserNotificationDefaultSoundName
130         }
131         
132         NSUserNotificationCenter.default.deliver(notification)
133         
134         didNotify = true
135     }
136 }