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)
|
|
}
|