90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
package widgets
|
|
|
|
import (
|
|
"ArinDash/apis/calendar"
|
|
"ArinDash/util"
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/mum4k/termdash/cell"
|
|
"github.com/mum4k/termdash/terminal/terminalapi"
|
|
"github.com/mum4k/termdash/widgetapi"
|
|
"github.com/mum4k/termdash/widgets/text"
|
|
)
|
|
|
|
type CalendarEventsOptions struct {
|
|
}
|
|
|
|
func CalendarEvents() CalendarEventsOptions {
|
|
widgetOptions["CalendarEventsOptions"] = createCalendarEventsOptions
|
|
return CalendarEventsOptions{}
|
|
}
|
|
|
|
func createCalendarEventsOptions(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
|
|
widget := util.PanicOnErrorWithResult(text.New(text.WrapAtWords()))
|
|
go util.Periodic(ctx, 1*time.Hour, func() error {
|
|
widget.Reset()
|
|
calendarEvents := calendar.FetchEvents()
|
|
for _, event := range calendarEvents {
|
|
var color cell.Color
|
|
onlySummary := false
|
|
if isToday(event.Start) {
|
|
color = cell.ColorGreen
|
|
} else if event.Start.After(time.Now().AddDate(0, 0, 7)) {
|
|
color = cell.ColorGray
|
|
onlySummary = true
|
|
} else {
|
|
color = cell.ColorWhite
|
|
}
|
|
summary := event.Summary
|
|
if onlySummary {
|
|
summary = fmt.Sprintf("%s %s", event.Start.Format(time.DateOnly), event.Summary)
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s %s\n", event.Icon, summary), text.WriteCellOpts(cell.FgColor(color), cell.Bold())); err != nil {
|
|
return err
|
|
}
|
|
if !onlySummary {
|
|
var date string
|
|
if event.Start == event.End {
|
|
date = formatDate(event.Start)
|
|
} else {
|
|
date = fmt.Sprintf("%s - %s", formatDate(event.Start), formatDate(event.End))
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n", date), text.WriteCellOpts(cell.FgColor(color), cell.Dim())); err != nil {
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n", event.Description), text.WriteCellOpts(cell.FgColor(color))); err != nil {
|
|
return err
|
|
}
|
|
if err := widget.Write(fmt.Sprintf("%s\n\n", event.Location), text.WriteCellOpts(cell.FgColor(color))); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return widget
|
|
}
|
|
|
|
func isToday(date time.Time) bool {
|
|
year, month, day := date.Date()
|
|
return year == time.Now().Year() && month == time.Now().Month() && day == time.Now().Day()
|
|
}
|
|
|
|
func isTomorrow(date time.Time) bool {
|
|
year, month, day := date.Date()
|
|
return year == time.Now().Year() && month == time.Now().Month() && day == time.Now().AddDate(0, 0, 1).Day()
|
|
}
|
|
|
|
func formatDate(date time.Time) string {
|
|
if isToday(date) {
|
|
return fmt.Sprintf("Today at %s", date.Format(time.TimeOnly))
|
|
} else if isTomorrow(date) {
|
|
return fmt.Sprintf("Tomorrow at %s", date.Format(time.TimeOnly))
|
|
}
|
|
return date.Format(time.DateTime)
|
|
}
|