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) } } } }