diff options
Diffstat (limited to 'weather')
-rw-r--r-- | weather/weather.go | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/weather/weather.go b/weather/weather.go new file mode 100644 index 0000000..17e8884 --- /dev/null +++ b/weather/weather.go @@ -0,0 +1,106 @@ +// Copyright © 2022 siddharth ravikumar <s@ricketyspace.net> +// SPDX-License-Identifier: ISC + +package weather + +import ( + "fmt" + "strings" + "time" + + "ricketyspace.net/peach/nws" + "ricketyspace.net/peach/version" +) + +type Weather struct { + Title string + Version string + Location string + Now WeatherNow + Q2HTimeline WeatherTimeline // Q2H forecast of the next 12 hours. + BiDailyTimeline WeatherTimeline // BiDaily forecast for the next 3 days. +} + +type WeatherNow struct { + Temperature int + TemperatureUnit string + Forecast string + WindSpeed string + WindDirection string +} + +type WeatherPeriod struct { + Name string + Forecast string + Hour int + Temperature int + TemperatureUnit string +} + +type WeatherTimeline struct { + Periods []WeatherPeriod +} + +func NewWeather(point *nws.Point, f, fh *nws.Forecast) (*Weather, error) { + w := new(Weather) + w.Location = fmt.Sprintf("%s, %s", + strings.ToLower(point.Properties.RelativeLocation.Properties.City), + strings.ToLower(point.Properties.RelativeLocation.Properties.State), + ) + w.Title = w.Location + w.Version = version.Version + w.Now = WeatherNow{ + Temperature: fh.Properties.Periods[0].Temperature, + TemperatureUnit: fh.Properties.Periods[0].TemperatureUnit, + Forecast: fh.Properties.Periods[0].ShortForecast, + WindSpeed: fh.Properties.Periods[0].WindSpeed, + WindDirection: fh.Properties.Periods[0].WindDirection, + } + + // Build Q2H timeline for the 12 hours. + q2hPeriods := []WeatherPeriod{} + max := 6 + for i, period := range fh.Properties.Periods { + if i%2 != 0 { + continue // Take every other period + } + t, err := time.Parse(time.RFC3339, period.StartTime) + if err != nil { + return nil, err + } + p := WeatherPeriod{ + Forecast: period.DetailedForecast, + Hour: t.Hour(), + Temperature: period.Temperature, + TemperatureUnit: period.TemperatureUnit, + } + q2hPeriods = append(q2hPeriods, p) + if len(q2hPeriods) == max { + break + } + } + w.Q2HTimeline = WeatherTimeline{ + Periods: q2hPeriods, + } + + // Build BiDaily timeline for the next 3 days. + bdPeriods := []WeatherPeriod{} + max = 8 + for _, period := range f.Properties.Periods { + p := WeatherPeriod{ + Name: period.Name, + Forecast: period.DetailedForecast, + Temperature: period.Temperature, + TemperatureUnit: period.TemperatureUnit, + } + bdPeriods = append(bdPeriods, p) + if len(bdPeriods) == max { + break + } + } + w.BiDailyTimeline = WeatherTimeline{ + Periods: bdPeriods, + } + + return w, nil +} |