A library that enables you to write a complete Slack bot service with Slack button integration, in Ruby. If you are not familiar with Slack bots or Slack API concepts, you might want to watch this video. A good demo of a service built on top of this is missingkidsbot.org.
A library that contains a Grape API serving a Slack Ruby Bot to multiple teams. This gem combines a web server, a RESTful API and multiple instances of slack-ruby-bot. It integrates with the Slack Platform API. Your customers can use a Slack button to install the bot.
You're reading the documentation for the next release of slack-ruby-bot-server. Please see the documentation for the last stable release, v0.8.2 unless you're integrating with HEAD. See UPGRADING when upgrading from an older version.
A demo version of the sample app with mongoid is running on Heroku at slack-ruby-bot-server.herokuapp.com. Use the Add to Slack button. The bot will join your team as @slackbotserver.
Once a bot is registered, you can invite to a channel with /invite @slackbotserver
interact with it. DM "hi" to it, or say "@slackbotserver hi".
You can use one of the sample applications to bootstrap your project and start adding slack command handlers on top of this code. A database is required to store teams.
Use MongoDB with Mongoid as ODM. Configure the database connection in mongoid.yml
. Add the mongoid
gem in your Gemfile.
gem 'mongoid'
gem 'kaminari-mongoid'
gem 'mongoid-scroll'
gem 'slack-ruby-bot-server'
See the sample app using Mongoid for more information.
Use ActiveRecord with, for example, PostgreSQL via pg. Configure the database connection in postgresql.yml
. Add the activerecord
, pg
, otr-activerecord
and cursor_pagination
gems to your Gemfile.
gem 'pg'
gem 'activerecord', require: 'active_record'
gem 'slack-ruby-bot-server'
gem 'otr-activerecord'
gem 'cursor_pagination'
See the sample app using ActiveRecord for more information.
Create a New Application on Slack.
Follow the instructions, note the app's client ID and secret, give the bot a default name, etc. The redirect URL should be the location of your app, for testing purposes use http://localhost:9292
. Edit your .env
file and add SLACK_CLIENT_ID=...
and SLACK_CLIENT_SECRET=...
in it. Run bundle install
and foreman start
. Navigate to localhost:9292. Register using the Slack button.
If you deploy to Heroku set SLACK_CLIENT_ID
and SLACK_CLIENT_SECRET
via heroku config:add SLACK_CLIENT_ID=... SLACK_CLIENT_SECRET=...
.
This library implements an app, SlackRubyBotServer::App, a service manager, SlackRubyBotServer::Service that creates multiple instances of a bot server class, SlackRubyBotServer::Server, one per team.
The app instance checks for a working database connection, ensures indexes, performs migrations, sets up bot aliases and log levels. You can introduce custom behavior into the app lifecycle by subclassing SlackRubyBotServer::App
and creating an instance of the child class in config.ru
.
class MyApp < SlackRubyBotServer::App
def prepare!
super
deactivate_sleepy_teams!
end
private
def deactivate_sleepy_teams!
Team.active.each do |team|
next unless team.sleepy?
team.deactivate!
end
end
end
MyApp.instance.prepare!
You can introduce custom behavior into the service lifecycle via callbacks. This can be useful when new team has been registered via the API or a team has been deactivated from Slack.
instance = SlackRubyBotServer::Service.instance
instance.on :created do |team, error|
# a new team has been registered
end
instance.on :deactivated do |team, error|
# an existing team has been deactivated in Slack
end
instance.on :error do |team, error|
# an error has occurred
end
The following callbacks are supported. All callbacks receive a team
, except error
, which receives a StandardError
object.
callback | description |
---|---|
error | an error has occurred |
creating | a new team is being registered |
created | a new team has been registered |
booting | the service is starting and is connecting a team to Slack |
booted | the service is starting and has connected a team to Slack |
stopping | the service is about to disconnect a team from Slack |
stopped | the service has disconnected a team from Slack |
starting | the service is (re)connecting a team to Slack |
started | the service has (re)connected a team to Slack |
deactivating | a team is being deactivated |
deactivated | a team has been deactivated |
You can override the server class to handle additional events, and configure the service to use it.
class MyServer < SlackRubyBotServer::Server
on :hello do |client, data|
# connected to Slack
end
on :channel_joined do |client, data|
# the bot joined a channel in data.channel['id']
end
end
SlackRubyBotServer.configure do |config|
config.server_class = MyServer
end
Each SlackRubyBotServer::Server
instance will start a ping worker that will periodically check the online status of the bot via the Slack web auth.test and users.getPresence APIs, and will forcefully close the connection if the bot goes offline, causing an automatic reconnect.
You can configure the ping interval, number of retries before restart, and disable the ping worker entirely.
SlackRubyBotServer.configure do |config|
config.ping = {
enabled: true, # set to false to disable the ping worker
ping_interval: 30, # interval in seconds
retry_count: 3 # number of unsuccessful retries until a restart
}
end
By default the implementation of Team stores a bot_access_token
that grants a certain amount of privileges to the bot user as described in Slack OAuth Docs. You may not want a bot user at all, or may require different auth scopes, such as users.profile:read
to access user profile information via Slack::Web::Client#users_profile_get
. To obtain the non-bot access token make the following changes.
- Configure your app to require additional scopes in Slack API under OAuth, Permissions
- Add
access_token
and, optionally,scope
to yourTeam
model - Change the Add to Slack buttons to require the additional scope, eg.
https://slack.com/oauth/authorize?scope=bot,users.profile:read&client_id=...
- Store the access token returned from
Slack::Web::Client#oauth_access
and scope when creating a team in yourTeams
API endpoint.
You can see a sample implementation in slack-sup#3a497b.
- slack-sup, free service at sup.playplay.io
- slack-gamebot, free service at www.playplay.io
- slack-market, free service at market.playplay.io
- slack-shellbot, free service at shell.playplay.io
- slack-api-explorer, free service at api-explorer.playplay.io
- slack-strava, free service at slava.playplay.io
- slack-arena, free service at arena.playplay.io
Copyright Daniel Doubrovkine and Contributors, 2015-2018