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.
go-weather/main.go

155 lines
3.6 KiB

package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"time"
)
type WeatherAPI struct {
Coord Coord `json:"coord"`
Weather []Weather `json:"weather"`
Base string `json:"base"`
Main Main `json:"main"`
Visability int64 `json:"visibility"`
Wind Wind `json:"wind"`
Rain Rain `json:"rain"`
Clouds Cloud `json:"cloud"`
DT int64 `json:"dt"`
Sys Sys `json:"sys"`
TimeZone int `json:"timezone"`
ID int `json:"id"`
Name string `json:"name"`
COD int `json:"cod"`
}
type Coord struct {
Lon float64 `json:"lon"`
Lat float64 `json:"lat"`
}
type Weather struct {
ID int `json:"id"`
Main string `json:"main"`
Description string `json:"description"`
Icon string `json:"icon"`
}
type Main struct {
Temp float64 `json:"temp"`
Feels_like float64 `json:"feels_like"`
Temp_min float64 `json:"temp_min"`
Temp_max float64 `json:"temp_max"`
Pressure float64 `json:"pressure"`
Humidity float64 `json:"humidity"`
}
type Wind struct {
Speed float64 `json:"speed"`
Deg float64 `json:"deg"`
Gust float64 `json:"gust"`
}
type Rain struct {
T1h float64 `json:"1h"`
}
type Cloud struct {
All int `json:"all"`
}
type Sys struct {
Types int `json:"type"`
Id int64 `json:"id"`
Country string `json:"country"`
Sunrise int64 `json:"sunrise"`
Sunset int64 `json:"sunset"`
}
func main() {
//set up the flags for the program to use!
var city, code, api_key string
flag.StringVar(&city, "city", "London", "Enter city e.g. London, Glasgow etc... (Default: London)")
flag.StringVar(&code, "code", "uk", "Enter Code e.g. uk, us etc... (Default: uk)")
flag.StringVar(&api_key, "api", "none", "Enter Code e.g. uk, us etc... Default(none)")
flag.Parse()
full := "https://api.openweathermap.org/data/2.5/weather?q=" + city + "," + code + "&units=metric" + "&appid=" + api_key + ""
//read webpage
html, _ := LoadWebPage(full)
//Create file
CreateFile(string(html), false)
data, _ := LoadJson("weather.json")
//print the weather!
PrintWeather(data)
}
func LoadJson(file string) (WeatherAPI, error) {
var config WeatherAPI
configFile, err := os.Open(file)
if err != nil {
fmt.Println(err.Error())
}
jsonParser := json.NewDecoder(configFile)
jsonParser.Decode(&config)
return config, err
}
func CreateFile(fileContents string, debugFlag bool) {
file, err := os.Create("weather.json")
if err != nil {
log.Fatalf("failed creating file: %s", err)
}
defer file.Close()
len, err := file.WriteString(fileContents)
if err != nil {
log.Fatalf("failed writing to file: %s", err)
}
// Debug Flag
if debugFlag {
fmt.Printf("\nFile Name: %s", file.Name())
fmt.Printf("\nLength: %d bytes", len)
}
}
func LoadWebPage(web_url string) ([]byte, error) {
url := web_url
resp, err := http.Get(url)
//reads html as a slice of bytes
html, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
return html, err
}
func PrintWeather(data WeatherAPI) {
weatherData := data
dt := time.Now()
fmt.Println(dt.Format("01/02/2006\t15:04"))
str_loc := weatherData.Name
str_code := weatherData.Sys.Country
str_weather := weatherData.Weather[0].Main
str_weather_detail := weatherData.Weather[0].Description
str_temp := weatherData.Main.Temp
str_temp_fl := weatherData.Main.Feels_like
str_hum := weatherData.Main.Humidity
fmt.Printf("Location: %v, %v\nWeather: %v (%v)\nTemp: %v°C (Feels like: %v°C)\nHumidity: %v", str_loc, str_code, str_weather, str_weather_detail, str_temp, str_temp_fl, str_hum)
}