forked from an/flokati
		
	
		
			
				
	
	
		
			138 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// vi:ts=4:sts=4:sw=4:noet:tw=72
 | 
						|
//
 | 
						|
// flokatirc weather module
 | 
						|
//
 | 
						|
// Copyright (c) 2016 Daniel Aberger <da@ixab.de>
 | 
						|
 | 
						|
package modules
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"io/ioutil"
 | 
						|
	"net/http"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"code.dnix.de/an/xlog"
 | 
						|
 | 
						|
	"github.com/sorcix/irc"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	owmQueryAPIKey    = ""
 | 
						|
	owmQueryURLPrefix = "http://api.openweathermap.org/data/2.5/weather?q="
 | 
						|
	owmQueryURLSuffix = "&appid="
 | 
						|
	weatherPrefix     = "[WTHR] "
 | 
						|
)
 | 
						|
 | 
						|
type WeatherObject struct {
 | 
						|
	Base   string `json:"base"`
 | 
						|
	Clouds struct {
 | 
						|
		All int `json:"all"`
 | 
						|
	} `json:"clouds"`
 | 
						|
	Cod   int `json:"cod"`
 | 
						|
	Coord struct {
 | 
						|
		Lat float64 `json:"lat"`
 | 
						|
		Lon float64 `json:"lon"`
 | 
						|
	} `json:"coord"`
 | 
						|
	Dt   int `json:"dt"`
 | 
						|
	ID   int `json:"id"`
 | 
						|
	Main struct {
 | 
						|
		GrndLevel float64 `json:"grnd_level"`
 | 
						|
		Humidity  int     `json:"humidity"`
 | 
						|
		Pressure  float64 `json:"pressure"`
 | 
						|
		SeaLevel  float64 `json:"sea_level"`
 | 
						|
		Temp      float64 `json:"temp"`
 | 
						|
		TempMax   float64 `json:"temp_max"`
 | 
						|
		TempMin   float64 `json:"temp_min"`
 | 
						|
	} `json:"main"`
 | 
						|
	Name string `json:"name"`
 | 
						|
	Rain struct {
 | 
						|
		ThreeH float64 `json:"3h"`
 | 
						|
	} `json:"rain"`
 | 
						|
	Sys struct {
 | 
						|
		Country string  `json:"country"`
 | 
						|
		Message float64 `json:"message"`
 | 
						|
		Sunrise int     `json:"sunrise"`
 | 
						|
		Sunset  int     `json:"sunset"`
 | 
						|
	} `json:"sys"`
 | 
						|
	Weather []struct {
 | 
						|
		Description string `json:"description"`
 | 
						|
		Icon        string `json:"icon"`
 | 
						|
		ID          int    `json:"id"`
 | 
						|
		Main        string `json:"main"`
 | 
						|
	} `json:"weather"`
 | 
						|
	Wind struct {
 | 
						|
		Deg   float64 `json:"deg"`
 | 
						|
		Speed float64 `json:"speed"`
 | 
						|
	} `json:"wind"`
 | 
						|
}
 | 
						|
 | 
						|
func init() {
 | 
						|
	MsgFuncs["weather"] = weatherHandleMessage
 | 
						|
	RunFuncs["weather"] = weatherConfig
 | 
						|
}
 | 
						|
 | 
						|
func weatherConfig() {
 | 
						|
	time.Sleep(5 * time.Second)
 | 
						|
	owmQueryAPIKey = ModParams["weather-api-key"]
 | 
						|
}
 | 
						|
 | 
						|
func weatherHandleMessage(m *irc.Message) {
 | 
						|
	tok := strings.Split(m.Trailing, " ")
 | 
						|
	if len(tok) < 1 {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	switch strings.ToLower(tok[0]) {
 | 
						|
	case "!weather", "!wetter":
 | 
						|
		switch len(tok) {
 | 
						|
		case 1:
 | 
						|
			SayCh <- fmt.Sprintf("*\n%s", weatherPrefix+"Usage: !w <zip/city/state/country>")
 | 
						|
		default:
 | 
						|
			if strings.Compare(owmQueryAPIKey, "") == 0 {
 | 
						|
				SayCh <- fmt.Sprintf("*\n%s", weatherPrefix+"No API Key set.")
 | 
						|
			} else {
 | 
						|
				go getWeather(strings.Join(tok[1:], " "))
 | 
						|
			}
 | 
						|
		}
 | 
						|
	default:
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func getWeather(query string) {
 | 
						|
	q := owmQueryURLPrefix + query + owmQueryURLSuffix + owmQueryAPIKey
 | 
						|
	r, err := http.Get(q)
 | 
						|
	if err != nil {
 | 
						|
		xlog.Error(err.Error())
 | 
						|
		SayCh <- fmt.Sprintf("*\n%s", weatherPrefix+err.Error())
 | 
						|
	} else {
 | 
						|
		re, err := ioutil.ReadAll(r.Body)
 | 
						|
		if err != nil {
 | 
						|
			xlog.Error(err.Error())
 | 
						|
			SayCh <- fmt.Sprintf("*\n%s", weatherPrefix+err.Error())
 | 
						|
		} else {
 | 
						|
			defer r.Body.Close()
 | 
						|
			var wo WeatherObject
 | 
						|
			err := json.Unmarshal(re, &wo)
 | 
						|
			if err != nil {
 | 
						|
				xlog.Error(err.Error())
 | 
						|
				SayCh <- fmt.Sprintf("*\n%s", weatherPrefix+err.Error())
 | 
						|
			} else {
 | 
						|
				var description string
 | 
						|
				if len(wo.Weather) < 1 {
 | 
						|
					description = ""
 | 
						|
				} else {
 | 
						|
					description = ", " + wo.Weather[0].Description
 | 
						|
				}
 | 
						|
				SayCh <- fmt.Sprintf("*\n%s", weatherPrefix+wo.Name+", "+wo.Sys.Country+
 | 
						|
					" - Temp: "+strconv.Itoa(int(wo.Main.Temp-273.15))+
 | 
						|
					"°C"+description+
 | 
						|
					", Humidity: "+strconv.Itoa(int(wo.Main.Humidity))+
 | 
						|
					"%, Wind: "+strconv.Itoa(int(wo.Wind.Speed*3.6))+
 | 
						|
					" km/h")
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |