1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package widget
- import (
- "context"
- "fmt"
- "html/template"
- "github.com/glanceapp/glance/internal/assets"
- "github.com/glanceapp/glance/internal/feed"
- )
- type Weather struct {
- widgetBase `yaml:",inline"`
- Location string `yaml:"location"`
- ShowAreaName bool `yaml:"show-area-name"`
- HideLocation bool `yaml:"hide-location"`
- HourFormat string `yaml:"hour-format"`
- Units string `yaml:"units"`
- Place *feed.PlaceJson `yaml:"-"`
- Weather *feed.Weather `yaml:"-"`
- TimeLabels [12]string `yaml:"-"`
- }
- var timeLabels12h = [12]string{"2am", "4am", "6am", "8am", "10am", "12pm", "2pm", "4pm", "6pm", "8pm", "10pm", "12am"}
- var timeLabels24h = [12]string{"02:00", "04:00", "06:00", "08:00", "10:00", "12:00", "14:00", "16:00", "18:00", "20:00", "22:00", "00:00"}
- func (widget *Weather) Initialize() error {
- widget.withTitle("Weather").withCacheOnTheHour()
- if widget.Location == "" {
- return fmt.Errorf("location must be specified for weather widget")
- }
- if widget.HourFormat == "" || widget.HourFormat == "12h" {
- widget.TimeLabels = timeLabels12h
- } else if widget.HourFormat == "24h" {
- widget.TimeLabels = timeLabels24h
- } else {
- return fmt.Errorf("invalid hour format '%s' for weather widget, must be either 12h or 24h", widget.HourFormat)
- }
- if widget.Units == "" {
- widget.Units = "metric"
- } else if widget.Units != "metric" && widget.Units != "imperial" {
- return fmt.Errorf("invalid units '%s' for weather, must be either metric or imperial", widget.Units)
- }
- return nil
- }
- func (widget *Weather) Update(ctx context.Context) {
- if widget.Place == nil {
- place, err := feed.FetchPlaceFromName(widget.Location)
- if err != nil {
- widget.withError(err).scheduleEarlyUpdate()
- return
- }
- widget.Place = place
- }
- weather, err := feed.FetchWeatherForPlace(widget.Place, widget.Units)
- if !widget.canContinueUpdateAfterHandlingErr(err) {
- return
- }
- widget.Weather = weather
- }
- func (widget *Weather) Render() template.HTML {
- return widget.render(widget, assets.WeatherTemplate)
- }
|