slack-ruby-bot-bhe 0.5.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +17 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/.rubocop.yml +6 -0
- data/.rubocop_todo.yml +58 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +81 -0
- data/CONTRIBUTING.md +139 -0
- data/DEPLOYMENT.md +33 -0
- data/Gemfile +3 -0
- data/LICENSE.md +22 -0
- data/README.md +263 -0
- data/RELEASING.md +67 -0
- data/Rakefile +19 -0
- data/TUTORIAL.md +205 -0
- data/UPGRADING.md +64 -0
- data/examples/minimal/Gemfile +3 -0
- data/examples/minimal/Procfile +1 -0
- data/examples/minimal/pongbot.rb +9 -0
- data/examples/weather/Gemfile +3 -0
- data/examples/weather/Procfile +1 -0
- data/examples/weather/weatherbot.rb +9 -0
- data/lib/config/application.rb +14 -0
- data/lib/config/boot.rb +8 -0
- data/lib/config/environment.rb +3 -0
- data/lib/initializers/giphy.rb +5 -0
- data/lib/slack-ruby-bot.rb +25 -0
- data/lib/slack-ruby-bot/about.rb +7 -0
- data/lib/slack-ruby-bot/app.rb +46 -0
- data/lib/slack-ruby-bot/bot.rb +7 -0
- data/lib/slack-ruby-bot/client.rb +44 -0
- data/lib/slack-ruby-bot/commands.rb +5 -0
- data/lib/slack-ruby-bot/commands/about.rb +12 -0
- data/lib/slack-ruby-bot/commands/base.rb +121 -0
- data/lib/slack-ruby-bot/commands/help.rb +9 -0
- data/lib/slack-ruby-bot/commands/hi.rb +9 -0
- data/lib/slack-ruby-bot/commands/unknown.rb +11 -0
- data/lib/slack-ruby-bot/config.rb +40 -0
- data/lib/slack-ruby-bot/hooks.rb +3 -0
- data/lib/slack-ruby-bot/hooks/base.rb +10 -0
- data/lib/slack-ruby-bot/hooks/hello.rb +11 -0
- data/lib/slack-ruby-bot/hooks/message.rb +50 -0
- data/lib/slack-ruby-bot/rspec.rb +12 -0
- data/lib/slack-ruby-bot/rspec/support/fixtures/slack/auth_test.yml +16 -0
- data/lib/slack-ruby-bot/rspec/support/fixtures/slack/migration_in_progress.yml +30 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/it_behaves_like_a_slack_bot.rb +27 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_error.rb +30 -0
- data/lib/slack-ruby-bot/rspec/support/slack-ruby-bot/respond_with_slack_message.rb +19 -0
- data/lib/slack-ruby-bot/rspec/support/slack_api_key.rb +5 -0
- data/lib/slack-ruby-bot/rspec/support/slack_ruby_bot_configure.rb +9 -0
- data/lib/slack-ruby-bot/rspec/support/vcr.rb +8 -0
- data/lib/slack-ruby-bot/server.rb +111 -0
- data/lib/slack-ruby-bot/version.rb +3 -0
- data/lib/slack_ruby_bot.rb +1 -0
- data/screenshots/aliases.gif +0 -0
- data/screenshots/demo.gif +0 -0
- data/screenshots/dms.gif +0 -0
- data/screenshots/register-bot.png +0 -0
- data/screenshots/weather.gif +0 -0
- data/slack-ruby-bot.gemspec +28 -0
- data/slack.png +0 -0
- data/spec/slack-ruby-bot/app_spec.rb +15 -0
- data/spec/slack-ruby-bot/commands/about_spec.rb +19 -0
- data/spec/slack-ruby-bot/commands/aliases_spec.rb +22 -0
- data/spec/slack-ruby-bot/commands/bot_spec.rb +19 -0
- data/spec/slack-ruby-bot/commands/commands_precedence_spec.rb +22 -0
- data/spec/slack-ruby-bot/commands/commands_regexp_escape_spec.rb +17 -0
- data/spec/slack-ruby-bot/commands/commands_spaces_spec.rb +20 -0
- data/spec/slack-ruby-bot/commands/commands_spec.rb +21 -0
- data/spec/slack-ruby-bot/commands/commands_with_block_spec.rb +23 -0
- data/spec/slack-ruby-bot/commands/direct_messages_spec.rb +38 -0
- data/spec/slack-ruby-bot/commands/empty_text_spec.rb +22 -0
- data/spec/slack-ruby-bot/commands/help_spec.rb +10 -0
- data/spec/slack-ruby-bot/commands/hi_spec.rb +19 -0
- data/spec/slack-ruby-bot/commands/match_spec.rb +17 -0
- data/spec/slack-ruby-bot/commands/message_loop_spec.rb +34 -0
- data/spec/slack-ruby-bot/commands/nil_message_spec.rb +22 -0
- data/spec/slack-ruby-bot/commands/not_implemented_spec.rb +15 -0
- data/spec/slack-ruby-bot/commands/operators_spec.rb +20 -0
- data/spec/slack-ruby-bot/commands/operators_with_block_spec.rb +23 -0
- data/spec/slack-ruby-bot/commands/send_gif_spec.rb +32 -0
- data/spec/slack-ruby-bot/commands/send_message_spec.rb +19 -0
- data/spec/slack-ruby-bot/commands/send_message_with_gif_spec.rb +73 -0
- data/spec/slack-ruby-bot/commands/unknown_spec.rb +18 -0
- data/spec/slack-ruby-bot/config_spec.rb +55 -0
- data/spec/slack-ruby-bot/rspec/respond_with_error_spec.rb +19 -0
- data/spec/slack-ruby-bot/server_spec.rb +73 -0
- data/spec/slack-ruby-bot/version_spec.rb +7 -0
- data/spec/spec_helper.rb +1 -0
- metadata +313 -0
data/RELEASING.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# Releasing Slack-Ruby-Bot
|
2
|
+
|
3
|
+
There're no particular rules about when to release slack-ruby-bot. Release bug fixes frequenty, features not so frequently and breaking API changes rarely.
|
4
|
+
|
5
|
+
### Release
|
6
|
+
|
7
|
+
Run tests, check that all tests succeed locally.
|
8
|
+
|
9
|
+
```
|
10
|
+
bundle install
|
11
|
+
rake
|
12
|
+
```
|
13
|
+
|
14
|
+
Check that the last build succeeded in [Travis CI](https://travis-ci.org/dblock/slack-ruby-bot) for all supported platforms.
|
15
|
+
|
16
|
+
Increment the version, modify [lib/slack-ruby-bot/version.rb](lib/slack-ruby-bot/version.rb).
|
17
|
+
|
18
|
+
* Increment the third number if the release has bug fixes and/or very minor features, only (eg. change `0.2.1` to `0.2.2`).
|
19
|
+
* Increment the second number if the release contains major features or breaking API changes (eg. change `0.2.1` to `0.3.0`).
|
20
|
+
|
21
|
+
Change "Next Release" in [CHANGELOG.md](CHANGELOG.md) to the new version.
|
22
|
+
|
23
|
+
```
|
24
|
+
### 0.2.2 (7/10/2015)
|
25
|
+
```
|
26
|
+
|
27
|
+
Remove the line with "Your contribution here.", since there will be no more contributions to this release.
|
28
|
+
|
29
|
+
Commit your changes.
|
30
|
+
|
31
|
+
```
|
32
|
+
git add CHANGELOG.md lib/slack-ruby-bot/version.rb
|
33
|
+
git commit -m "Preparing for release, 0.2.2."
|
34
|
+
git push origin master
|
35
|
+
```
|
36
|
+
|
37
|
+
Release.
|
38
|
+
|
39
|
+
```
|
40
|
+
$ rake release
|
41
|
+
|
42
|
+
slack-ruby-bot 0.2.2 built to pkg/slack-ruby-bot-0.2.2.gem.
|
43
|
+
Tagged v0.2.2.
|
44
|
+
Pushed git commits and tags.
|
45
|
+
Pushed slack-ruby-bot 0.2.2 to rubygems.org.
|
46
|
+
```
|
47
|
+
|
48
|
+
### Prepare for the Next Version
|
49
|
+
|
50
|
+
Add the next release to [CHANGELOG.md](CHANGELOG.md).
|
51
|
+
|
52
|
+
```
|
53
|
+
Next Release
|
54
|
+
============
|
55
|
+
|
56
|
+
* Your contribution here.
|
57
|
+
```
|
58
|
+
|
59
|
+
Increment the third version number in [lib/slack-ruby-bot/version.rb](lib/slack-ruby-bot/version.rb).
|
60
|
+
|
61
|
+
Comit your changes.
|
62
|
+
|
63
|
+
```
|
64
|
+
git add CHANGELOG.md lib/slack-ruby-bot/version.rb
|
65
|
+
git commit -m "Preparing for next development iteration, 0.2.3."
|
66
|
+
git push origin master
|
67
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
|
5
|
+
Bundler.setup :default, :development
|
6
|
+
|
7
|
+
unless ENV['RACK_ENV'] == 'production'
|
8
|
+
require 'rspec/core'
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
|
11
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
12
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'rubocop/rake_task'
|
16
|
+
RuboCop::RakeTask.new
|
17
|
+
|
18
|
+
task default: [:rubocop, :spec]
|
19
|
+
end
|
data/TUTORIAL.md
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
## Production Bot Tutorial
|
2
|
+
|
3
|
+
In this tutorial we'll implement [slack-mathbot](https://github.com/dblock/slack-mathbot).
|
4
|
+
|
5
|
+
### Introduction
|
6
|
+
|
7
|
+
A typical production Slack bot is a combination of a vanilla web server and a websocket application that talks to the [Slack Real Time Messaging API](https://api.slack.com/rtm). The web server is optional, but most people will run their Slack bots on [Heroku](https://dashboard.heroku.com) in which case a web server is required to prevent Heroku from shutting the bot down. It also makes it convenient to develop a bot and test using `foreman`.
|
8
|
+
|
9
|
+
### Getting Started
|
10
|
+
|
11
|
+
#### Gemfile
|
12
|
+
|
13
|
+
Create a `Gemfile` that uses [slack-ruby-bot](https://github.com/dblock/slack-ruby-bot), [sinatra](https://github.com/sinatra/sinatra) (a web framework) and [puma](https://github.com/puma/puma) (a web server). For development we'll also use [foreman](https://github.com/theforeman/foreman) and write tests with [rspec](https://github.com/rspec/rspec).
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
source 'http://rubygems.org'
|
17
|
+
|
18
|
+
gem 'slack-ruby-bot'
|
19
|
+
gem 'puma'
|
20
|
+
gem 'sinatra'
|
21
|
+
|
22
|
+
group :development, :test do
|
23
|
+
gem 'rake'
|
24
|
+
gem 'foreman'
|
25
|
+
end
|
26
|
+
|
27
|
+
group :test do
|
28
|
+
gem 'rspec'
|
29
|
+
gem 'rack-test'
|
30
|
+
end
|
31
|
+
```
|
32
|
+
|
33
|
+
Run `bundle install` to get all the gems.
|
34
|
+
|
35
|
+
#### Application
|
36
|
+
|
37
|
+
Create a folder called `slack-mathbot` and inside of it create `app.rb`.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
module SlackMathbot
|
41
|
+
class App < SlackRubyBot::App
|
42
|
+
end
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
#### Commands
|
47
|
+
|
48
|
+
Create a folder called `slack-mathbot/commands` and inside of it create `calculate.rb`. For now this calculator will always return 4.
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
module SlackMathbot
|
52
|
+
module Commands
|
53
|
+
class Calculate < SlackRubyBot::Commands::Base
|
54
|
+
command 'calculate' do |client, data, _match|
|
55
|
+
send_message client, data.channel, '4'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
#### Require Everything
|
63
|
+
|
64
|
+
Create a `slack-mathbot.rb` at the root and require the above files.
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
require 'slack-ruby-bot'
|
68
|
+
require 'slack-mathbot/commands/calculate'
|
69
|
+
require 'slack-mathbot/app'
|
70
|
+
```
|
71
|
+
|
72
|
+
#### Web Server
|
73
|
+
|
74
|
+
We will need to keep the bot alive on Heroku, so create `web.rb`.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
require 'sinatra/base'
|
78
|
+
|
79
|
+
module SlackMathbot
|
80
|
+
class Web < Sinatra::Base
|
81
|
+
get '/' do
|
82
|
+
'Math is good for you.'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
```
|
87
|
+
|
88
|
+
#### Config.ru
|
89
|
+
|
90
|
+
Tie all the pieces together in `config.ru` which creates a thread for the bot and runs the web server on the main thread.
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
94
|
+
|
95
|
+
require 'slack-mathbot'
|
96
|
+
require 'web'
|
97
|
+
|
98
|
+
Thread.abort_on_exception = true
|
99
|
+
|
100
|
+
Thread.new do
|
101
|
+
begin
|
102
|
+
SlackMathbot::App.instance.run
|
103
|
+
rescue Exception => e
|
104
|
+
STDERR.puts "ERROR: #{e}"
|
105
|
+
STDERR.puts e.backtrace
|
106
|
+
raise e
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
run SlackMathbot::Web
|
111
|
+
```
|
112
|
+
|
113
|
+
### Create a Bot User
|
114
|
+
|
115
|
+
In Slack administration create a new Bot Integration under [services/new/bot](http://slack.com/services/new/bot).
|
116
|
+
|
117
|
+
![](screenshots/register-bot.png)
|
118
|
+
|
119
|
+
On the next screen, note the API token.
|
120
|
+
|
121
|
+
#### .env
|
122
|
+
|
123
|
+
Create a `.env` file with the API token from above and make sure to add it to `.gitignore`.
|
124
|
+
|
125
|
+
```
|
126
|
+
SLACK_API_TOKEN=...
|
127
|
+
```
|
128
|
+
|
129
|
+
### Procfile
|
130
|
+
|
131
|
+
Create a `Procfile` which `foreman` will use when you run the `foreman start` command below.
|
132
|
+
|
133
|
+
```
|
134
|
+
web: bundle exec puma -p $PORT
|
135
|
+
```
|
136
|
+
|
137
|
+
### Run the Bot
|
138
|
+
|
139
|
+
Run `foreman start`. Your bot should be running.
|
140
|
+
|
141
|
+
```
|
142
|
+
14:32:32 web.1 | Puma starting in single mode...
|
143
|
+
14:32:32 web.1 | * Version 2.11.3 (ruby 2.1.6-p336), codename: Intrepid Squirrel
|
144
|
+
14:32:32 web.1 | * Min threads: 0, max threads: 16
|
145
|
+
14:32:32 web.1 | * Environment: development
|
146
|
+
14:32:35 web.1 | * Listening on tcp://0.0.0.0:5000
|
147
|
+
14:32:35 web.1 | Use Ctrl-C to stop
|
148
|
+
14:32:36 web.1 | I, [2015-07-10T14:32:36.216663 #98948] INFO -- : Welcome 'mathbot' to the 'xyz' team at https://xyz.slack.com/.
|
149
|
+
14:32:36 web.1 | I, [2015-07-10T14:32:36.766955 #98948] INFO -- : Successfully connected to https://xyz.slack.com/.
|
150
|
+
```
|
151
|
+
|
152
|
+
### Try
|
153
|
+
|
154
|
+
Invite the bot to a channel via `/invite [bot name]` and send it a `calculate` command with `[bot name] calculate 2+2`. It will respond with `4` from the code above.
|
155
|
+
|
156
|
+
### Write Tests
|
157
|
+
|
158
|
+
#### Spec Helper
|
159
|
+
|
160
|
+
Create `spec/spec_helper.rb` that includes the bot files and shared RSpec support from slack-ruby-bot.
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
|
164
|
+
|
165
|
+
require 'slack-ruby-bot/rspec'
|
166
|
+
require 'slack-mathbot'
|
167
|
+
```
|
168
|
+
|
169
|
+
#### Test the Bot Application
|
170
|
+
|
171
|
+
Create a test for the bot application itself in `spec/slack-mathbot/app_spec.rb`.
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
require 'spec_helper'
|
175
|
+
|
176
|
+
describe SlackMathbot::App do
|
177
|
+
def app
|
178
|
+
SlackMathbot::App.new
|
179
|
+
end
|
180
|
+
it_behaves_like 'a slack ruby bot'
|
181
|
+
end
|
182
|
+
```
|
183
|
+
|
184
|
+
#### Test a Command
|
185
|
+
|
186
|
+
Create a test for the `calculate` command in `spec/slack-mathbot/commands/calculate_spec.rb`. The bot is addressed by its user name.
|
187
|
+
|
188
|
+
```ruby
|
189
|
+
require 'spec_helper'
|
190
|
+
|
191
|
+
describe SlackMathbot::Commands::Calculate do
|
192
|
+
def app
|
193
|
+
SlackMathbot::App.new
|
194
|
+
end
|
195
|
+
it 'returns 4' do
|
196
|
+
expect(message: "#{SlackRubyBot.config.user} calculate 2+2", channel: 'channel').to respond_with_slack_message('4')
|
197
|
+
end
|
198
|
+
end
|
199
|
+
```
|
200
|
+
|
201
|
+
See [lib/slack-ruby-bot/rspec/support/slack-ruby-bot](lib/slack-ruby-bot/rspec/support/slack-ruby-bot) for other shared RSpec behaviors.
|
202
|
+
|
203
|
+
### Deploy
|
204
|
+
|
205
|
+
See [DEPLOYMENT](DEPLOYMENT.md) for how to deploy your bot to production.
|
data/UPGRADING.md
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
Upgrading SlackRubyBot
|
2
|
+
======================
|
3
|
+
|
4
|
+
### Upgrading to >= 0.4.0
|
5
|
+
|
6
|
+
This version uses [slack-ruby-client](https://github.com/dblock/slack-ruby-client) instead of [slack-ruby-gem](https://github.com/aki017/slack-ruby-gem).
|
7
|
+
|
8
|
+
The command interface now takes a `client` parameter, which is the RealTime Messaging API instance. Add the new parameter to all `call` calls in classes that inherit from `SlackRubyBot::Commands::Base`.
|
9
|
+
|
10
|
+
Before:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
def self.call(data, match)
|
14
|
+
...
|
15
|
+
end
|
16
|
+
```
|
17
|
+
|
18
|
+
After:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
def self.call(client, data, match)
|
22
|
+
...
|
23
|
+
end
|
24
|
+
```
|
25
|
+
|
26
|
+
This also applies to `command`, `operator` and `match` blocks.
|
27
|
+
|
28
|
+
Before:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
command 'ping' do |data, match|
|
32
|
+
...
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
After:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
command 'ping' do |client, data, match|
|
40
|
+
...
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
You can now send messages directly via the RealTime Messaging API.
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
client.message text: 'text', channel: 'channel'
|
48
|
+
```
|
49
|
+
|
50
|
+
Otherwise you must now pass the `client` parameter to `send_message` and `send_message_with_gif`.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
def self.call(client, data, match)
|
54
|
+
send_message client, data.channel, 'hello'
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
def self.call(client, data, match)
|
60
|
+
send_message_with_gif client, data.channel, 'hello', 'hi'
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
console: bundle exec ruby pongbot.rb
|
@@ -0,0 +1 @@
|
|
1
|
+
console: bundle exec ruby weatherbot.rb
|
@@ -0,0 +1,14 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'boot'
|
5
|
+
|
6
|
+
Bundler.require :default, ENV['RACK_ENV']
|
7
|
+
|
8
|
+
Dir[File.expand_path('../../initializers', __FILE__) + '/**/*.rb'].each do |file|
|
9
|
+
require file
|
10
|
+
end
|
11
|
+
|
12
|
+
require File.expand_path('../application', __FILE__)
|
13
|
+
|
14
|
+
require 'slack_ruby_bot'
|
data/lib/config/boot.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path('../config/environment', __FILE__)
|
2
|
+
|
3
|
+
require 'slack-ruby-bot/version'
|
4
|
+
require 'slack-ruby-bot/about'
|
5
|
+
require 'slack-ruby-bot/config'
|
6
|
+
require 'slack-ruby-bot/hooks'
|
7
|
+
|
8
|
+
module SlackRubyBot
|
9
|
+
class << self
|
10
|
+
def configure
|
11
|
+
block_given? ? yield(Config) : Config
|
12
|
+
end
|
13
|
+
|
14
|
+
def config
|
15
|
+
Config
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'slack-ruby-client'
|
21
|
+
require 'slack-ruby-bot/commands'
|
22
|
+
require 'slack-ruby-bot/client'
|
23
|
+
require 'slack-ruby-bot/server'
|
24
|
+
require 'slack-ruby-bot/app'
|
25
|
+
require 'slack-ruby-bot/bot'
|