From 53ccdd0b564ddea12f58f31708db3e148cde0a94 Mon Sep 17 00:00:00 2001 From: Andrew Karnani Date: Tue, 26 Oct 2021 11:36:50 -0700 Subject: [PATCH] Handle duplicate event ids in calendar urls --- main.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 8621f3f..17135d5 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "crypto/sha256" + "errors" "fmt" "io/ioutil" "log" @@ -15,6 +16,7 @@ import ( "github.com/akarnani/webcal_sync/gcal" "github.com/apognu/gocal" "google.golang.org/api/calendar/v3" + "google.golang.org/api/googleapi" ) var dateFormatFix = regexp.MustCompile(`(?m)^(DTSTAMP:.*)T(.*)$`) @@ -63,12 +65,22 @@ func diffEvents(cfg Config, up []gocal.Event, gevent []*calendar.Event) ([]*cale ids[e.ICalUID] = e } + seenIds := make(map[string]interface{}) + for _, e := range up { if (*e.Start).Before(time.Now()) { continue } i := getIDForEvent(cfg, e) + + if _, ok := seenIds[i]; ok { + log.Printf("ID %s is a duplicate, not processing", i) + continue + } + + seenIds[i] = nil + g, ok := ids[i] delete(ids, i) if !ok { @@ -170,18 +182,27 @@ func getIDForEvent(cfg Config, e gocal.Event) string { case "": return e.Uid default: - panic(fmt.Sprintf("unknown id format %s", cfg.IDFormat)) + log.Panicf("unknown id format %s", cfg.IDFormat) } + + //can't be reached due to default's Panicf + return "" } func main() { client := gcal.NewClient() for _, cfg := range getConfig() { + log.Printf("Starting on calendar %s", cfg.URL) c, u, d := diffEvents(cfg, parseICal(cfg.URL), client.GetEventsForAttribute(map[string]string{"url": fmt.Sprintf("%x", sha256.Sum256([]byte(cfg.URL)))})) - fmt.Println(cfg.URL, len(c), len(u), len(d)) + log.Println(cfg.URL, len(c), len(u), len(d)) for _, e := range c { if err := client.CreateEvent(e); err != nil { + var gErr *googleapi.Error + if errors.As(err, &gErr) && gErr.Code == http.StatusConflict { + log.Printf("Event already existed: %v, %v", e, gErr) + continue + } log.Fatalf("failed to create event: %v", err) } } @@ -197,5 +218,7 @@ func main() { } } + log.Printf("finished with calendar") + } }