Skip to content

Instantly share code, notes, and snippets.

@harlanhaskins
Created August 28, 2017 03:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save harlanhaskins/3afa273bc13e8ff240b760bebc406acd to your computer and use it in GitHub Desktop.
Save harlanhaskins/3afa273bc13e8ff240b760bebc406acd to your computer and use it in GitHub Desktop.
Fixes TigerCenter Calendars on the macOS calendar app
#!/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