Daniel Doubrovkine bio photo

Daniel Doubrovkine

aka dB., @awscloud, former CTO @artsy, +@vestris, NYC

Email Twitter LinkedIn Github Strava
Creative Commons License

One of the things you have to be aware when writing a bot is disabled integrations and closed connections. The first case is simple - when someone disables a bot integration, Slack closes a Real Time connection’s WebSocket without an explanation.

server side closed connection

Using slack-ruby-client, you would want to handle :close.

client.on :close do |_data|
  puts 'Connection closed, exiting.'
  EM.stop
end

The next time you invoke rtm.start, Slack will return account_inactive. Other possible errors include invalid_auth, which is when someone removes an integration instead of disabling it.

~/examples/hi_real_time (master)$ ruby hi.rb
slack-ruby-client-0.5.2/lib/slack/web/faraday/response/raise_error.rb:9:
  in `on_complete': account_inactive (Slack::Web::Api::Error)
    from faraday-0.9.2/lib/faraday/response.rb:9:in `block in call'
    from faraday-0.9.2/lib/faraday/response.rb:57:in `on_complete'
    from faraday-0.9.2/lib/faraday/response.rb:8:in `call'
    from faraday-0.9.2/lib/faraday/request/url_encoded.rb:15:in `call'
    from faraday-0.9.2/lib/faraday/request/multipart.rb:14:in `call'
    from faraday-0.9.2/lib/faraday/rack_builder.rb:139:in `build_response'
    from faraday-0.9.2/lib/faraday/connection.rb:377:in `run_request'
    from faraday-0.9.2/lib/faraday/connection.rb:177:in `post'
    from slack-ruby-client-0.5.2/lib/slack/web/faraday/request.rb:25:in `request'
    from slack-ruby-client-0.5.2/lib/slack/web/faraday/request.rb:10:in `post'
    from slack-ruby-client-0.5.2/lib/slack/web/api/endpoints/rtm.rb:21:in `rtm_start'
    from slack-ruby-client-0.5.2/lib/slack/real_time/client.rb:74:in `build_socket'
    from slack-ruby-client-0.5.2/lib/slack/real_time/client.rb:38:in `start!'

The same thing happens when you remove an application (the Remove App button below) that was setup via Slack Button Integration.

remove app

A bot framework should handle this gracefully. For example, slack-bot-server, used in playplay.io will attempt to restart a bot on any error, then handle account_inactive or invalid_auth by deactivating the team and not trying to reconnect again. It will also try reactivate the team upon re-registration via Slack Button, too.