func connectSlackRTM(h *helios.Engine, s *SlackService) { err := backoff.Retry(func() error { h.Debug("Connecting to slack rtm") err := runSlackRTM(h, s) if err != nil { h.Warn("Failed to start slack rtm. Retrying.", "error", err.Error()) } return err }, backoff.NewExponentialBackOff()) if err != nil { s.Messages <- helios.NewError("Slack service error: %v", err) } }
func runSlackRTM(h *helios.Engine, s *SlackService) error { token := h.Config.GetString("slack.apiKey") s.slackEvents = make(chan slack.SlackEvent) api := slack.New(token) rtm, err := api.StartRTM("", "http://localhost/") if err != nil { return err } h.Debug("Connected to slack rtm") // Cache all users for mention lookups users, err := api.GetUsers() if err != nil { h.Warn("Failed to get users from slack api") return err } // Map all users ids to user type for _, u := range users { s.Users[u.Id] = u } // Cache all channels for lookups channels, err := api.GetChannels(true) if err != nil { h.Warn("Failed to get channels from slack api") return err } // Map all channel ids to channel type for _, c := range channels { s.Channels[c.Id] = c } go rtm.HandleIncomingEvents(s.slackEvents) go rtm.Keepalive(20 * time.Second) go messageHandler(api, s, h) return nil }