2 // NyukyoDockStatus.swift
5 // Created by Hori,Masaki on 2017/01/23.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 protocol NyukyoDockStatusObserver: class {
13 func didUpdate(state: NyukyoDockStatus)
16 protocol NyukyoDockObserverDelegate: class {
18 func didChangeState(dock: NyukyoDock)
21 final class NyukyoDockObserver {
23 private let dock: NyukyoDock
24 private var observation: NSKeyValueObservation?
26 weak var delegate: NyukyoDockObserverDelegate? {
29 delegate?.didChangeState(dock: dock)
33 init(dock: NyukyoDock) {
37 observation = dock.observe(\NyukyoDock.state) { _, _ in
39 self.delegate?.didChangeState(dock: self.dock)
44 final class NyukyoDockStatus: NSObject {
46 private enum DockState: Int {
55 static func valid(number: Int) -> Bool {
57 return 1...4 ~= number
61 private let observer: NyukyoDockObserver
63 private(set) var name: String?
64 private(set) var time: TimeInterval?
66 private var state: DockState = .unknown
68 private var rawState: Int = 0 {
72 state = DockState(rawValue: rawState) ?? .unknown
75 private var shipId: Int = 0
76 private var completeTime: Int = 0
78 private var didNotify = false
80 weak var delegate: NyukyoDockStatusObserver?
82 /// CAUTION: 初回起動時/マスタ更新時にはデータがないので失敗する
85 guard NyukyoDockStatus.valid(number: number) else {
92 guard let dock = ServerDataStore.default.nyukyoDock(by: number) else {
97 self.observer = NyukyoDockObserver(dock: dock)
101 observer.delegate = self
104 private func updateState() {
114 name = ServerDataStore.default.ship(by: shipId)?.name ?? "Unknown"
117 Logger.shared.log("unknown State")
121 delegate?.didUpdate(state: self)
125 extension NyukyoDockStatus: DockInformationUpdater {
131 delegate?.didUpdate(state: self)
134 guard let name = name else {
139 let compTime = TimeInterval(Int(completeTime / 1_000))
140 let diff = compTime - Date().timeIntervalSince1970
142 // set to 0. if diff is less than 0.
145 // notify UserNotification.
155 let notification = NSUserNotification()
156 let format = LocalizedStrings.dockingWillFinish.string
157 notification.title = String(format: format, name)
158 notification.informativeText = notification.title
160 if UserDefaults.standard[.playFinishNyukyoSound] {
162 notification.soundName = NSUserNotificationDefaultSoundName
165 NSUserNotificationCenter.default.deliver(notification)
171 extension NyukyoDockStatus: NyukyoDockObserverDelegate {
173 func didChangeState(dock: NyukyoDock) {
175 rawState = dock.state
176 shipId = dock.ship_id
177 completeTime = dock.complete_time