diff --git a/main.go b/main.go index 7bc487a..84be626 100644 --- a/main.go +++ b/main.go @@ -61,6 +61,11 @@ func main() { for i := 0; i < *days; i++ { date := now.Add(time.Duration(i * 24) * time.Hour) + eventMap, err := getDayEvents(srv, myCal.Id, date) + if err != nil { + log.Fatal(err) + } + for _, class := range classes { if !class.happensOnDay(date) { continue @@ -68,54 +73,88 @@ func main() { ev := class.buildEvent(date) - _, err := srv.Events.Insert(myCal.Id, ev).Do() - if err != nil { - log.Fatal(err) + old := eventMap[ev.Summary] + + if old == nil { + log.Printf("add: [%s] %s", ev.Start.DateTime, ev.Summary) + _, err := srv.Events.Insert(myCal.Id, ev).Do() + if err != nil { + log.Fatal(err) + } + } else { + if !eventsEqual(old, ev) { + log.Printf("upd: [%s] %s", ev.Start.DateTime, ev.Summary) + _, err := srv.Events.Update(myCal.Id, old.Id, ev).Do() + if err != nil { + log.Fatal(err) + } + } } } } +} +func getDayEvents(srv *calendar.Service, calendarId string, t time.Time) (map[string]*calendar.Event, error) { + start := time.Date( + t.Year(), + t.Month(), + t.Day(), + 0, 0, 0, 0, + t.Location()) - /* - ev := &calendar.Event{ - Summary: "Test event", - Start: &calendar.EventDateTime{ - DateTime: "2020-09-09T16:00:00", - TimeZone: "US/Pacific", - }, - End: &calendar.EventDateTime{ - DateTime: "2020-09-09T17:00:00", - TimeZone: "US/Pacific", - }, - Attendees: []*calendar.EventAttendee{ - &calendar.EventAttendee{ - Email: "oliver.park@heliosns.org", - }, - }, - } + // This may be wrong for DST changes, but it's the middle of the night and probably doesn't matter + end := start.Add(24 * time.Hour) - res, err := srv.Events.Insert(myCal.Id, ev).Do() + events, err := srv.Events.List(calendarId). + ShowDeleted(false). + SingleEvents(true). + TimeMin(start.Format(time.RFC3339)). + TimeMax(end.Format(time.RFC3339)). + MaxResults(250). + Do() if err != nil { - log.Fatal(err) + return nil, err } - log.Printf("%#v", res) - */ - - /* - t := time.Now().Format(time.RFC3339) - events, err := srv.Events.List(myCal.Id).ShowDeleted(false). - SingleEvents(true).TimeMin(t).MaxResults(250).OrderBy("startTime").Do() - if err != nil { - log.Fatal(err) - } + eventMap := map[string]*calendar.Event{} for _, item := range events.Items { - date := item.Start.DateTime - if date == "" { - date = item.Start.Date - } - log.Printf("%v (%v)", item.Summary, date) + eventMap[item.Summary] = item } - */ + + return eventMap, nil +} + +func eventsEqual(a *calendar.Event, b *calendar.Event) bool { + if a.Summary != b.Summary { + return false + } + + if a.Description != b.Description { + return false + } + + if a.Start.DateTime[:19] != b.Start.DateTime[:19] { + return false + } + + if a.End.DateTime[:19] != b.End.DateTime[:19] { + return false + } + + if len(a.Attendees) != len(b.Attendees) { + return false + } + + emails := map[string]bool{} + for _, attendee := range a.Attendees { + emails[attendee.Email] = true + } + for _, attendee := range b.Attendees { + if !emails[attendee.Email] { + return false + } + } + + return true }