OSDN Git Service

Swift4.2にコンパート
[kcd/KCD.git] / KCD / TimeSignalNotifier.swift
1 //
2 //  TimeSignalNotifier.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/21.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class TimeSignalNotifier: NSObject {
12     
13     let udController: NSUserDefaultsController = NSUserDefaultsController.shared
14     
15     override init() {
16         
17         super.init()
18         
19         registerTimer()
20         bind(NSBindingName(#keyPath(notifyTimeBeforeTimeSignal)),
21              to: udController,
22              withKeyPath: "values.notifyTimeBeforeTimeSignal")
23     }
24     
25     deinit {
26         
27         unbind(NSBindingName(#keyPath(notifyTimeBeforeTimeSignal)))
28     }
29     
30     @objc dynamic var notifyTimeBeforeTimeSignal: Int = 0 {
31         
32         didSet { registerTimer() }
33     }
34     var timer: Timer?
35     
36     @objc func fire(_ timer: Timer) {
37         
38         defer { registerTimer() }
39         
40         guard UserDefaults.standard[.notifyTimeSignal] else {
41             
42             return
43         }
44         
45         let now = Date()
46         let cal = Calendar.current
47         let minutes = cal.component(.minute, from: now)
48         
49         if (59 - minutes) > notifyTimeBeforeTimeSignal {
50             
51             return
52         }
53         
54         let notification = NSUserNotification()
55         let hour = cal.component(.hour, from: now)
56         let format = LocalizedStrings.timerSIgnalMessage.string
57         notification.title = String(format: format, hour + 1)
58         notification.informativeText = notification.title
59         
60         if UserDefaults.standard[.playNotifyTimeSignalSound] {
61             
62             notification.soundName = NSUserNotificationDefaultSoundName
63         }
64         
65         NSUserNotificationCenter.default.deliver(notification)
66     }
67     
68     private func registerTimer() {
69         
70         timer?.invalidate()
71         
72         let now = Date()
73         let cal = Calendar.current
74         var comp = cal.dateComponents([.year, .month, .day, .hour], from: now)
75         let minutes = cal.component(.minute, from: now)
76         if minutes + notifyTimeBeforeTimeSignal >= 60 {
77             
78             comp.hour = comp.hour.map { $0 + 1 }
79         }
80         comp.minute = 60 - notifyTimeBeforeTimeSignal
81         guard let notifyDate = cal.date(from: comp) else {
82             
83             Logger.shared.log("Can not create notify date")
84             
85             return
86         }
87         
88         timer = Timer.scheduledTimer(timeInterval: notifyDate.timeIntervalSinceNow,
89                                      target: self,
90                                      selector: #selector(TimeSignalNotifier.fire(_:)),
91                                      userInfo: nil,
92                                      repeats: false)
93     }
94 }