Mercurial > code > home > repos > gcalendarwatch
changeset 54:3a12a3ac9164
refactor. run 30s forever. doesn't work on 2+ cals
author | drewp@bigasterisk.com |
---|---|
date | Tue, 20 Aug 2024 12:18:46 -0700 |
parents | f248f018a663 |
children | 627c815f83bb |
files | calsync/event_sync.go calsync/gcalclient/gcalclient.go |
diffstat | 2 files changed, 70 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/calsync/event_sync.go Mon Aug 19 19:28:50 2024 -0700 +++ b/calsync/event_sync.go Tue Aug 20 12:18:46 2024 -0700 @@ -27,7 +27,7 @@ ), ) } else { - log.Println("cal", ev.CalId, "ready for cleanup - todo") + log.Println("cal", ev.CalId, "ready for cleanup") log.Println("t=", t) mc.DeleteEventsUpdatedBefore(t) }
--- a/calsync/gcalclient/gcalclient.go Mon Aug 19 19:28:50 2024 -0700 +++ b/calsync/gcalclient/gcalclient.go Tue Aug 20 12:18:46 2024 -0700 @@ -11,6 +11,8 @@ "google.golang.org/api/calendar/v3" ) +const urlBase = "http://bigasterisk.com/calendar/" + type GCalClient struct { ctx context.Context srv *calendar.Service @@ -24,7 +26,7 @@ } func MakeCalUrl(calId string) string { - return "http://bigasterisk.com/calendar/" + url.QueryEscape(calId) + return urlBase + url.QueryEscape(calId) } func MakeEventUrl(calUrl string, evId string) string { @@ -72,75 +74,90 @@ initialFillStart, initialFillEnd time.Time, out chan *FindEventsMessage, ) error { - cals, err := mc.GetAllCals() if err != nil { return err } log.Println("reading", len(cals), "calendars") for calNum, cal := range cals { - t := time.Now() - log.Println(" cal", calNum, cal.Url) - log.Println(" cal", calNum, "readEventsInRange", "from", initialFillStart, "to", initialFillEnd) - syncToken, err := gc.readEventsInRange(&cal, initialFillStart, initialFillEnd, out) - if err != nil { - return err - } - - out <- &FindEventsMessage{nil, cal.GoogleId, t} - - ew := gc.NewEventWatch(&cal, t, syncToken, out) - - for loop := 0; loop < 30; loop++ { - log.Println("") - log.Println("tail loop", loop, "for", cal.Url) - err := ew.GetMoreEvents() - if err != nil { - return err - } - time.Sleep(2 * time.Second) - } + go calRoutine(calNum, cal, initialFillStart, initialFillEnd, gc, out) } return nil } +func calRoutine(calNum int, cal mongoclient.MongoCal, initialFillStart time.Time, initialFillEnd time.Time, gc *GCalClient, out chan *FindEventsMessage) bool { + t := time.Now() + log.Println(" cal", calNum, cal.Url) + log.Println(" cal", calNum, "readEventsInRange", "from", initialFillStart, "to", initialFillEnd) + syncToken, err := gc.readEventsInRange(&cal, initialFillStart, initialFillEnd, out) + if err != nil { + log.Panicln(err) + return true + } + + out <- &FindEventsMessage{nil, cal.GoogleId, t} + + ew := gc.NewEventWatch(&cal, t, syncToken, out) + + for loop := 0; ; loop++ { + log.Println("") + log.Println("tail loop", loop, "for", cal.Url) + err := ew.GetMoreEvents() + if err != nil { + log.Panicln(err) + return true + } + time.Sleep(10 * time.Minute) + } + +} + // Synchronous. -func (gc *GCalClient) readEventsInRange( - cal *mongoclient.MongoCal, - initialFillStart, initialFillEnd time.Time, - out chan *FindEventsMessage, -) (string, error) { - log.Println( - " get initial events for", cal.Url, "between", - initialFillStart, "and", initialFillEnd) +func (gc *GCalClient) readEventsInRange(cal *mongoclient.MongoCal, t1, t2 time.Time, out chan *FindEventsMessage) (string, error) { + log.Println(" get initial events for", cal.Url, "between", t1, "and", t2) pageToken := "" syncToken := "" - + var err error + var done bool for { - log.Println(" getting another page", pageToken) - events, err := rangedEventsCall(gc.srv, cal.GoogleId, initialFillStart, initialFillEnd, pageToken).Do() + done, syncToken, pageToken, err = readEventsPage(gc, cal, t1, t2, pageToken, out) if err != nil { return "", err } - - log.Println(" got", len(events.Items), "events, sync=", events.NextSyncToken) - if len(events.Items) == 0 { + if done { break } - - sendEvents(events, cal, out) - - syncToken = events.NextSyncToken - if events.NextPageToken == "" { - break - } - pageToken = events.NextPageToken } return syncToken, nil } +func readEventsPage(gc *GCalClient, cal *mongoclient.MongoCal, t1, t2 time.Time, pageToken string, out chan *FindEventsMessage) (done bool, syncToken, nextPageToken string, err error) { + log.Println(" getting another page", pageToken) + events, err := rangedEventsCall(gc.srv, cal.GoogleId, t1, t2, pageToken).Do() + if err != nil { + return + } + + log.Println(" got", len(events.Items), "events, sync=", events.NextSyncToken) + if len(events.Items) == 0 { + done = true + return + } + + sendEvents(events, cal, out) + + syncToken = events.NextSyncToken + if events.NextPageToken == "" { + done = true + return + } + nextPageToken = events.NextPageToken + syncToken = events.NextSyncToken + return +} + // Send a page of calendar.Events over a channel, as CalendarEvent structs. func sendEvents(events *calendar.Events, cal *mongoclient.MongoCal, out chan *FindEventsMessage) { for _, event := range events.Items { @@ -178,8 +195,8 @@ // Call this when there are likely new changes to sync. func (w *eventWatch) GetMoreEvents() error { call := syncEventsCall(w.gc.srv, w.cal.GoogleId) + log.Println("listing events on", w.cal.GoogleId, "with") - if w.nextPageToken != "" { call = call.PageToken(w.nextPageToken) log.Println(" pageToken", w.nextPageToken) @@ -190,15 +207,14 @@ call = call.UpdatedMin((w.modSince.Format(time.RFC3339))) log.Println(" updatedMin", w.modSince.Format(time.RFC3339)) } - ret, err := call.Do() + events, err := call.Do() if err != nil { return err } - w.nextSyncToken = ret.NextSyncToken - w.nextPageToken = ret.NextPageToken - log.Println(len(ret.Items), "more events received") - sendEvents(ret, w.cal, w.out) - log.Println("got nextSyncToken=", w.nextSyncToken) - log.Println("got nextPageToken=", w.nextPageToken) + w.nextSyncToken = events.NextSyncToken + w.nextPageToken = events.NextPageToken + log.Println(len(events.Items), "more events received") + sendEvents(events, w.cal, w.out) + log.Println("got nextSyncToken=", w.nextSyncToken, " nextPageToken=", w.nextPageToken) return err }