Created
August 28, 2017 03:00
-
-
Save harlanhaskins/3afa273bc13e8ff240b760bebc406acd to your computer and use it in GitHub Desktop.
Fixes TigerCenter Calendars on the macOS calendar app
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env swift | |
import EventKit | |
let eventStore = EKEventStore() | |
extension String: Error {} | |
func deleteBadEvents(calendarName: String) throws { | |
// Make dates for Fall Semester 2017 before exams | |
let startDate = Calendar.current.date(from: | |
DateComponents(year: 2017, month: 8, day: 28))! | |
let endDate = Calendar.current.date(from: | |
DateComponents(year: 2017, month: 12, day: 12))! | |
// Find the specified RIT calendar | |
let calendars = eventStore.calendars(for: .event) | |
guard let rit = calendars.first(where: { $0.title == calendarName }) else { | |
throw "Unknown calendar '\(calendarName)'" | |
} | |
// Get all events within the date range | |
let eventPredicate = eventStore.predicateForEvents(withStart: startDate, | |
end: endDate, | |
calendars: [rit]) | |
let events = eventStore.events(matching: eventPredicate) | |
// Events with no occurrenceDate are standalone as they aren't | |
// considered repeating. | |
let toDelete = events.filter { $0.occurrenceDate == nil } | |
guard !toDelete.isEmpty else { | |
throw "No events to delete" | |
} | |
print("This will delete the following \(toDelete.count) events:") | |
for event in toDelete { | |
print(" \(event.title!): \(event.startDate!)") | |
} | |
print("Are you sure you wish to delete these events? [y|N]") | |
let line = readLine(strippingNewline: true)! | |
if line.lowercased().contains("y") { | |
for event in toDelete { | |
// Remove all standalone events. | |
try eventStore.remove(event, span: .thisEvent, commit: false) | |
} | |
try eventStore.commit() | |
} else { | |
print("Not deleting events") | |
} | |
} | |
func err(_ value: Any) -> Never { | |
print("error: \(value)") | |
exit(-1) | |
} | |
let semaphore = DispatchSemaphore(value: 0) | |
eventStore.requestAccess(to: .event) { granted, error in | |
defer { semaphore.signal() } | |
if let error = error { | |
err(error) | |
} | |
guard granted else { | |
err("You need to grant calendar access to use this script") | |
} | |
do { | |
print("RIT Calendar Name: ", terminator: "") | |
let name = readLine(strippingNewline: true)! | |
try deleteBadEvents(calendarName: name) | |
} catch { | |
err(error) | |
} | |
} | |
// Keep the main queue alive long enough to run the completion. | |
semaphore.wait() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment