weather/main.go

98 lines
2.5 KiB
Go

package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"os"
"strings"
"github.com/briandowns/openweathermap"
)
var apiKey = "91dbd7a9a3ab3f06b9d944d42d76faf8"
var zipCode = 30310
var lat = 0.0
var long = 0.0
var units = "C"
func init() {
//flag.StringVar(&apiKey, "api", "", "API key for openweathermap.com")
flag.IntVar(&zipCode, "zip", 30310, "zip code for weather location")
flag.Float64Var(&lat, "lat", 0.0, "latitude of location")
flag.Float64Var(&long, "long", 0.0, "longitude of location")
}
type output struct {
Text string `json:"text"`
Alt string `json:"alt"`
Tooltip string `json:"tooltip"`
}
func main() {
flag.Parse()
c, err := openweathermap.NewCurrent(units, "en", apiKey)
if err != nil {
log.Fatal("failed to create current weather service:", err)
}
if lat != 0.0 && long != 0.0 {
if err := c.CurrentByCoordinates(&openweathermap.Coordinates{
Latitude: lat,
Longitude: long,
}); err != nil {
log.Fatal("failed to get local weather:", err)
}
} else if err := c.CurrentByZip(zipCode, "us"); err != nil {
log.Fatal("failed to get local weather:", err)
}
today := c.Weather[0]
// fmt.Printf("%s %.0f°C %d%%", today.Description, c.Main.Temp, c.Main.Humidity)
json.NewEncoder(os.Stdout).Encode(&output{
Text: fmt.Sprintf("%0.f°C %d%% %s", c.Main.Temp, c.Main.Humidity, weatherIcon(today.Description)),
Alt: fmt.Sprintf("%s %.0f°C %d%% %s", today.Description, c.Main.Temp, c.Main.Humidity, weatherIcon(today.Description)),
Tooltip: fmt.Sprintf("%s %.0f°C %d%% %s\r%.0f°/%.0f°", today.Description, c.Main.Temp, c.Main.Humidity, weatherIcon(today.Description), c.Main.TempMax, c.Main.TempMin),
})
}
func containsOf(ref string, cmp ...string) bool {
for _, x := range cmp {
if strings.Contains(ref, x) {
return true
}
}
return false
}
func weatherIcon(desc string) string {
d := strings.ToLower(desc)
switch {
case containsOf(d, "clear", "sunny"):
return ""
case containsOf(d, "partly cloudy", "clouds"):
return ""
case containsOf(d, "cloudy"):
return "摒"
case containsOf(d, "overcast"):
return ""
case containsOf(d, "mist", "fog", "haze"):
return "敖"
case containsOf(d, "patchy rain", "drizzle", "light rain"):
return ""
case containsOf(d, "thunder"):
return ""
case containsOf(d, "freezing", "sleet", "hail", "ice"):
return "ﭽ"
case containsOf(d, "rain"):
return ""
case containsOf(d, "blizzard", "heavy snow"):
return ""
case containsOf(d, "snow"):
return ""
default:
return ""
}
}