98 lines
2.5 KiB
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 ""
|
|
}
|
|
}
|