func apiHeatingStatus(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json; charset=utf-8") ch := services.QueryChannel("heating/status", 100*time.Millisecond) ev := <-ch ret := ev.Fields["json"] jsonResponse(w, ret) }
func query(endpoint string, q string, timeout int64, responses int64, w http.ResponseWriter) { w.Header().Add("Content-Type", "application/json; charset=utf-8") ch := services.QueryChannel(endpoint+" "+q, time.Duration(timeout)*time.Millisecond) var n int64 = 0 for ev := range ch { fmt.Fprintf(w, ev.String()+"\r\n") w.(http.Flusher).Flush() n++ if n >= responses { break } } }
func slacker(rtm *slack.RTM) { go rtm.ManageConnection() greeted := false userId := "" Loop: for { select { case msg := <-rtm.IncomingEvents: switch event := msg.Data.(type) { case *slack.ConnectedEvent: // say hello in the first channel we're in if len(event.Info.Channels) > 0 { if !greeted { channel := event.Info.Channels[0] rtm.SendMessage(rtm.NewOutgoingMessage("gohome bot reporting for duty!", channel.ID)) } greeted = true } // remember our id userId = event.Info.User.ID case *slack.MessageEvent: if event.User == userId || event.BotID != "" { // ignore messages from self or bots continue } // send the message as a query log.Println("Querying:", event.Text) ch := services.QueryChannel(event.Text, time.Duration(5)*time.Second) gotResponse := false for ev := range ch { // send back responses message := ev.StringField("message") if message == "" { message = ev.String() } rtm.SendMessage(rtm.NewOutgoingMessage(message, event.Channel)) gotResponse = true } if !gotResponse { rtm.SendMessage(rtm.NewOutgoingMessage("Sorry, nothing answered!", event.Channel)) } case *slack.RTMError: fmt.Printf("Error: %s\n", event.Error()) case *slack.InvalidAuthEvent: fmt.Printf("Invalid credentials") break Loop default: // Ignore other events.. // case *slack.HelloEvent: // case *slack.PresenceChangeEvent: // case *slack.LatencyReport: // fmt.Printf("Unexpected: %v\n", msg.Data) } } } }