slack-bot-manager 0.1.0pre1 → 0.1.0pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitmodules +0 -3
- data/.rubocop.yml +6 -0
- data/.rubocop_todo.yml +81 -0
- data/.travis.yml +26 -0
- data/CHANGELOG.md +1 -1
- data/Gemfile +6 -0
- data/README.md +62 -11
- data/Rakefile +17 -0
- data/examples/dm-bot/Gemfile +5 -0
- data/examples/dm-bot/Gemfile.lock +40 -0
- data/examples/dm-bot/README.md +23 -0
- data/examples/dm-bot/dm-bot.rb +98 -0
- data/examples/dm-bot/tokens.yml.sample +2 -0
- data/lib/slack-bot-manager/client/base.rb +50 -14
- data/lib/slack-bot-manager/client/commands.rb +5 -7
- data/lib/slack-bot-manager/config.rb +41 -13
- data/lib/slack-bot-manager/errors.rb +10 -13
- data/lib/slack-bot-manager/extend.rb +13 -2
- data/lib/slack-bot-manager/logger.rb +12 -8
- data/lib/slack-bot-manager/manager/base.rb +5 -3
- data/lib/slack-bot-manager/manager/connection.rb +88 -87
- data/lib/slack-bot-manager/manager/storage/dalli.rb +63 -0
- data/lib/slack-bot-manager/manager/storage/redis.rb +55 -0
- data/lib/slack-bot-manager/manager/storage.rb +6 -0
- data/lib/slack-bot-manager/manager/tokens.rb +26 -20
- data/lib/slack-bot-manager/version.rb +1 -1
- data/lib/slack-bot-manager.rb +2 -0
- data/slack-bot-manager.gemspec +10 -9
- data/spec/fixtures/slack-bot-manager/web/rtm_start.yml +59 -0
- data/spec/integration/client_spec.rb +62 -0
- data/spec/integration/manager_spec.rb +121 -0
- data/spec/slack-bot-manager/client/base_spec.rb +96 -0
- data/spec/slack-bot-manager/config_spec.rb +19 -0
- data/spec/slack-bot-manager/errors_spec.rb +5 -0
- data/spec/slack-bot-manager/extend_spec.rb +5 -0
- data/spec/slack-bot-manager/logger_spec.rb +5 -0
- data/spec/slack-bot-manager/version_spec.rb +7 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/vcr.rb +8 -0
- metadata +153 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e99eff3580607b9be5f2a6693e549ec0f4e8b111
|
4
|
+
data.tar.gz: f70a660184a3dc53ebcf2f8c575854d29813a615
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 926df5bbfeee60eaf86a51baff44679ea524f27f9b85cde4ff6078fea5f986556cb3c9ea714db877c57cef434d4b32564e337ce380bd7996aef750d0c561083d
|
7
|
+
data.tar.gz: 7165e5e5dc98dbf1745cdeec70257252c41f8f478bb0403a43bbb6012de02708e07a1deda7370a2b592cd9ac2eb5892c382624171330075ccad4339d3d591f30
|
data/.gitignore
CHANGED
data/.gitmodules
CHANGED
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2016-02-07 01:40:37 -0500 using RuboCop version 0.36.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
Lint/UselessAssignment:
|
11
|
+
Exclude:
|
12
|
+
- 'spec/integration/manager_spec.rb'
|
13
|
+
|
14
|
+
# Offense count: 4
|
15
|
+
Metrics/AbcSize:
|
16
|
+
Max: 90
|
17
|
+
|
18
|
+
# Offense count: 2
|
19
|
+
Metrics/CyclomaticComplexity:
|
20
|
+
Max: 13
|
21
|
+
|
22
|
+
# Offense count: 13
|
23
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
|
24
|
+
# URISchemes: http, https
|
25
|
+
Metrics/LineLength:
|
26
|
+
Max: 120
|
27
|
+
|
28
|
+
# Offense count: 6
|
29
|
+
# Configuration parameters: CountComments.
|
30
|
+
Metrics/MethodLength:
|
31
|
+
Max: 43
|
32
|
+
|
33
|
+
# Offense count: 1
|
34
|
+
# Configuration parameters: CountComments.
|
35
|
+
Metrics/ModuleLength:
|
36
|
+
Max: 113
|
37
|
+
|
38
|
+
# Offense count: 2
|
39
|
+
Metrics/PerceivedComplexity:
|
40
|
+
Max: 14
|
41
|
+
|
42
|
+
# Offense count: 16
|
43
|
+
Style/Documentation:
|
44
|
+
Exclude:
|
45
|
+
- 'spec/**/*'
|
46
|
+
- 'test/**/*'
|
47
|
+
- 'lib/slack-bot-manager/client/base.rb'
|
48
|
+
- 'lib/slack-bot-manager/client/commands.rb'
|
49
|
+
- 'lib/slack-bot-manager/config.rb'
|
50
|
+
- 'lib/slack-bot-manager/errors.rb'
|
51
|
+
- 'lib/slack-bot-manager/extend.rb'
|
52
|
+
- 'lib/slack-bot-manager/logger.rb'
|
53
|
+
- 'lib/slack-bot-manager/manager/base.rb'
|
54
|
+
- 'lib/slack-bot-manager/manager/connection.rb'
|
55
|
+
- 'lib/slack-bot-manager/manager/storage.rb'
|
56
|
+
- 'lib/slack-bot-manager/manager/storage/dalli.rb'
|
57
|
+
- 'lib/slack-bot-manager/manager/storage/redis.rb'
|
58
|
+
- 'lib/slack-bot-manager/manager/tokens.rb'
|
59
|
+
|
60
|
+
# Offense count: 1
|
61
|
+
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
|
62
|
+
Style/FileName:
|
63
|
+
Exclude:
|
64
|
+
- 'lib/slack-bot-manager.rb'
|
65
|
+
|
66
|
+
# Offense count: 1
|
67
|
+
Style/ModuleFunction:
|
68
|
+
Exclude:
|
69
|
+
- 'lib/slack-bot-manager/config.rb'
|
70
|
+
|
71
|
+
# Offense count: 3
|
72
|
+
# Cop supports --auto-correct.
|
73
|
+
Style/RedundantSelf:
|
74
|
+
Exclude:
|
75
|
+
- 'lib/slack-bot-manager/config.rb'
|
76
|
+
|
77
|
+
# Offense count: 2
|
78
|
+
# Cop supports --auto-correct.
|
79
|
+
Style/RescueModifier:
|
80
|
+
Exclude:
|
81
|
+
- 'lib/slack-bot-manager/manager/connection.rb'
|
data/.travis.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
cache: bundler
|
4
|
+
|
5
|
+
rvm:
|
6
|
+
- 2.2
|
7
|
+
- 2.1
|
8
|
+
- 2.0
|
9
|
+
- rbx-2
|
10
|
+
- jruby-19mode
|
11
|
+
- ruby-head
|
12
|
+
- jruby-head
|
13
|
+
|
14
|
+
matrix:
|
15
|
+
allow_failures:
|
16
|
+
- rvm: ruby-head
|
17
|
+
- rvm: jruby-head
|
18
|
+
- rvm: jruby-19mode
|
19
|
+
- rvm: rbx-2
|
20
|
+
|
21
|
+
git:
|
22
|
+
submodules: false
|
23
|
+
|
24
|
+
env:
|
25
|
+
#- CONCURRENCY=celluloid-io
|
26
|
+
- CONCURRENCY=faye-websocket
|
data/CHANGELOG.md
CHANGED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -1,23 +1,43 @@
|
|
1
1
|
# Slack Bot Manager
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/slack-bot-manager.svg)](http://badge.fury.io/rb/slack-bot-manager)
|
4
|
+
[![Build Status](https://travis-ci.org/betaworks/slack-bot-manager.svg?branch=master)](https://travis-ci.org/betaworks/slack-bot-manager)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/betaworks/slack-bot-manager/badges/gpa.svg)](https://codeclimate.com/github/betaworks/slack-bot-manager)
|
6
|
+
|
3
7
|
Slack Bot Manager is a Ruby gem that allows for the management of multiple Slack RTM connections based on tokens. With only a few configuration changes, you can run a system for handling hundreds of simulatenous RTM connections for your Slack app.
|
4
8
|
|
9
|
+
_This is in pre-release and may change before release of version 0.1.0._
|
5
10
|
|
6
11
|
|
7
|
-
|
12
|
+
__How to tell if you need this:__
|
8
13
|
|
9
|
-
|
14
|
+
* You are making a Slack app requiring Real-time Messaging
|
15
|
+
* You want to be able to handle multiple RTM connections
|
16
|
+
* You don't want to make your own RTM (websocket) connection manager
|
10
17
|
|
11
|
-
`gem 'slack-bot-manager', github: 'betaworks/slack-bot-manager', branch: 'master'`
|
12
18
|
|
13
|
-
|
14
|
-
You will need to have `redis` running for this gem to work.
|
19
|
+
## Installation
|
15
20
|
|
21
|
+
`gem 'slack-bot-manager'`
|
22
|
+
|
23
|
+
This gem requires a key-value storage system for managing tokens and connection statuses. Currently, this gem supports `redis` and `dalli` (memcached).
|
24
|
+
|
25
|
+
```
|
26
|
+
gem 'redis'
|
27
|
+
gem 'dalli'
|
28
|
+
```
|
16
29
|
|
17
30
|
|
18
31
|
## Getting Started
|
19
32
|
|
20
|
-
(
|
33
|
+
To get started, get a token (or few) and start your script.
|
34
|
+
|
35
|
+
```
|
36
|
+
botmanager = SlackBotManager::Manager.new
|
37
|
+
botmanager.add_token('token1', 'token2', 'token3')
|
38
|
+
botmanager.start
|
39
|
+
botmanager.monitor
|
40
|
+
```
|
21
41
|
|
22
42
|
|
23
43
|
|
@@ -49,7 +69,7 @@ methods | description
|
|
49
69
|
|
50
70
|
### Token Management Methods
|
51
71
|
|
52
|
-
Tokens are managed
|
72
|
+
Tokens are managed using key storage, currently only supporting Redis. SlackBotManager will manage and monitor these keys for additions, updates, and removals. New connections will be added into the key `teams_key`, like so:
|
53
73
|
|
54
74
|
```
|
55
75
|
botmanager = SlackBotManager::Manager.new
|
@@ -76,7 +96,7 @@ The following instance variables are accessible by Client and the included Comma
|
|
76
96
|
variable | description
|
77
97
|
--------------|----------------------------------------------------------------------------------------
|
78
98
|
`connection` | `Slack::RealTime::Client` connection
|
79
|
-
`id` | Team's Slack ID (ex. `T123ABC`)
|
99
|
+
`id` | Team's Slack ID (ex. `T123ABC`) _(set after successful connection)_
|
80
100
|
`token` | Team's Slack access token (ex. `xoxb-123abc456def`)
|
81
101
|
`status` | Known connection status. (`connected`, `disconnected`, `rate_limited`, `token_revoked`)
|
82
102
|
|
@@ -114,7 +134,8 @@ setting | description
|
|
114
134
|
`tokens_key` | Redis key name for where tokens' status are stored. _(default: tokens:statuses)_
|
115
135
|
`teams_key` | Redis key name for where teams' tokens are stored. _(default: tokens:teams)_
|
116
136
|
`check_interval` | Interval (in seconds) for checking connections and tokens status. _(default: 5)_
|
117
|
-
`
|
137
|
+
`storage_method` | Token storage method. _(default: nil)_
|
138
|
+
`storage_options` | Token storage method options. _(default: {})_
|
118
139
|
`logger` | Define the logger to use. _(default: Rails.logger or ::Logger.new(STDOUT))_
|
119
140
|
`log_level` | Explicity define the logger level. _(default: ::Logger::WARN)_
|
120
141
|
`verbose` | When true, set `log_level` to ::Logger::DEBUG. _(default: false)_
|
@@ -123,18 +144,47 @@ You can define these configuration options as:
|
|
123
144
|
|
124
145
|
```
|
125
146
|
SlackBotManager::Manager.configure do |config|
|
126
|
-
config.
|
147
|
+
config.storage_method = SlackBotManager::Storage::Redis
|
148
|
+
config.storage_options = {host: '0.0.0.0', port: 6379}
|
127
149
|
config.check_interval = 10 # in seconds
|
128
150
|
end
|
129
151
|
```
|
130
152
|
|
153
|
+
You can additionally send an existing storage method as the `storage_option`, such as:
|
154
|
+
|
155
|
+
```
|
156
|
+
SlackBotManager::Manager.configure do |config|
|
157
|
+
config.storage_options = $redis # Existing Redis connection, where $redis = Redis.new
|
158
|
+
end
|
159
|
+
```
|
160
|
+
|
161
|
+
### Client configuration options
|
162
|
+
|
163
|
+
setting | description
|
164
|
+
------------------|-----------------------------------------------------------------------------------
|
165
|
+
`logger` | Define the logger to use. _(default: Rails.logger or ::Logger.new(STDOUT))_
|
166
|
+
`log_level` | Explicity define the logger level. _(default: ::Logger::WARN)_
|
167
|
+
`verbose` | When true, set `log_level` to ::Logger::DEBUG. _(default: false)_
|
168
|
+
|
169
|
+
You can define these configuration options as:
|
170
|
+
|
171
|
+
```
|
172
|
+
SlackBotManager::Client.configure do |config|
|
173
|
+
config.check_interval = 10 # in seconds
|
174
|
+
config.log_level = ::Logger::INFO
|
175
|
+
end
|
176
|
+
```
|
177
|
+
|
178
|
+
|
179
|
+
### Additional configuration options
|
180
|
+
|
131
181
|
For customization of Slack connections, including proxy, websocket ping, endpoint, user-agent, and more, check out the [slack-ruby-client README](https://github.com/dblock/slack-ruby-client/blob/master/README.md).
|
132
182
|
|
133
183
|
|
134
184
|
|
135
185
|
## Examples
|
136
186
|
|
137
|
-
(
|
187
|
+
You can check a few creative examples in the [examples](examples/) folder.
|
138
188
|
|
139
189
|
|
140
190
|
|
@@ -150,6 +200,7 @@ Also thanks to [slack-ruby-client](https://github.com/dblock/slack-ruby-client).
|
|
150
200
|
|
151
201
|
See [CONTRIBUTING](CONTRIBUTING.md).
|
152
202
|
|
203
|
+
Thanks to our contributors [Greg Leuch](https://gleu.ch) and [Alex Baldwin](http://goose.im).
|
153
204
|
|
154
205
|
|
155
206
|
## Copyright and License
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
|
5
|
+
Bundler.setup :default, :development
|
6
|
+
|
7
|
+
require 'rspec/core'
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
|
10
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
11
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'rubocop/rake_task'
|
15
|
+
RuboCop::RakeTask.new
|
16
|
+
|
17
|
+
task default: [:rubocop, :spec]
|
@@ -0,0 +1,40 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
eventmachine (1.0.9.1)
|
5
|
+
faraday (0.9.2)
|
6
|
+
multipart-post (>= 1.2, < 3)
|
7
|
+
faraday_middleware (0.10.0)
|
8
|
+
faraday (>= 0.7.4, < 0.10)
|
9
|
+
faye-websocket (0.10.2)
|
10
|
+
eventmachine (>= 0.12.0)
|
11
|
+
websocket-driver (>= 0.5.1)
|
12
|
+
gli (2.13.4)
|
13
|
+
hashie (3.4.3)
|
14
|
+
json (1.8.3)
|
15
|
+
multipart-post (2.0.0)
|
16
|
+
redis (3.2.2)
|
17
|
+
slack-bot-manager (0.1.0pre1)
|
18
|
+
faye-websocket (>= 0.10.0)
|
19
|
+
redis (>= 3.2.2)
|
20
|
+
slack-ruby-client (>= 0.5.1)
|
21
|
+
slack-ruby-client (0.6.0)
|
22
|
+
faraday
|
23
|
+
faraday_middleware
|
24
|
+
gli
|
25
|
+
hashie
|
26
|
+
json
|
27
|
+
websocket-driver
|
28
|
+
websocket-driver (0.6.3)
|
29
|
+
websocket-extensions (>= 0.1.0)
|
30
|
+
websocket-extensions (0.1.2)
|
31
|
+
|
32
|
+
PLATFORMS
|
33
|
+
ruby
|
34
|
+
|
35
|
+
DEPENDENCIES
|
36
|
+
redis
|
37
|
+
slack-bot-manager
|
38
|
+
|
39
|
+
BUNDLED WITH
|
40
|
+
1.10.6
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# DM-Bot
|
2
|
+
|
3
|
+
An exmaple bot for handling direct messages with users using [slack-bot-manager](https://github.com/betaworks/slack-bot-manager).
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
|
8
|
+
Install `slack-bot-manager` and move over your `tokens.yml` file.
|
9
|
+
|
10
|
+
```
|
11
|
+
bundle install
|
12
|
+
mv tokens.yml.sample tokens.yml
|
13
|
+
```
|
14
|
+
|
15
|
+
Add your token(s) into `tokens.yml`.
|
16
|
+
|
17
|
+
Run it! `ruby dm-bot.rb`
|
18
|
+
|
19
|
+
|
20
|
+
## License & Copyright
|
21
|
+
|
22
|
+
Copyright 2016 Greg Leuch & betaworks.
|
23
|
+
Licensed under MIT
|
@@ -0,0 +1,98 @@
|
|
1
|
+
#
|
2
|
+
# dm-bot.rb
|
3
|
+
# -------------------------------------------------
|
4
|
+
#
|
5
|
+
# Example created for slack-bot-manager by @gleuch.
|
6
|
+
# License: MIT
|
7
|
+
# https://github.com/betaworks/slack-bot-manager
|
8
|
+
#
|
9
|
+
# -------------------------------------------------
|
10
|
+
#
|
11
|
+
# To get started:
|
12
|
+
# 1. Run: `mv tokens.yml.sample tokens.yml`
|
13
|
+
# 2. Add your token(s) to tokens.yml
|
14
|
+
# 3. Run: `ruby dm-bot.rb`
|
15
|
+
#
|
16
|
+
|
17
|
+
|
18
|
+
# Require necessary gems
|
19
|
+
require 'yaml'
|
20
|
+
|
21
|
+
require 'rubygems'
|
22
|
+
require 'bundler/setup'
|
23
|
+
Bundler.require
|
24
|
+
|
25
|
+
# Use Redis and configure slack-bot-manager
|
26
|
+
$redis = Redis.new
|
27
|
+
SlackBotManager.configure do |config|
|
28
|
+
config.storage_options = $redis # Set entire instance as option
|
29
|
+
end
|
30
|
+
|
31
|
+
# Extend commands to handle what we want done
|
32
|
+
module SlackBotManager
|
33
|
+
module Commands
|
34
|
+
|
35
|
+
def on_message(data)
|
36
|
+
# Only support DMs with bot
|
37
|
+
return unless data['channel'].start_with?('D')
|
38
|
+
|
39
|
+
# Get user info
|
40
|
+
user_key = ['users', self.id, data['user']].join(':')
|
41
|
+
$redis.del user_key
|
42
|
+
unless $redis.exists user_key
|
43
|
+
# Get user info from Slack
|
44
|
+
user_info = self.connection.web_client.users_info(user: data['user'])['user']
|
45
|
+
|
46
|
+
# Store the basics into redis for quicker lookups
|
47
|
+
$redis.hmset user_key, *{ id: user_info['id'], name: user_info['name'], real_name: user_info['real_name'], is_bot: user_info['is_bot'] ? 1 : 0 }.flatten
|
48
|
+
# Expire this redis key weekly so that we do regular updates
|
49
|
+
$redis.expire user_key, 604800 # 1 week in seconds
|
50
|
+
end
|
51
|
+
user_info = $redis.hgetall user_key
|
52
|
+
|
53
|
+
return if [1,'1','true'].include?(user_info['is_bot'])
|
54
|
+
|
55
|
+
# Get IM info, send hello message if first time
|
56
|
+
im_key = ['ims', self.id, data['channel']].join(':')
|
57
|
+
$redis.del im_key
|
58
|
+
unless $redis.exists im_key
|
59
|
+
$redis.hmset im_key, *{ id: data['channel'], user: user_info['id'], started: Time.now.to_i, messages_sent: 0, messages_received: 0 }.flatten
|
60
|
+
self.send_message(data['channel'], "Hello there <@#{user_info['id']}>! I'm happy to listen to what you have to say. :simple_smile:")
|
61
|
+
$redis.hincrby im_key, 'messages_sent', 1
|
62
|
+
end
|
63
|
+
im_info = $redis.hgetall im_key
|
64
|
+
|
65
|
+
# Increment message count
|
66
|
+
$redis.hincrby im_key, 'messages_received', 1
|
67
|
+
|
68
|
+
# Parse message contents
|
69
|
+
message = 'If i was smarter, I would respond with something witty.'
|
70
|
+
|
71
|
+
self.send_message(data['channel'], message)
|
72
|
+
$redis.hincrby im_key, 'messages_sent', 1
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Initialize SlackBotManager
|
79
|
+
@bot_manager = SlackBotManager::Manager.new
|
80
|
+
|
81
|
+
# Load tokens from YAML list
|
82
|
+
tokens = YAML.load_file('tokens.yml')['tokens']
|
83
|
+
@bot_manager.add_token(*tokens) # Add tokens
|
84
|
+
|
85
|
+
# Close connections on sig interrupts
|
86
|
+
['INT','TERM'].each do |s|
|
87
|
+
Signal.trap(s) do
|
88
|
+
@bot_manager.stop
|
89
|
+
@bot_manager.clear_tokens
|
90
|
+
exit
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Start the RTM connections
|
95
|
+
@bot_manager.start
|
96
|
+
|
97
|
+
# Lets monitor the connection
|
98
|
+
@bot_manager.monitor
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module SlackBotManager
|
2
2
|
class Client
|
3
|
-
|
4
3
|
include Commands
|
5
4
|
include Errors
|
6
5
|
include Logger
|
@@ -8,9 +7,13 @@ module SlackBotManager
|
|
8
7
|
attr_accessor :commands, :connection, :id, :token, :status
|
9
8
|
attr_accessor(*Config::CLIENT_ATTRIBUTES)
|
10
9
|
|
11
|
-
def initialize(
|
10
|
+
def initialize(token, *args)
|
12
11
|
options = args.extract_options!
|
13
|
-
|
12
|
+
|
13
|
+
# Option values
|
14
|
+
@token = token
|
15
|
+
@id = options[:id]
|
16
|
+
@status = :disconnected
|
14
17
|
|
15
18
|
# Setup client and assign commands
|
16
19
|
@connection = Slack::RealTime::Client.new(token: @token)
|
@@ -21,28 +24,34 @@ module SlackBotManager
|
|
21
24
|
end
|
22
25
|
|
23
26
|
# Assign commands
|
24
|
-
|
27
|
+
methods.each do |n|
|
25
28
|
# Require methods to include on_*
|
26
|
-
next unless n.match(/^on_/) &&
|
29
|
+
next unless n.match(/^on_/) && respond_to?(n)
|
27
30
|
assign_event(n.to_s.gsub(/^on_/, ''), n)
|
28
31
|
end
|
32
|
+
end
|
29
33
|
|
30
|
-
|
34
|
+
# Pull info from slack-ruby-client gem
|
35
|
+
SlackBotManager::Config::RTM_CLIENT_METHODS.each do |attr|
|
36
|
+
define_method "client_#{attr}" do
|
37
|
+
connection.send(attr) if connected?
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
def connect
|
34
42
|
connection.start_async
|
43
|
+
@id ||= client_team['id']
|
35
44
|
@status = :connected
|
36
45
|
rescue => err
|
37
46
|
handle_error(err)
|
38
47
|
end
|
39
48
|
|
40
|
-
def disconnect(reason
|
49
|
+
def disconnect(reason = nil)
|
41
50
|
connection && connection.stop!
|
42
51
|
rescue => err
|
43
52
|
handle_error(err)
|
44
53
|
ensure
|
45
|
-
@status = reason if @status == :connected
|
54
|
+
@status = reason || :disconnected # if @status == :connected
|
46
55
|
remove_instance_variable(:@connection) if @connection
|
47
56
|
end
|
48
57
|
|
@@ -54,8 +63,15 @@ module SlackBotManager
|
|
54
63
|
!connected?
|
55
64
|
end
|
56
65
|
|
66
|
+
def on(evt, &block)
|
67
|
+
self.class.send(:define_method, "on_#{evt}", &block)
|
68
|
+
assign_event(evt, "on_#{evt}")
|
69
|
+
end
|
57
70
|
|
58
|
-
|
71
|
+
def off(evt)
|
72
|
+
self.class.send(:remove_method, "on_#{evt}")
|
73
|
+
unassign_event(evt)
|
74
|
+
end
|
59
75
|
|
60
76
|
def send_message(channel, text, *args)
|
61
77
|
options = args.extract_options!
|
@@ -65,6 +81,8 @@ module SlackBotManager
|
|
65
81
|
connection.message(options)
|
66
82
|
end
|
67
83
|
|
84
|
+
protected
|
85
|
+
|
68
86
|
def assign_event(evt, evt_name)
|
69
87
|
connection.on(evt) do |data|
|
70
88
|
begin
|
@@ -75,15 +93,33 @@ module SlackBotManager
|
|
75
93
|
end
|
76
94
|
end
|
77
95
|
|
96
|
+
def unassign_event(evt)
|
97
|
+
connection.off(evt) if connection
|
98
|
+
end
|
99
|
+
|
78
100
|
# Handle different error cases
|
79
|
-
def handle_error(err, data=nil)
|
101
|
+
def handle_error(err, data = nil)
|
80
102
|
case determine_error_type(err)
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
103
|
+
when :token_revoked
|
104
|
+
on_revoke(data)
|
105
|
+
when :rate_limited
|
106
|
+
on_rate_limit(data)
|
107
|
+
when :closed
|
108
|
+
on_close(data)
|
109
|
+
else
|
110
|
+
on_error(err, data)
|
85
111
|
end
|
86
112
|
end
|
87
113
|
|
114
|
+
# Include config helpers
|
115
|
+
class << self
|
116
|
+
def configure
|
117
|
+
block_given? ? yield(config) : config
|
118
|
+
end
|
119
|
+
|
120
|
+
def config
|
121
|
+
Config
|
122
|
+
end
|
123
|
+
end
|
88
124
|
end
|
89
125
|
end
|
@@ -1,26 +1,24 @@
|
|
1
1
|
module SlackBotManager
|
2
2
|
module Commands
|
3
|
-
|
4
3
|
# Handle when connection gets closed
|
5
4
|
def on_close(data, *args)
|
6
5
|
options = args.extract_options!
|
7
6
|
options[:code] ||= (data && data.code) || '1000'
|
8
7
|
|
9
8
|
disconnect
|
10
|
-
|
9
|
+
fail SlackBotManager::ConnectionRateLimited if %w(1008 429).include?(options[:code].to_s)
|
11
10
|
end
|
12
11
|
|
13
12
|
# Handle rate limit errors coming from web API
|
14
|
-
def on_revoke(
|
13
|
+
def on_revoke(*)
|
15
14
|
disconnect(:token_revoked)
|
16
|
-
|
15
|
+
fail SlackBotManager::TokenRevoked
|
17
16
|
end
|
18
17
|
|
19
18
|
# Handle rate limit errors coming from web API
|
20
|
-
def on_rate_limit(
|
19
|
+
def on_rate_limit(*)
|
21
20
|
disconnect(:rate_limited)
|
22
|
-
|
21
|
+
fail SlackBotManager::ConnectionRateLimited
|
23
22
|
end
|
24
|
-
|
25
23
|
end
|
26
24
|
end
|