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.
slack-ruby-client, you would want to handle
client . on :close do | _data |
puts 'Connection closed, exiting.'
EM . stop
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.
(master ) $ ruby hi.rb
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
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.
Was this blog helpful? I'm running the NYC TCS Marathon in 2018 for TeamForKids charity.
Please donate here.