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

85 lines
1.8 KiB

package main
import (
"encoding/json"
"fmt"
"html/template"
"net/http"
"os"
"time"
)
type Element struct {
Humidity float64 `json:"humidity"`
Weather []Weather `json:"weather"`
}
type Weather struct {
Id int `json:"id"`
Main string `json:"main"`
Description string `json:"description"`
Icon string `json:"icon"`
}
type OneCall struct {
Date string
Current struct {
Element
DateUnix CurrentDate `json:"dt"`
Sunrise Hour `json:"sunrise"`
Sunset Hour `json:"sunset"`
Temp Temperature `json:"temp"`
} `json:"current"`
Hourly []struct {
Element
DateUnix HourOnly `json:"dt"`
Temp Temperature `json:"temp"`
} `json:"hourly"`
Daily []struct {
Element
DateUnix Day `json:"dt"`
Temp struct {
Day Temperature `json:"day"`
Min Temperature `json:"min"`
Max Temperature `json:"max"`
} `json:"temp"`
} `json:"daily"`
}
func getOneCall(api string) (*OneCall, error) {
r, err := http.Get("https://api.openweathermap.org/data/2.5/onecall?lat=27.98&lon=86.92&exclude=minutely,alerts&units=metric&appid=" + api)
if err != nil {
return nil, err
}
defer r.Body.Close()
var d *OneCall
err = json.NewDecoder(r.Body).Decode(&d)
if err != nil {
return nil, err
}
d.Date = time.Time(d.Current.DateUnix).Format("2006-01-02, 15:04:05")
return d, nil
}
func main() {
if len(os.Args) != 2 {
fmt.Println("need an openwathermap.org API key as arg")
os.Exit(0)
}
apiKey := os.Args[1]
tmpl := template.Must(template.ParseFiles("template.html"))
fs := http.FileServer(http.Dir("icons"))
http.Handle("/icons/", http.StripPrefix("/icons/", fs))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
data, err := getOneCall(apiKey)
if err != nil {
panic(err)
}
tmpl.Execute(w, data)
})
fmt.Println("serving at :8080")
http.ListenAndServe(":8080", nil)
}