diff --git a/gcal/client.go b/gcal/client.go old mode 100644 new mode 100755 index 59f5982c..f5cf2cfb --- a/gcal/client.go +++ b/gcal/client.go @@ -16,6 +16,7 @@ import ( "os" "os/user" "path/filepath" + "sort" "time" "github.com/senorprogrammer/wtf/wtf" @@ -47,14 +48,56 @@ func Fetch() (*calendar.Events, error) { return nil, err } - startTime := fromMidnight().Format(time.RFC3339) - eventLimit := int64(wtf.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(wtf.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 1e58a031..c29d76e0 --- a/gcal/widget.go +++ b/gcal/widget.go @@ -129,8 +129,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"