2 // KenzoDockStatus.swift
5 // Created by Hori,Masaki on 2017/01/22.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 protocol KenzoDockStatusObserver: class {
13 func didUpdate(state: KenzoDockStatus)
16 protocol KenzoDockStatusObserverDelegate: class {
18 func didChangeState(dock: KenzoDock)
21 final class KenzoDockObserver {
23 private let dock: KenzoDock
24 private var observation: NSKeyValueObservation?
26 weak var delegate: KenzoDockStatusObserverDelegate? {
30 delegate?.didChangeState(dock: dock)
34 init(dock: KenzoDock) {
38 observation = dock.observe(\KenzoDock.state) { _, _ in
40 self.delegate?.didChangeState(dock: self.dock)
45 final class KenzoDockStatus: NSObject {
47 private enum DockState: Int {
60 static func valid(number: Int) -> Bool {
62 return 1...4 ~= number
66 private let observer: KenzoDockObserver
68 private(set) var time: TimeInterval?
70 private var isTasking = false
72 private var state: DockState = .unknown
73 private var rawState: Int = 0 {
77 state = DockState(rawValue: rawState) ?? .unknown
80 private var completeTime: Int = 0
82 private var didNotify = false
84 weak var delegate: KenzoDockStatusObserver?
86 /// CAUTION: 初回起動時/マスタ更新時にはデータがないので失敗する
89 guard KenzoDockStatus.valid(number: number) else {
96 guard let dock = ServerDataStore.default.kenzoDock(by: number) else {
101 self.observer = KenzoDockObserver(dock: dock)
105 observer.delegate = self
108 private func updateState() {
112 case .empty, .notOpen:
117 case .hasShip, .completed:
121 Logger.shared.log("unknown State")
125 delegate?.didUpdate(state: self)
129 extension KenzoDockStatus: DockInformationUpdater {
135 delegate?.didUpdate(state: self)
138 guard isTasking else {
143 let compTime = TimeInterval(Int(completeTime / 1_000))
144 let diff = compTime - Date().timeIntervalSince1970
146 // set to 0. if diff is less than 0.
149 // notify UserNotification.
159 let notification = NSUserNotification()
160 let format = LocalizedStrings.buildingWillFinish.string
161 notification.title = String(format: format, number as NSNumber)
162 notification.informativeText = notification.title
164 if UserDefaults.standard[.playFinishKenzoSound] {
166 notification.soundName = NSUserNotificationDefaultSoundName
169 NSUserNotificationCenter.default.deliver(notification)
176 extension KenzoDockStatus: KenzoDockStatusObserverDelegate {
178 func didChangeState(dock: KenzoDock) {
180 rawState = dock.state
181 completeTime = dock.complete_time