From 0765fa94a107369979ee8316afd2af8656f5489b Mon Sep 17 00:00:00 2001 From: Nick White Date: Thu, 15 Mar 2018 23:41:24 +0000 Subject: Add wip weather --- weather.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 weather.go diff --git a/weather.go b/weather.go new file mode 100644 index 0000000..161fd7b --- /dev/null +++ b/weather.go @@ -0,0 +1,91 @@ +package main + +// TODO: allow free-text lookups of place names, rather than ids +// TODO: decode weather type number + +import ( + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "log" + "net/http" + "sort" +) + +const defid = "310118" + +var wkey = map[string]string{ + "f": "Feels Like Temperature", + "h": "Humidity", + "p": "Pressure", + "t": "Temperature", + "v": "Visibility", + "wg": "Wind Gust", + "ws": "Wind Speed", + "pp": "Precipitaton Probability", + "uv": "Max UV Index", + "wd": "Wind Direction", + "wt": "Weather Type", + "AQIndex": "Air Quality", +} + +func main() { + var j map[string]interface{} + var id string + + flag.Parse() + if flag.NArg() > 0 { + id = flag.Arg(0) + } else { + id = defid + } + + tr := &http.Transport{} + client := &http.Client{Transport: tr} + resp, err := client.Get("https://www.metoffice.gov.uk/public/data/PWSCache/BestForecast/Forecast/" + id + ".json?concise=true") + //resp, err := http.Get("https://www.metoffice.gov.uk/public/data/PWSCache/BestForecast/Forecast/" + id + ".json?concise=true") + if err != nil { + log.Fatal(err) + } + defer resp.Body.Close() + b, err := ioutil.ReadAll(resp.Body) + err = json.Unmarshal(b, &j) + if err != nil { + log.Fatal(err) + } + + // TODO: make this cleaner, perhaps by pre-speccing the structs + days := j["BestFcst"].(map[string]interface{})["Forecast"].(map[string]interface{})["Location"].(map[string]interface{})["Day"].([]interface{}) + for _, d := range days { + fmt.Printf("-----------------------------\n") + fmt.Printf("Date: %v\n", d.(map[string]interface{})["@date"]) + fmt.Printf("\nDay weather:\n") + prettyWeather(d.(map[string]interface{})["DayValues"].(map[string]interface{})["WeatherParameters"].(map[string]interface{})) + fmt.Printf("\nNight weather:\n") + prettyWeather(d.(map[string]interface{})["NightValues"].(map[string]interface{})["WeatherParameters"].(map[string]interface{})) + + fmt.Printf("\nTime steps:\n") + timesteps := d.(map[string]interface{})["TimeSteps"].(map[string]interface{})["TimeStep"].([]interface{}) + for _, t := range timesteps { + fmt.Printf("\nTime: %s\n", t.(map[string]interface{})["@time"]) + prettyWeather(t.(map[string]interface{})["WeatherParameters"].(map[string]interface{})) + } + } +} + +func prettyWeather(w map[string]interface{}) { + // TODO: choose what to show, and in what order, to have a compact output + var keys []string + for k, _ := range wkey { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, k := range keys { + t, ok := w[k] + if ok { + fmt.Printf("%s: %v\n", wkey[k], t) + } + } +} -- cgit v1.2.3