You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.5 KiB
Go

package main
import (
"fmt"
"os"
"os/exec"
"strconv"
"strings"
"github.com/joho/godotenv"
)
type Weather struct {
Temp float64
Humidity int
Icon rune
City string
LastPinged int64
}
type weathercode rune
const (
CLEAR_DAY weathercode = '\ue30d'
CLEAR_NIGHT weathercode = '\ue32b'
PARTLY_CLOUDY_DAY weathercode = '\ue302'
PARTLY_CLOUDY_NIGHT weathercode = '\ue379'
CLOUDY weathercode = '\ue312'
RAIN weathercode = '\ue318'
THUNDERSTORM weathercode = '\ue31d'
SNOW weathercode = '\ue31a'
FOG weathercode = '\ue313'
DEGREES_F weathercode = '\ue341'
HUMIDITY weathercode = '\ue373'
)
func (w *Weather) String() string {
return fmt.Sprintf(" %c %.1f%c %d%c in %s", w.Icon, w.Temp, DEGREES_F, w.Humidity, HUMIDITY, w.City) // Output as ICON ##.#*F ##% in City, ST where the rune is a degree sign
}
func main() {
// getting weather
if err := exec.Command(os.ExpandEnv("$HOME/.dotfiles/bin/weather/weather.sh")).Run(); err != nil {
panic(err)
}
// get up to date info
loc := os.ExpandEnv(fmt.Sprintf("$HOME/.dotfiles/bin/weather/.env.location"))
weath := os.ExpandEnv(fmt.Sprintf("$HOME/.dotfiles/bin/weather/.env.weather"))
if err := godotenv.Load(weath, loc); err != nil {
panic(err)
}
var humidity int
var temp float64
var err error
city := os.Getenv("CITY")
icon := getIcon(os.Getenv("ICON"))
h := os.Getenv("HUMIDITY")
t := os.Getenv("TEMP")
if h != "" {
hum, err := strconv.ParseInt(h, 10, 64)
if err != nil {
panic(err)
}
humidity = int(hum)
}
if t != "" {
temp, err = strconv.ParseFloat(t, 64)
if err != nil {
panic(err)
}
}
weather := &Weather{City: city, Icon: icon, Humidity: humidity, Temp: temp}
fmt.Print(weather)
}
func tod(day bool, dayrune weathercode, nightrune weathercode) rune {
if day {
return rune(dayrune)
}
return rune(nightrune)
}
func getIcon(code string) rune {
weather := strings.Trim(code, "nd") // trimming day or night tag
var day bool
if strings.Contains(code, "d") {
day = true
} else {
day = false
}
switch weather {
case "01":
return tod(day, CLEAR_DAY, CLEAR_NIGHT) // clear skies
case "02", "03":
return tod(day, PARTLY_CLOUDY_DAY, PARTLY_CLOUDY_NIGHT) // small clouds
case "04":
return rune(CLOUDY) // big clouds with sun
case "09", "10":
return rune(RAIN)
case "11":
return rune(THUNDERSTORM)
case "13":
return rune(SNOW)
case "50":
return rune(FOG)
default:
return '\uFFFD' // question mark
}
}