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.
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.
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.