Update existing events on change
This commit is contained in:
115
main.go
115
main.go
@@ -61,6 +61,11 @@ func main() {
|
|||||||
for i := 0; i < *days; i++ {
|
for i := 0; i < *days; i++ {
|
||||||
date := now.Add(time.Duration(i * 24) * time.Hour)
|
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 {
|
for _, class := range classes {
|
||||||
if !class.happensOnDay(date) {
|
if !class.happensOnDay(date) {
|
||||||
continue
|
continue
|
||||||
@@ -68,54 +73,88 @@ func main() {
|
|||||||
|
|
||||||
ev := class.buildEvent(date)
|
ev := class.buildEvent(date)
|
||||||
|
|
||||||
_, err := srv.Events.Insert(myCal.Id, ev).Do()
|
old := eventMap[ev.Summary]
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
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())
|
||||||
|
|
||||||
/*
|
// This may be wrong for DST changes, but it's the middle of the night and probably doesn't matter
|
||||||
ev := &calendar.Event{
|
end := start.Add(24 * time.Hour)
|
||||||
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",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("%#v", res)
|
eventMap := map[string]*calendar.Event{}
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, item := range events.Items {
|
for _, item := range events.Items {
|
||||||
date := item.Start.DateTime
|
eventMap[item.Summary] = item
|
||||||
if date == "" {
|
|
||||||
date = item.Start.Date
|
|
||||||
}
|
|
||||||
log.Printf("%v (%v)", item.Summary, date)
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user