arnaucube
arnaucube/kindle-weatherPublic Self-hosted repository
kindle-weather/main.go
main.goRaw
 1package main
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"html/template"
 7	"net/http"
 8	"os"
 9	"time"
10)
11
12type Element struct {
13	Humidity float64   `json:"humidity"`
14	Weather  []Weather `json:"weather"`
15}
16type Weather struct {
17	Id          int    `json:"id"`
18	Main        string `json:"main"`
19	Description string `json:"description"`
20	Icon        string `json:"icon"`
21}
22type OneCall struct {
23	Date    string
24	Current struct {
25		Element
26		DateUnix CurrentDate `json:"dt"`
27		Sunrise  Hour        `json:"sunrise"`
28		Sunset   Hour        `json:"sunset"`
29		Temp     Temperature `json:"temp"`
30	} `json:"current"`
31	Hourly []struct {
32		Element
33		DateUnix HourOnly    `json:"dt"`
34		Temp     Temperature `json:"temp"`
35	} `json:"hourly"`
36	Daily []struct {
37		Element
38		DateUnix Day `json:"dt"`
39		Temp     struct {
40			Day Temperature `json:"day"`
41			Min Temperature `json:"min"`
42			Max Temperature `json:"max"`
43		} `json:"temp"`
44	} `json:"daily"`
45}
46
47func getOneCall(api string) (*OneCall, error) {
48	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)
49	if err != nil {
50		return nil, err
51	}
52	defer r.Body.Close()
53
54	var d *OneCall
55	err = json.NewDecoder(r.Body).Decode(&d)
56	if err != nil {
57		return nil, err
58	}
59	d.Date = time.Time(d.Current.DateUnix).Format("2006-01-02, 15:04:05")
60	return d, nil
61}
62
63func main() {
64	if len(os.Args) != 3 {
65		fmt.Println("need an openwathermap.org API key as arg & port")
66		os.Exit(0)
67	}
68	apiKey := os.Args[1]
69	port := os.Args[2]
70
71	tmpl := template.Must(template.ParseFiles("template.html"))
72
73	fs := http.FileServer(http.Dir("icons"))
74	http.Handle("/icons/", http.StripPrefix("/icons/", fs))
75
76	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
77		data, err := getOneCall(apiKey)
78		if err != nil {
79			panic(err)
80		}
81
82		tmpl.Execute(w, data)
83	})
84	fmt.Println("serving at :" + port)
85	http.ListenAndServe(":"+port, nil)
86}