diff --git a/.gitignore b/.gitignore index fb30ca6..6d3322f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ sco +.DS_Store diff --git a/Makefile b/Makefile index 977cde2..5a139cd 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ default: fmt fmt: go fmt ./... + goimports -l -w . docker-build: docker build -t $(IMAGENAME) . @@ -41,5 +42,9 @@ build: ./$(FN) go-get: cd cmd/$(FN) && go get -v -./$(FN): */*.go cmd/*/*.go go-get +vet: + go vet ./... + bash -c 'test -z "$$(gofmt -l .)"' + +./$(FN): */*.go cmd/*/*.go go-get vet cd cmd/$(FN) && go build -o ../../$(FN) $(GOFLAGS) . diff --git a/bot/bot.go b/bot/bot.go index f08c894..955f8a3 100644 --- a/bot/bot.go +++ b/bot/bot.go @@ -1,16 +1,17 @@ package bot -import "github.com/kr/pretty" +//import "github.com/kr/pretty" import ( "fmt" - "github.com/mattermost/mattermost-server/v5/model" - "github.com/rs/zerolog/log" "os" "os/signal" "regexp" "strings" "syscall" "time" + + "github.com/mattermost/mattermost-server/v5/model" + "github.com/rs/zerolog/log" ) type Bot struct { @@ -51,7 +52,7 @@ func (b *Bot) identify() { Msg("starting") } -func (b *Bot) Main() int { +func (b *Bot) Main() { println(b.BotName) b.StartupUnixTime = time.Now().Unix() @@ -106,7 +107,6 @@ func (b *Bot) Main() int { // You can block forever with select {} - return 0 } func (b *Bot) MakeSureServerIsRunning() { @@ -285,9 +285,10 @@ func (b *Bot) HandleMsgFromDebuggingChannel(event *model.WebSocketEvent) { return } - // FIXME check and see if the message from mm is a bot message, if so, - // ignore it - pretty.Print(post) + if post.Message == "" { + // null message, we can probably ignore it. + return + } if matched, _ := regexp.MatchString(`(?:^|\W)shutdown(?:$|\W)`, post.Message); matched { b.Shutdown() diff --git a/bot/logger.go b/bot/logger.go index d7c4073..8ba7c93 100644 --- a/bot/logger.go +++ b/bot/logger.go @@ -1,11 +1,12 @@ package bot import ( + "os" + "time" + "github.com/mattn/go-isatty" "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "os" - "time" ) func (b *Bot) setupLogging() { diff --git a/bot/metar.go b/bot/metar.go index cf4efc8..a93b37d 100644 --- a/bot/metar.go +++ b/bot/metar.go @@ -2,15 +2,92 @@ package bot //import "github.com/kr/pretty" import ( + "encoding/json" "fmt" - "github.com/rs/zerolog/log" "io/ioutil" "net/http" "os" "regexp" "time" + + "github.com/rs/zerolog/log" ) +type MetarResponse struct { + Meta struct { + Timestamp time.Time `json:"timestamp"` + StationsUpdated string `json:"stations_updated"` + } `json:"meta"` + Altimeter struct { + Repr string `json:"repr"` + Value float64 `json:"value"` + Spoken string `json:"spoken"` + } `json:"altimeter"` + Clouds []interface{} `json:"clouds"` + FlightRules string `json:"flight_rules"` + Other []interface{} `json:"other"` + Sanitized string `json:"sanitized"` + Visibility struct { + Repr string `json:"repr"` + Value int `json:"value"` + Spoken string `json:"spoken"` + } `json:"visibility"` + WindDirection struct { + Repr string `json:"repr"` + Value int `json:"value"` + Spoken string `json:"spoken"` + } `json:"wind_direction"` + WindGust struct { + Repr string `json:"repr"` + Value int `json:"value"` + Spoken string `json:"spoken"` + } `json:"wind_gust"` + WindSpeed struct { + Repr string `json:"repr"` + Value int `json:"value"` + Spoken string `json:"spoken"` + } `json:"wind_speed"` + WxCodes []interface{} `json:"wx_codes"` + Raw string `json:"raw"` + Station string `json:"station"` + Time struct { + Repr string `json:"repr"` + Dt time.Time `json:"dt"` + } `json:"time"` + Remarks string `json:"remarks"` + Dewpoint struct { + Repr string `json:"repr"` + Value int `json:"value"` + Spoken string `json:"spoken"` + } `json:"dewpoint"` + RemarksInfo struct { + DewpointDecimal struct { + Repr string `json:"repr"` + Value float64 `json:"value"` + Spoken string `json:"spoken"` + } `json:"dewpoint_decimal"` + TemperatureDecimal struct { + Repr string `json:"repr"` + Value float64 `json:"value"` + Spoken string `json:"spoken"` + } `json:"temperature_decimal"` + } `json:"remarks_info"` + RunwayVisibility []interface{} `json:"runway_visibility"` + Temperature struct { + Repr string `json:"repr"` + Value int `json:"value"` + Spoken string `json:"spoken"` + } `json:"temperature"` + WindVariableDirection []interface{} `json:"wind_variable_direction"` + Units struct { + Altimeter string `json:"altimeter"` + Altitude string `json:"altitude"` + Temperature string `json:"temperature"` + Visibility string `json:"visibility"` + WindSpeed string `json:"wind_speed"` + } `json:"units"` +} + func (b *Bot) HandleWeatherRequest(channelid string, postid string, message string) { // we are using a very bare image with no CA cert bundle @@ -52,7 +129,16 @@ func (b *Bot) HandleWeatherRequest(channelid string, postid string, message stri data, _ := ioutil.ReadAll(resp.Body) - log.Info().Msgf("weather %s: %s", loc, data) - b.SendMsgToChannel(fmt.Sprintf("weather %s: %s", loc, data), postid, channelid) + var parsedMetarResponse MetarResponse + log.Info().Msgf("weather %s: %s", loc, data) + + err = nil + err = json.Unmarshal([]byte(data), &parsedMetarResponse) + + if err != nil { + b.SendMsgToChannel("error deserializing metar data", postid, channelid) + return + } + b.SendMsgToChannel(fmt.Sprintf("weather for `%s`: \n```\n%+v\n```\n", loc, parsedMetarResponse), postid, channelid) } diff --git a/cmd/sco/main.go b/cmd/sco/main.go index 3837b07..93b9435 100644 --- a/cmd/sco/main.go +++ b/cmd/sco/main.go @@ -1,10 +1,14 @@ package main -import "os" -import "git.eeqj.de/sneak/sco/bot" +import ( + "os" + + "git.eeqj.de/sneak/sco/bot" +) var Version string var Commit string + var Buildarch string func main() { @@ -23,5 +27,5 @@ func main() { b.AccountFirstname = "LSV" b.AccountLastname = "Serious Callers Only" }) - os.Exit(mybot.Main()) + mybot.Main() }