From 96e0606c6aa05f19c67e8f4542c3cdc1f0375779 Mon Sep 17 00:00:00 2001 From: Lassi Piironen Date: Sat, 16 Jun 2018 23:37:02 +0300 Subject: [PATCH] Google Calendar: the client reads all the events the user can write on instead of just the accounts primary events, the timestamp printing of the all-day events is handled --- gcal/client.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++---- gcal/widget.go | 9 +++++++-- wtf/utils.go | 1 + 3 files changed, 56 insertions(+), 6 deletions(-) mode change 100644 => 100755 gcal/client.go mode change 100644 => 100755 gcal/widget.go mode change 100644 => 100755 wtf/utils.go diff --git a/gcal/client.go b/gcal/client.go old mode 100644 new mode 100755 index de655620..922a32f1 --- a/gcal/client.go +++ b/gcal/client.go @@ -17,6 +17,7 @@ import ( "os/user" "path/filepath" "time" + "sort" "github.com/senorprogrammer/wtf/wtf" "golang.org/x/oauth2" @@ -47,14 +48,57 @@ func Fetch() (*calendar.Events, error) { return nil, err } - startTime := fromMidnight().Format(time.RFC3339) - eventLimit := int64(Config.UInt("wtf.mods.gcal.eventCount", 10)) - events, err := srv.Events.List("primary").ShowDeleted(false).SingleEvents(true).TimeMin(startTime).MaxResults(eventLimit).OrderBy("startTime").Do() + // Get all user calendars with at the least writing access + pageToken := "" + var calendarIds []string + for { + calendarList, err := srv.CalendarList.List().ShowHidden(false).MinAccessRole("writer").PageToken(pageToken).Do() + for _, calendarListItem := range calendarList.Items { + calendarIds = append(calendarIds, calendarListItem.Id) + } + + pageToken = calendarList.NextPageToken + if err != nil || pageToken == "" { + break + } + } if err != nil { return nil, err } - return events, err + // Get calendar events + var events calendar.Events + + startTime := fromMidnight().Format(time.RFC3339) + eventLimit := int64(Config.UInt("wtf.mods.gcal.eventCount", 10)) + + for _, calendarId := range calendarIds { + calendarEvents, err := srv.Events.List(calendarId).ShowDeleted(false).TimeMin(startTime).MaxResults(eventLimit).SingleEvents(true).OrderBy("startTime").Do() + if err != nil { + break + } + events.Items = append(events.Items, calendarEvents.Items...) + } + if err != nil { + return nil, err + } + + // Sort events + timeDateChooser := func(event *calendar.Event) (time.Time, error) { + if len(event.Start.Date) > 0 { + return time.Parse("2006-01-02", event.Start.Date) + } else { + return time.Parse(time.RFC3339, event.Start.DateTime) + } + } + sort.Slice(events.Items, func(i, j int) bool { + dateA, _ := timeDateChooser(events.Items[i]) + dateB, _ := timeDateChooser(events.Items[j]) + return dateA.Before(dateB) + }) + + + return &events, err } /* -------------------- Unexported Functions -------------------- */ diff --git a/gcal/widget.go b/gcal/widget.go old mode 100644 new mode 100755 index 487c8daa..81dc6422 --- a/gcal/widget.go +++ b/gcal/widget.go @@ -133,8 +133,13 @@ func (widget *Widget) eventSummary(event *calendar.Event, conflict bool) string } func (widget *Widget) eventTimestamp(event *calendar.Event) string { - startTime, _ := time.Parse(time.RFC3339, event.Start.DateTime) - return startTime.Format(wtf.FriendlyDateTimeFormat) + if len(event.Start.Date) > 0 { + startTime, _ := time.Parse("2006-01-02", event.Start.Date) + return startTime.Format(wtf.FriendlyDateFormat) + } else { + startTime, _ := time.Parse(time.RFC3339, event.Start.DateTime) + return startTime.Format(wtf.FriendlyDateTimeFormat) + } } // eventIsNow returns true if the event is happening now, false if it not diff --git a/wtf/utils.go b/wtf/utils.go old mode 100644 new mode 100755 index 78ec3284..c65a925b --- a/wtf/utils.go +++ b/wtf/utils.go @@ -13,6 +13,7 @@ import ( const SimpleDateFormat = "Jan 2" const SimpleTimeFormat = "15:04 MST" +const FriendlyDateFormat = "Mon, Jan 2" const FriendlyDateTimeFormat = "Mon, Jan 2, 15:04" const TimestampFormat = "2006-01-02T15:04:05-0700"