OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / PeriodicNotifier.swift
1 //
2 //  PeriodicNotifier.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/03.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 extension Notification.Name {
12     
13     static let Periodic = Notification.Name("com.masakih.KCD.Notification.Periodic")
14 }
15
16 final class PeriodicNotifier: NSObject {
17     
18     private let hour: Int
19     private let minutes: Int
20     
21     init(hour: Int, minutes: Int) {
22         
23         self.hour = hour
24         self.minutes = minutes
25         
26         super.init()
27         
28         let nc = NotificationCenter.default
29         nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil, using: notify)
30         nc.addObserver(forName: .NSSystemClockDidChange, object: nil, queue: nil, using: notify)
31         NSWorkspace.shared.notificationCenter
32             .addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: nil, using: notify)
33     }
34     
35     private func notify(_ notification: Notification) {
36         
37         notifyIfNeeded(nil)
38     }
39     
40     @objc private func notifyIfNeeded(_ timer: Timer?) {
41         
42         let now = Date(timeIntervalSinceNow: 0.0)
43         var currentDay = Calendar.current.dateComponents([.era, .year, .month, .day], from: now)
44         currentDay.hour = hour
45         currentDay.minute = minutes
46         
47         if let notifyDate = Calendar.current.date(from: currentDay),
48             now.compare(notifyDate) == .orderedDescending {
49             
50             currentDay.day? += 1
51             NotificationCenter.default.post(name: .Periodic, object: self)
52         }
53         
54         timer?.invalidate()
55         
56         guard let nextNotifyDate = Calendar.current.date(from: currentDay) else {
57             
58             Logger.shared.log("Can not create time of notify")
59             
60             return
61         }
62         
63         Timer.scheduledTimer(timeInterval: nextNotifyDate.timeIntervalSinceNow + 0.1,
64                              target: self,
65                              selector: #selector(PeriodicNotifier.notifyIfNeeded(_:)),
66                              userInfo: nil,
67                              repeats: false)
68     }
69 }