Mercurial > code > home > repos > gcalendarwatch
comparison calsync/gcalclient/gcalclient.go @ 58:6c7151126a0b
logging and refactor
author | drewp@bigasterisk.com |
---|---|
date | Thu, 05 Sep 2024 17:01:23 -0700 |
parents | 24f662799710 |
children | 3b0595c2bf03 |
comparison
equal
deleted
inserted
replaced
57:24f662799710 | 58:6c7151126a0b |
---|---|
10 "crypto/md5" | 10 "crypto/md5" |
11 "fmt" | 11 "fmt" |
12 "log" | 12 "log" |
13 "net/url" | 13 "net/url" |
14 "strings" | 14 "strings" |
15 "time" | |
16 | 15 |
17 "bigasterisk.com/go/gcalendarwatch/mongoclient" | |
18 "google.golang.org/api/calendar/v3" | 16 "google.golang.org/api/calendar/v3" |
19 ) | 17 ) |
20 | 18 |
21 const urlBase = "http://bigasterisk.com/calendar/" | 19 const urlBase = "http://bigasterisk.com/calendar/" |
22 | 20 |
39 func MakeEventUrl(calUrl string, evId string) string { | 37 func MakeEventUrl(calUrl string, evId string) string { |
40 return calUrl + "/" + url.QueryEscape(evId) | 38 return calUrl + "/" + url.QueryEscape(evId) |
41 } | 39 } |
42 | 40 |
43 func New(ctx context.Context) (*GCalClient, error) { | 41 func New(ctx context.Context) (*GCalClient, error) { |
44 err, srv := newService(ctx) | 42 srv, err := newService(ctx) |
45 if err != nil { | 43 if err != nil { |
46 log.Fatalf("Unable to retrieve Calendar client: %v", err) | 44 log.Fatalf("Unable to retrieve Calendar client: %v", err) |
47 } | 45 } |
48 return &GCalClient{ctx, srv}, nil | 46 return &GCalClient{ctx, srv}, nil |
49 } | 47 } |
57 list, err := gc.srv.CalendarList.List().MaxResults( /*maxResults*/ 100).Do() | 55 list, err := gc.srv.CalendarList.List().MaxResults( /*maxResults*/ 100).Do() |
58 if err != nil { | 56 if err != nil { |
59 return nil, err | 57 return nil, err |
60 } | 58 } |
61 | 59 |
62 // do not submit | 60 // todo: do not submit |
63 debugFilterCals(list) | 61 debugFilterCals(list) |
64 | 62 |
65 return list.Items, nil | 63 return list.Items, nil |
66 } | 64 } |
67 | 65 |
74 } | 72 } |
75 } | 73 } |
76 list.Items = ret | 74 list.Items = ret |
77 } | 75 } |
78 | 76 |
79 | |
80 func shortDebugHash(pageToken string) string { | 77 func shortDebugHash(pageToken string) string { |
81 if pageToken == "" { | 78 if pageToken == "" { |
82 return "(empty)" | 79 return "(empty)" |
83 } | 80 } |
84 return fmt.Sprintf("%x", md5.Sum([]byte(pageToken))) | 81 return fmt.Sprintf("%x", md5.Sum([]byte(pageToken))) |
85 } | 82 } |
86 | |
87 func (gc *GCalClient) ListEventsInRange(cal mongoclient.MongoCal, t1, t2 time.Time) ( | |
88 events []CalendarEvent, nextSyncToken string, err error) { | |
89 mongoclient.LogWithCal(cal, "ListEventsInRange", t1, "to", t2) | |
90 | |
91 call := func(pageToken string) *calendar.EventsListCall { | |
92 return rangedEventsCall(gc.srv, cal.GoogleId, t1, t2, pageToken) | |
93 } | |
94 events, nextSyncToken, err = readEventsPages(cal, call) | |
95 if err != nil { | |
96 return nil, "", err | |
97 } | |
98 | |
99 return events, nextSyncToken, nil | |
100 } | |
101 | |
102 func (gc *GCalClient) ListEventUpdates(cal mongoclient.MongoCal, syncToken string) ( | |
103 events []CalendarEvent, nextSyncToken string, err error) { | |
104 mongoclient.LogWithCal(cal, "ListEventUpdates", syncToken) | |
105 | |
106 call := func(pageToken string) *calendar.EventsListCall { | |
107 return syncEventsCall(gc.srv, cal.GoogleId, syncToken, pageToken) | |
108 } | |
109 events, nextSyncToken, err = readEventsPages(cal, call) | |
110 if err != nil { | |
111 return nil, "", err | |
112 } | |
113 | |
114 return events, nextSyncToken, nil | |
115 } | |
116 | |
117 func readEventsPages(cal mongoclient.MongoCal, call func(string) *calendar.EventsListCall) ( | |
118 events []CalendarEvent, syncToken string, err error) { | |
119 | |
120 events = make([]CalendarEvent, 0) | |
121 err = nil | |
122 | |
123 pageToken := "" | |
124 for { | |
125 mongoclient.LogWithCal(cal, "getting another page", shortDebugHash(pageToken)) | |
126 pageResult, err2 := call(pageToken).Do() | |
127 if err2 != nil { | |
128 log.Fatal(err2) | |
129 return nil, "", err2 | |
130 } | |
131 | |
132 // Placement is important! This must run even if the result set is empty. | |
133 syncToken = pageResult.NextSyncToken | |
134 | |
135 mongoclient.LogWithCal(cal, "got page with", len(pageResult.Items), "events") | |
136 if len(pageResult.Items) == 0 { | |
137 break | |
138 } | |
139 | |
140 for _, ev := range pageResult.Items { | |
141 if ev.Status == "cancelled" { | |
142 log.Fatal("todo") | |
143 } | |
144 events = append(events, CalendarEvent{ | |
145 Event: ev, | |
146 CalendarUrl: cal.Url, | |
147 EventUrl: MakeEventUrl(cal.Url, ev.Id), | |
148 }) | |
149 } | |
150 | |
151 | |
152 | |
153 if pageResult.NextPageToken == "" { | |
154 break | |
155 } | |
156 pageToken = pageResult.NextPageToken | |
157 } | |
158 mongoclient.LogWithCal(cal, "total events read: ", len(events), "with syncToken", syncToken) | |
159 return events, syncToken, nil | |
160 } |