OSDN Git Service

CoreDataエンティティのクラスをエンティティ名と同じにした
[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 fileprivate enum DockState: Int {
12     case empty = 0
13     case hasShip = 1
14 }
15
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 }
22     }
23     dynamic var name: String?
24     dynamic var time: NSNumber?
25     dynamic var state: NSNumber? {
26         didSet { updateState() }
27     }
28     
29     init?(number: Int) {
30         guard 1...4 ~= number else { return nil }
31         self.number = number
32         controller = NSArrayController()
33         super.init()
34         controller.managedObjectContext = ServerDataStore.default.managedObjectContext
35         controller.entityName = NyukyoDock.entityName
36         controller.fetchPredicate = NSPredicate(format: "id = %ld", number)
37         controller.automaticallyRearrangesObjects = true
38         controller.fetch(nil)
39         
40         bind("state", to: controller, withKeyPath: "selection.state")
41     }
42     
43     private func updateState() {
44         guard let stat = DockState(rawValue: state as! Int)
45             else { return print("unknown State") }
46         if stat == .empty {
47             didNotify = false
48             name = nil
49             time = nil
50             return
51         }
52         
53         guard let si = controller.value(forKeyPath: "selection.ship_id") as? Int,
54             si != 0
55             else { return }
56         guard let ship = ServerDataStore.default.ship(byId: si)
57             else {
58                 name = "Unknown"
59                 DispatchQueue(label: "NyukyoDockStatus")
60                     .asyncAfter(deadline: .now() + 0.33) {
61                         self.updateState()
62                 }
63                 return
64         }
65         name = ship.name
66     }
67     
68     func update() {
69         if name == nil {
70             time = nil
71             return
72         }
73         guard let t = controller.value(forKeyPath: "selection.complete_time") as? Int
74             else {
75                 name = nil
76                 time = nil
77                 return
78         }
79         let compTime = TimeInterval(Int(t / 1_000))
80         let now = Date()
81         let diff = compTime - now.timeIntervalSince1970
82         
83         if diff < 0 { realTime = 0 }
84         else { realTime = diff }
85         
86         if didNotify { return }
87         if diff >= 1 * 60 { return }
88         
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
95         }
96         NSUserNotificationCenter.default.deliver(notification)
97         didNotify = true
98     }
99 }