statusscreen/vendor/src/statusscreen/Weather.go

74 lines
1.3 KiB
Go
Raw Normal View History

2017-11-04 12:25:16 +01:00
package statusscreen
import (
"io/ioutil"
"net/http"
"strings"
"time"
)
// Weather is my Weather struct
type Weather struct {
Config *Config
lastResponse string
nextRefresh int64
}
// GetOutput returns a rendered result of this module
func (weather *Weather) GetOutput() []string {
if weather.nextRefresh <= time.Now().Unix() {
2017-11-04 22:16:08 +01:00
weather.nextRefresh += 10
go weather.getData()
2017-11-04 12:25:16 +01:00
}
2017-11-04 14:31:44 +01:00
parts := strings.Split(weather.lastResponse, "\n")
if len(parts) > 6 {
return parts[:len(parts)-5]
}
return []string{}
2017-11-04 12:25:16 +01:00
}
2017-11-04 22:16:08 +01:00
func (weather *Weather) getData() {
myWeather, err := weather.getWeather()
if err == nil {
weather.lastResponse = myWeather
weather.nextRefresh = time.Now().Unix() + weather.Config.Weather.RefreshDelay
} else {
// log.Fatal(err)
}
}
2017-11-04 12:25:16 +01:00
func (weather *Weather) getWeather() (string, error) {
// Set up http client to fetch weather
client := &http.Client{
Timeout: time.Second * 5,
}
// Set up request
req, err := http.NewRequest("GET", weather.Config.Weather.URL, nil)
if err != nil {
return "", err
}
// Set curl user agent
req.Header.Set("User-Agent", "curl/7.52.1")
// Do request
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}