-
Notifications
You must be signed in to change notification settings - Fork 85
/
BlockDayLog.swift
89 lines (72 loc) · 2.37 KB
/
BlockDayLog.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//
// BlockDayLog.swift
// Lockdown
//
// Created by Oleg Dreyman on 22.05.2020.
// Copyright © 2020 Confirmed Inc. All rights reserved.
//
import Foundation
final class BlockDayLog {
static let shared = BlockDayLog()
static let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "h:mm a_"
return formatter
}()
private let processingQueue = DispatchQueue(label: "LockdownBlockDayLogQueue")
private static let kIsBlockLogDisabled = "LockdownIsBlockLogDisabled"
private static let userDefaultsKey = "LockdownDayLogs"
private static let maxSize = 5000
private static let maxReduction = 4500
private init() { }
var isDisabled: Bool {
return defaults.bool(forKey: BlockDayLog.kIsBlockLogDisabled)
}
var isEnabled: Bool {
return !isDisabled
}
private var _dayLog: [Any]? {
#if DEBUG
dispatchPrecondition(condition: .onQueue(processingQueue))
#endif
return defaults.array(forKey: BlockDayLog.userDefaultsKey)
}
var strings: [String]? {
return processingQueue.sync {
self._dayLog as? [String]
}
}
func clear() {
processingQueue.async {
defaults.set([], forKey: BlockDayLog.userDefaultsKey)
}
}
func disable(shouldClear: Bool) {
defaults.set(true, forKey: BlockDayLog.kIsBlockLogDisabled)
if shouldClear {
clear()
}
}
func enable() {
defaults.set(false, forKey: BlockDayLog.kIsBlockLogDisabled)
}
func append(host: String, date: Date) {
guard isDisabled == false else {
// block log is disabled
return
}
processingQueue.async {
let logString = BlockDayLog.dateFormatter.string(from: date) + host
// reduce log size if it's over the maxSize
if var dayLog = self._dayLog {
if dayLog.count > BlockDayLog.maxSize {
dayLog = dayLog.suffix(BlockDayLog.maxReduction)
}
dayLog.append(logString)
defaults.set(dayLog, forKey: BlockDayLog.userDefaultsKey)
} else {
defaults.set([logString], forKey: BlockDayLog.userDefaultsKey)
}
}
}
}