slack-ruby-bot-server 0.11.0 → 0.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +1 -1
- data/.rubocop_todo.yml +44 -7
- data/.travis.yml +7 -5
- data/CHANGELOG.md +49 -22
- data/Dangerfile +1 -0
- data/Gemfile +3 -2
- data/LICENSE +1 -1
- data/README.md +122 -16
- data/images/create-app.png +0 -0
- data/lib/slack-ruby-bot-server.rb +9 -11
- data/lib/slack-ruby-bot-server/api.rb +4 -4
- data/lib/slack-ruby-bot-server/api/endpoints.rb +3 -3
- data/lib/slack-ruby-bot-server/api/endpoints/teams_endpoint.rb +4 -0
- data/lib/slack-ruby-bot-server/api/helpers.rb +4 -4
- data/lib/slack-ruby-bot-server/api/helpers/cursor_helpers.rb +2 -0
- data/lib/slack-ruby-bot-server/api/helpers/sort_helpers.rb +1 -0
- data/lib/slack-ruby-bot-server/api/middleware.rb +1 -5
- data/lib/slack-ruby-bot-server/api/presenters.rb +5 -5
- data/lib/slack-ruby-bot-server/api/presenters/status_presenter.rb +1 -0
- data/lib/slack-ruby-bot-server/config.rb +8 -0
- data/lib/slack-ruby-bot-server/config/database_adapters/activerecord.rb +2 -2
- data/lib/slack-ruby-bot-server/config/database_adapters/mongoid.rb +4 -2
- data/lib/slack-ruby-bot-server/ext/activerecord/slack-ruby-bot/commands/base.rb +1 -1
- data/lib/slack-ruby-bot-server/ext/mongoid/slack-ruby-bot/commands/base.rb +2 -2
- data/lib/slack-ruby-bot-server/models/team/activerecord.rb +8 -5
- data/lib/slack-ruby-bot-server/models/team/methods.rb +12 -0
- data/lib/slack-ruby-bot-server/models/team/mongoid.rb +8 -4
- data/lib/slack-ruby-bot-server/server.rb +1 -0
- data/lib/slack-ruby-bot-server/service.rb +45 -3
- data/lib/slack-ruby-bot-server/version.rb +1 -1
- data/public/index.html.erb +1 -0
- data/public/scripts/messages.js +33 -0
- data/public/scripts/register.js +0 -31
- data/sample_apps/sample_app_activerecord/README.md +1 -0
- data/sample_apps/sample_app_activerecord/commands/help.rb +1 -1
- data/sample_apps/sample_app_activerecord/spec/commands/help_spec.rb +1 -1
- data/sample_apps/sample_app_mongoid/commands/help.rb +1 -1
- data/sample_apps/sample_app_mongoid/spec/commands/help_spec.rb +1 -1
- data/slack-ruby-bot-server.gemspec +2 -2
- metadata +14 -13
- data/images/new.png +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5f3d74ad11628ec28dafca1d0ea2ac2b9119eb2d44aa5d8a9e55bbd07aad4bfa
|
|
4
|
+
data.tar.gz: d7cd58655aae8c5f75ca23d844cdf0820d4fcb874475aad221123473333eef25
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7ec7123d4ab6f0d7a771e473fa7de24baf8ff8d273d136c08bb105ed7088377e650b1cf1bfed821f04cf023e5dcdc24951e33d954e7cdd95af61710cfe09b7fb
|
|
7
|
+
data.tar.gz: ea6c899f378bc4f336fcd06be80a39983ba0795371260c5262501e13dcc1c322565fdcd737acea8e433eaab56509e327ee4147c80d8d1bdc3973cd7f1b6e5bf2
|
data/.github/FUNDING.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
github: [dblock]
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# This configuration was generated by
|
|
2
2
|
# `rubocop --auto-gen-config`
|
|
3
|
-
# on
|
|
3
|
+
# on 2020-07-17 08:36:05 -0400 using RuboCop version 0.81.0.
|
|
4
4
|
# The point is for the user to remove these configuration records
|
|
5
5
|
# one by one as the offenses are removed from the code base.
|
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
|
@@ -9,26 +9,63 @@
|
|
|
9
9
|
# Offense count: 3
|
|
10
10
|
# Cop supports --auto-correct.
|
|
11
11
|
# Configuration parameters: EnforcedStyle.
|
|
12
|
-
# SupportedStyles:
|
|
13
|
-
Layout/
|
|
12
|
+
# SupportedStyles: squiggly, active_support, powerpack, unindent
|
|
13
|
+
Layout/HeredocIndentation:
|
|
14
14
|
Exclude:
|
|
15
15
|
- 'lib/slack-ruby-bot-server/info.rb'
|
|
16
16
|
- 'sample_apps/sample_app_activerecord/commands/help.rb'
|
|
17
17
|
- 'sample_apps/sample_app_mongoid/commands/help.rb'
|
|
18
18
|
|
|
19
|
+
# Offense count: 1
|
|
20
|
+
Lint/AmbiguousOperator:
|
|
21
|
+
Exclude:
|
|
22
|
+
- 'spec/slack-ruby-bot-server/service_spec.rb'
|
|
23
|
+
|
|
24
|
+
# Offense count: 2
|
|
25
|
+
# Cop supports --auto-correct.
|
|
26
|
+
Lint/NonDeterministicRequireOrder:
|
|
27
|
+
Exclude:
|
|
28
|
+
- 'spec/spec_helper.rb'
|
|
29
|
+
|
|
30
|
+
# Offense count: 2
|
|
31
|
+
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
|
32
|
+
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
|
|
33
|
+
Naming/FileName:
|
|
34
|
+
Exclude:
|
|
35
|
+
- 'lib/slack-ruby-bot-server.rb'
|
|
36
|
+
- 'lib/slack-ruby-bot-server/ext/slack-ruby-bot.rb'
|
|
37
|
+
|
|
19
38
|
# Offense count: 3
|
|
20
|
-
# Configuration parameters:
|
|
21
|
-
#
|
|
39
|
+
# Configuration parameters: ForbiddenDelimiters.
|
|
40
|
+
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
|
|
22
41
|
Naming/HeredocDelimiterNaming:
|
|
23
42
|
Exclude:
|
|
24
43
|
- 'lib/slack-ruby-bot-server/info.rb'
|
|
25
44
|
- 'sample_apps/sample_app_activerecord/commands/help.rb'
|
|
26
45
|
- 'sample_apps/sample_app_mongoid/commands/help.rb'
|
|
27
46
|
|
|
47
|
+
# Offense count: 3
|
|
48
|
+
# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
|
|
49
|
+
# AllowedNames: io, id, to, by, on, in, at, ip, db, os, pp
|
|
50
|
+
Naming/MethodParameterName:
|
|
51
|
+
Exclude:
|
|
52
|
+
- 'lib/slack-ruby-bot-server/models/team/activerecord.rb'
|
|
53
|
+
- 'lib/slack-ruby-bot-server/models/team/mongoid.rb'
|
|
54
|
+
- 'lib/slack-ruby-bot-server/service.rb'
|
|
55
|
+
|
|
28
56
|
# Offense count: 1
|
|
29
57
|
# Cop supports --auto-correct.
|
|
30
|
-
# Configuration parameters: EnforcedStyle.
|
|
31
|
-
# SupportedStyles: module_function, extend_self
|
|
58
|
+
# Configuration parameters: EnforcedStyle, Autocorrect.
|
|
59
|
+
# SupportedStyles: module_function, extend_self, forbidden
|
|
32
60
|
Style/ModuleFunction:
|
|
33
61
|
Exclude:
|
|
34
62
|
- 'lib/slack-ruby-bot-server/config.rb'
|
|
63
|
+
|
|
64
|
+
# Offense count: 1
|
|
65
|
+
# Cop supports --auto-correct.
|
|
66
|
+
# Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods.
|
|
67
|
+
# SupportedStyles: predicate, comparison
|
|
68
|
+
Style/NumericPredicate:
|
|
69
|
+
Exclude:
|
|
70
|
+
- 'spec/**/*'
|
|
71
|
+
- 'lib/slack-ruby-bot-server/service.rb'
|
data/.travis.yml
CHANGED
|
@@ -4,24 +4,26 @@ cache: bundler
|
|
|
4
4
|
|
|
5
5
|
matrix:
|
|
6
6
|
include:
|
|
7
|
-
- rvm: 2.
|
|
7
|
+
- rvm: 2.6.2
|
|
8
8
|
script:
|
|
9
9
|
- bundle exec danger
|
|
10
|
-
|
|
10
|
+
services:
|
|
11
|
+
- xvfb
|
|
12
|
+
- rvm: 2.6.2
|
|
11
13
|
env: DATABASE_ADAPTER=activerecord
|
|
12
14
|
services:
|
|
15
|
+
- xvfb
|
|
13
16
|
- postgresql
|
|
14
|
-
- rvm: 2.
|
|
17
|
+
- rvm: 2.6.2
|
|
15
18
|
env: DATABASE_ADAPTER=mongoid
|
|
16
19
|
services:
|
|
20
|
+
- xvfb
|
|
17
21
|
- mongodb
|
|
18
22
|
|
|
19
23
|
addons:
|
|
20
24
|
firefox: 54.0
|
|
21
25
|
|
|
22
26
|
before_install:
|
|
23
|
-
- export DISPLAY=:99.0
|
|
24
|
-
- sh -e /etc/init.d/xvfb start
|
|
25
27
|
- wget https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.18.0-linux64.tar.gz
|
|
26
28
|
- mkdir geckodriver
|
|
27
29
|
- tar -xzf geckodriver-v0.18.0-linux64.tar.gz -C geckodriver
|
data/CHANGELOG.md
CHANGED
|
@@ -1,16 +1,43 @@
|
|
|
1
1
|
### Changelog
|
|
2
2
|
|
|
3
|
-
#### 0.
|
|
3
|
+
#### 0.12.3 (2020/11/14)
|
|
4
|
+
|
|
5
|
+
* [#123](https://github.com/slack-ruby/slack-ruby-bot-server/pull/123): Reactivate a team that was disabled from Slack - [@dblock](https://github.com/dblock).
|
|
6
|
+
* [#127](https://github.com/slack-ruby/slack-ruby-bot-server/pull/127): Added a Rails bot example link - [@CrazyOptimist](https://github.com/CrazyOptimist).
|
|
7
|
+
|
|
8
|
+
#### 0.12.2 (2020/7/26)
|
|
9
|
+
|
|
10
|
+
* [#120](https://github.com/slack-ruby/slack-ruby-bot-server/pull/120): Removed GIFs - [@dblock](https://github.com/dblock).
|
|
11
|
+
* [#121](https://github.com/slack-ruby/slack-ruby-bot-server/pull/121): Added TOC - [@dblock](https://github.com/dblock).
|
|
12
|
+
|
|
13
|
+
#### 0.12.1 (2020/5/16)
|
|
14
|
+
|
|
15
|
+
* [#118](https://github.com/slack-ruby/slack-ruby-bot-server/pull/118): Do not fail to start on errors in `Team#purge!` - [@dblock](https://github.com/dblock).
|
|
16
|
+
|
|
17
|
+
#### 0.12.0 (2020/4/26)
|
|
18
|
+
|
|
19
|
+
* [#113](https://github.com/slack-ruby/slack-ruby-bot-server/pull/113): Added support for intervals with `.every` - [@dblock](https://github.com/dblock).
|
|
20
|
+
* [#112](https://github.com/slack-ruby/slack-ruby-bot-server/pull/112): Added support for multiple `.on` events as an argument - [@dblock](https://github.com/dblock).
|
|
21
|
+
* [#111](https://github.com/slack-ruby/slack-ruby-bot-server/pull/111): Removed dependency on Virtus - [@dblock](https://github.com/dblock).
|
|
22
|
+
* [#110](https://github.com/slack-ruby/slack-ruby-bot-server/pull/110): Fixed ActiveRecord sample app - [@CeeBeeUK](https://github.com/CeeBeeUK).
|
|
23
|
+
* [#114](https://github.com/slack-ruby/slack-ruby-bot-server/pull/114): Used `require_relative` to prevent local collisions - [@dblock](https://github.com/dblock).
|
|
24
|
+
* [#115](https://github.com/slack-ruby/slack-ruby-bot-server/pull/115): Added `Config#view_paths` to be used by Rack middleware - [@dblock](https://github.com/dblock).
|
|
25
|
+
|
|
26
|
+
#### 0.11.1 (2019/5/17)
|
|
27
|
+
|
|
28
|
+
* [#104](https://github.com/slack-ruby/slack-ruby-bot-server/pull/104): Locked async-websocket at a compatible 0.8.0 version - [@dblock](https://github.com/dblock).
|
|
29
|
+
|
|
30
|
+
#### 0.11.0 (2019/4/12)
|
|
4
31
|
|
|
5
32
|
* [#101](https://github.com/slack-ruby/slack-ruby-bot-server/pull/101): Removed legacy migrations, including `SLACK_API_TOKEN`, team `name`, `team_id` and `active` - [@dblock](https://github.com/dblock).
|
|
6
33
|
* [#98](https://github.com/slack-ruby/slack-ruby-bot-server/pull/98): Removed `unicorn` from gem dependencies - [@dblock](https://github.com/dblock).
|
|
7
|
-
* [#90](https://github.com/slack-ruby/slack-ruby-bot-server/pull/90):
|
|
34
|
+
* [#90](https://github.com/slack-ruby/slack-ruby-bot-server/pull/90): Updated ActiveRecord sample app to support ENV variables in `postgresql.yml` - [@ashkan18](https://github.com/ashkan18).
|
|
8
35
|
|
|
9
36
|
#### 0.10.0 (2019/3/23)
|
|
10
37
|
|
|
11
38
|
* [#97](https://github.com/slack-ruby/slack-ruby-bot-server/pull/97): Added `Config#service_class` to override the `SlackRubyBotServer::Service.instance` singleton - [@dblock](https://github.com/dblock).
|
|
12
39
|
* [#96](https://github.com/slack-ruby/slack-ruby-bot-server/pull/96): Added `Team#bot_user_id`, `activated_user_id` and `activated_user_access_token` - [@dblock](https://github.com/dblock).
|
|
13
|
-
* [#95](https://github.com/slack-ruby/slack-ruby-bot-server/pull/95):
|
|
40
|
+
* [#95](https://github.com/slack-ruby/slack-ruby-bot-server/pull/95): Exposed the optional `state` parameter that is returned from the Add to Slack button - [@aok-solutions](https://github.com/aok-solutions).
|
|
14
41
|
|
|
15
42
|
#### 0.9.0 (2019/2/25)
|
|
16
43
|
|
|
@@ -18,31 +45,31 @@
|
|
|
18
45
|
|
|
19
46
|
#### 0.8.3 (2019/1/17)
|
|
20
47
|
|
|
21
|
-
* [#88](https://github.com/slack-ruby/slack-ruby-bot-server/issues/88):
|
|
48
|
+
* [#88](https://github.com/slack-ruby/slack-ruby-bot-server/issues/88): Fixed compatibility with Grape 1.2.x - [@dblock](https://github.com/dblock).
|
|
22
49
|
|
|
23
50
|
#### 0.8.2 (2018/10/11)
|
|
24
51
|
|
|
25
|
-
* [#80](https://github.com/slack-ruby/slack-ruby-bot-server/pull/80):
|
|
52
|
+
* [#80](https://github.com/slack-ruby/slack-ruby-bot-server/pull/80): Fixed closed stream when closing connection in ping worker - [@dblock](https://github.com/dblock).
|
|
26
53
|
|
|
27
54
|
#### 0.8.1 (2018/9/20)
|
|
28
55
|
|
|
29
|
-
* [#79](https://github.com/slack-ruby/slack-ruby-bot-server/pull/79):
|
|
56
|
+
* [#79](https://github.com/slack-ruby/slack-ruby-bot-server/pull/79): Fixed ping worker terminates on a failed restart - [@dblock](https://github.com/dblock).
|
|
30
57
|
|
|
31
58
|
#### 0.8.0 (2018/9/8)
|
|
32
59
|
|
|
33
|
-
* [#75](https://github.com/slack-ruby/slack-ruby-bot-server/pull/75):
|
|
34
|
-
* [#76](https://github.com/slack-ruby/slack-ruby-bot-server/pull/76):
|
|
60
|
+
* [#75](https://github.com/slack-ruby/slack-ruby-bot-server/pull/75): Defaulted to `async-websocket` instead of `celluloid-io` - [@dblock](https://github.com/dblock).
|
|
61
|
+
* [#76](https://github.com/slack-ruby/slack-ruby-bot-server/pull/76): Adjusted wait time on restart on Slack::Web::Api::Errors::TooManyRequestsError - [@dblock](https://github.com/dblock).
|
|
35
62
|
|
|
36
63
|
#### 0.7.0 (2018/8/22)
|
|
37
64
|
|
|
38
|
-
* [#60](https://github.com/slack-ruby/slack-ruby-bot-server/pull/60):
|
|
65
|
+
* [#60](https://github.com/slack-ruby/slack-ruby-bot-server/pull/60): Logged caught Standard::Error backtrace at debug-level - [@alexagranov](https://github.com/alexagranov).
|
|
39
66
|
* [#65](https://github.com/slack-ruby/slack-ruby-bot-server/pull/65): Updated Capybara and selenium-webdriver - [@dblock](https://github.com/dblock).
|
|
40
67
|
* [#67](https://github.com/slack-ruby/slack-ruby-bot-server/pull/67): Only load the OTR::ActiveRecord::ConnectionManagement middleware when the OTR module is included. This module isn't needed when using Rails - [@darbyfrey](https://github.com/darbyfrey).
|
|
41
68
|
* [#74](https://github.com/slack-ruby/slack-ruby-bot-server/pull/74): Added ping worker, will restart offline bots - [@dblock](https://github.com/dblock).
|
|
42
69
|
|
|
43
70
|
#### 0.6.1 (2017/3/29)
|
|
44
71
|
|
|
45
|
-
* [#54](https://github.com/slack-ruby/slack-ruby-bot-server/pull/54):
|
|
72
|
+
* [#54](https://github.com/slack-ruby/slack-ruby-bot-server/pull/54): Removed one more Mongoid dependency when rescuing from _invoke - [@alexagranov](https://github.com/alexagranov).
|
|
46
73
|
* [#53](https://github.com/slack-ruby/slack-ruby-bot-server/pull/53): No need for `otr-activerecord` if using activerecord under Rails - [@alexagranov](https://github.com/alexagranov).
|
|
47
74
|
|
|
48
75
|
#### 0.6.0 (2017/3/12)
|
|
@@ -53,17 +80,17 @@
|
|
|
53
80
|
|
|
54
81
|
#### 0.5.0 (2017/2/9)
|
|
55
82
|
|
|
56
|
-
* [#43](https://github.com/slack-ruby/slack-ruby-bot-server/pull/43):
|
|
57
|
-
* [#43](https://github.com/slack-ruby/slack-ruby-bot-server/pull/43):
|
|
58
|
-
* [#28](https://github.com/slack-ruby/slack-ruby-bot-server/pull/28):
|
|
59
|
-
* [#31](https://github.com/slack-ruby/slack-ruby-bot-server/pull/31):
|
|
83
|
+
* [#43](https://github.com/slack-ruby/slack-ruby-bot-server/pull/43): Fixed `cannot load kaminari/grape` - [@dblock](https://github.com/dblock).
|
|
84
|
+
* [#43](https://github.com/slack-ruby/slack-ruby-bot-server/pull/43): Fixed `undefined method '[]' for nil:NilClass` in APIs - [@dblock](https://github.com/dblock).
|
|
85
|
+
* [#28](https://github.com/slack-ruby/slack-ruby-bot-server/pull/28): Used `slack-ruby-danger` gem - [@dblock](https://github.com/dblock).
|
|
86
|
+
* [#31](https://github.com/slack-ruby/slack-ruby-bot-server/pull/31): Added `MONGODB_URI` as environment variable for MongoDB - [@corprew](https://github.com/corprew).
|
|
60
87
|
|
|
61
88
|
#### 0.4.0 (2016/8/29)
|
|
62
89
|
|
|
63
90
|
* [#25](https://github.com/slack-ruby/slack-ruby-bot-server/pull/25): Added [danger](http://danger.systems), PR linting - [@dblock](https://github.com/dblock).
|
|
64
91
|
* The `reset` and `resetting` callbacks have been removed - [@dblock](https://github.com/dblock).
|
|
65
92
|
* Callbacks receive `team` and `error`, but no longer `server` - [@dblock](https://github.com/dblock).
|
|
66
|
-
* [#23](https://github.com/slack-ruby/slack-ruby-bot-server/issues/23):
|
|
93
|
+
* [#23](https://github.com/slack-ruby/slack-ruby-bot-server/issues/23): Fixed server-side removal of bot doesn't deactivate it - [@dblock](https://github.com/dblock).
|
|
67
94
|
|
|
68
95
|
#### 0.3.1 (2016/7/10)
|
|
69
96
|
|
|
@@ -87,13 +114,13 @@
|
|
|
87
114
|
|
|
88
115
|
* Initial public release - [@dblock](https://github.com/dblock).
|
|
89
116
|
* Renamed slack-bot-server to slack-ruby-bot-server - [@dblock](https://github.com/dblock).
|
|
90
|
-
* [#11](https://github.com/slack-ruby/slack-ruby-bot-server/pull/11):
|
|
91
|
-
*
|
|
117
|
+
* [#11](https://github.com/slack-ruby/slack-ruby-bot-server/pull/11): Turned project into gem - [@tmsrjs](https://github.com/tmsrjs).
|
|
118
|
+
* Used `celluloid-io` instead of `faye-websocket`, upgrade to slack-ruby-bot 0.8.0 - [@dblock](https://github.com/dblock).
|
|
92
119
|
* Fixed `SlackRubyBotServer#reset` - [@dblock](https://github.com/dblock).
|
|
93
|
-
*
|
|
120
|
+
* Used Grape 0.15.x - [@dblock](https://github.com/dblock).
|
|
94
121
|
* Removed OOB GC - [@dblock](https://github.com/dblock).
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
122
|
+
* Used Unicorn instead of Puma - [@dblock](https://github.com/dblock).
|
|
123
|
+
* Fixed wait for EventMachine reactor to start - [@dblock](https://github.com/dblock).
|
|
124
|
+
* Used an OOB GC - [@dblock](https://github.com/dblock).
|
|
125
|
+
* Deferred start, much faster - [@dblock](https://github.com/dblock).
|
|
99
126
|
* Backported changes from slack-metabot and slack-shellbot - [@dblock](https://github.com/dblock).
|
data/Dangerfile
CHANGED
data/Gemfile
CHANGED
|
@@ -11,7 +11,7 @@ when 'activerecord' then
|
|
|
11
11
|
gem 'otr-activerecord', '~> 1.2.1'
|
|
12
12
|
gem 'cursor_pagination' # rubocop:disable Bundler/OrderedGems
|
|
13
13
|
gem 'pg'
|
|
14
|
-
when nil
|
|
14
|
+
when nil
|
|
15
15
|
warn "Missing ENV['DATABASE_ADAPTER']."
|
|
16
16
|
else
|
|
17
17
|
warn "Invalid ENV['DATABASE_ADAPTER']: #{ENV['DATABASE_ADAPTER']}."
|
|
@@ -31,12 +31,13 @@ group :development, :test do
|
|
|
31
31
|
gem 'rack-test'
|
|
32
32
|
gem 'rake'
|
|
33
33
|
gem 'rspec'
|
|
34
|
-
gem 'rubocop', '0.
|
|
34
|
+
gem 'rubocop', '0.81.0'
|
|
35
35
|
gem 'selenium-webdriver', '~> 3.4.4'
|
|
36
36
|
gem 'vcr'
|
|
37
37
|
gem 'webmock'
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
group :test do
|
|
41
|
+
gem 'danger-toc', '~> 0.2.0', require: false
|
|
41
42
|
gem 'slack-ruby-danger', '~> 0.1.0', require: false
|
|
42
43
|
end
|
data/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2015-
|
|
3
|
+
Copyright (c) 2015-2020 Daniel Doubrovkine & Contributors
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
|
@@ -11,13 +11,36 @@ If you are not familiar with Slack bots or Slack API concepts, you might want to
|
|
|
11
11
|
|
|
12
12
|
A good [open-source demo](https://github.com/dblock/slack-strava) of a service built on top of this library is [Strava integration with Slack](https://slava.playplay.io).
|
|
13
13
|
|
|
14
|
+
# Table of Contents
|
|
15
|
+
|
|
16
|
+
- [What is this?](#what-is-this)
|
|
17
|
+
- [Stable Release](#stable-release)
|
|
18
|
+
- [Try Me](#try-me)
|
|
19
|
+
- [Run Your Own](#run-your-own)
|
|
20
|
+
- [MongoDB](#mongodb)
|
|
21
|
+
- [ActiveRecord](#activerecord)
|
|
22
|
+
- [Usage](#usage)
|
|
23
|
+
- [OAuth Code Grant](#oauth-code-grant)
|
|
24
|
+
- [API](#api)
|
|
25
|
+
- [App](#app)
|
|
26
|
+
- [Service Manager](#service-manager)
|
|
27
|
+
- [Lifecycle Callbacks](#lifecycle-callbacks)
|
|
28
|
+
- [Service Timers](#service-timers)
|
|
29
|
+
- [Extensions](#extensions)
|
|
30
|
+
- [Server Class](#server-class)
|
|
31
|
+
- [Service Class](#service-class)
|
|
32
|
+
- [HTML Templates](#html-templates)
|
|
33
|
+
- [Access Tokens](#access-tokens)
|
|
34
|
+
- [Example Bots Using Slack Ruby Bot Server](#example-bots-using-slack-ruby-bot-server)
|
|
35
|
+
- [Copyright & License](#copyright--license)
|
|
36
|
+
|
|
14
37
|
### What is this?
|
|
15
38
|
|
|
16
39
|
A library that contains a [Grape](http://github.com/ruby-grape/grape) API serving a [Slack Ruby Bot](https://github.com/slack-ruby/slack-ruby-bot) to multiple teams. This gem combines a web server, a RESTful API and multiple instances of [slack-ruby-bot](https://github.com/slack-ruby/slack-ruby-bot). It integrates with the [Slack Platform API](https://medium.com/slack-developer-blog/launch-platform-114754258b91#.od3y71dyo). Your customers can use a Slack button to install the bot.
|
|
17
40
|
|
|
18
41
|
### Stable Release
|
|
19
42
|
|
|
20
|
-
You're reading the documentation for the **stable** release of slack-ruby-bot-server,
|
|
43
|
+
You're reading the documentation for the **stable** release of slack-ruby-bot-server, 0.12.3. See [UPGRADING](UPGRADING.md) when upgrading from an older version.
|
|
21
44
|
|
|
22
45
|
### Try Me
|
|
23
46
|
|
|
@@ -62,19 +85,48 @@ See the [sample app using ActiveRecord](sample_apps/sample_app_activerecord) for
|
|
|
62
85
|
|
|
63
86
|
### Usage
|
|
64
87
|
|
|
65
|
-
Start with one of the samples above, which contain a couple of custom commands, necessary dependencies and tests, then [create a new
|
|
88
|
+
Start with one of the samples above, which contain a couple of custom commands, necessary dependencies and tests, then [create a new Slack App](https://api.slack.com/applications/new).
|
|
66
89
|
|
|
67
|
-

|
|
68
91
|
|
|
69
|
-
Follow Slack's instructions, note the app client ID and secret, give the bot a default name, etc. The redirect URL should be the location of your app
|
|
92
|
+
Follow Slack's instructions, note the app client ID and secret, give the bot a default name, etc. The redirect URL should be the location of your app. For local testing purposes use a public tunneling service such as [ngrok](https://ngrok.com/) to expose local port 9292.
|
|
70
93
|
|
|
71
94
|
Within your application, edit your `.env` file and add `SLACK_CLIENT_ID=...` and `SLACK_CLIENT_SECRET=...` in it.
|
|
72
95
|
|
|
73
96
|
Run `bundle install` and `foreman start` to boot the app. Navigate to [localhost:9292](http://localhost:9292). You should see an "Add to Slack" button. Use it to install the app into your own Slack team.
|
|
74
97
|
|
|
98
|
+
### OAuth Code Grant
|
|
99
|
+
|
|
100
|
+
The "Add to Slack" button uses the standard OAuth code grant flow as described in the [Slack docs](https://api.slack.com/docs/oauth#flow).
|
|
101
|
+
|
|
102
|
+
The button itself contains a link that looks like this:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
https://slack.com/oauth/authorize?scope=bot&client_id=<%= ENV['SLACK_CLIENT_ID'] %>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Once clicked, the user is taken through the authorization process at Slack's site. Upon successful completion, a callback containing a temporary code is sent to the redirect URL you specified. The endpoint at that URL contains code that looks like this:
|
|
109
|
+
|
|
110
|
+
```ruby
|
|
111
|
+
# Instantiate a web client
|
|
112
|
+
client = Slack::Web::Client.new
|
|
113
|
+
|
|
114
|
+
# Request a token using the temporary code
|
|
115
|
+
rc = client.oauth_access(
|
|
116
|
+
client_id: ENV['SLACK_CLIENT_ID'],
|
|
117
|
+
client_secret: ENV['SLACK_CLIENT_SECRET'],
|
|
118
|
+
code: params[:code]
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Pluck the token from the response
|
|
122
|
+
token = rc['bot']['bot_access_token']
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The token is stored in persistent storage and used each time a Slack client is instantiated for the specific team.
|
|
126
|
+
|
|
75
127
|
### API
|
|
76
128
|
|
|
77
|
-
This library implements an app, [SlackRubyBotServer::App](lib/slack-ruby-bot-server/app.rb), a service manager, [SlackRubyBotServer::Service](lib/slack-ruby-bot-server/service.rb) that creates multiple instances of a bot server class, [SlackRubyBotServer::Server](lib/slack-ruby-bot-server/server.rb), one per team.
|
|
129
|
+
This library implements an app, [SlackRubyBotServer::App](lib/slack-ruby-bot-server/app.rb), a service manager, [SlackRubyBotServer::Service](lib/slack-ruby-bot-server/service.rb) that creates multiple instances of a bot server class, [SlackRubyBotServer::Server](lib/slack-ruby-bot-server/server.rb), one per team. It also provides [default HTML templates and JS scripts](public) for Slack integration.
|
|
78
130
|
|
|
79
131
|
#### App
|
|
80
132
|
|
|
@@ -104,11 +156,17 @@ MyApp.instance.prepare!
|
|
|
104
156
|
|
|
105
157
|
#### Service Manager
|
|
106
158
|
|
|
159
|
+
##### Lifecycle Callbacks
|
|
160
|
+
|
|
107
161
|
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.
|
|
108
162
|
|
|
109
163
|
```ruby
|
|
110
164
|
instance = SlackRubyBotServer::Service.instance
|
|
111
165
|
|
|
166
|
+
instance.on :started, :stopped do |team|
|
|
167
|
+
# team has been started or stopped
|
|
168
|
+
end
|
|
169
|
+
|
|
112
170
|
instance.on :created do |team, error, options|
|
|
113
171
|
# a new team has been registered
|
|
114
172
|
end
|
|
@@ -138,7 +196,6 @@ The following callbacks are supported. All callbacks receive a `team`, except `e
|
|
|
138
196
|
| deactivating | a team is being deactivated |
|
|
139
197
|
| deactivated | a team has been deactivated |
|
|
140
198
|
|
|
141
|
-
|
|
142
199
|
The [Add to Slack button](https://api.slack.com/docs/slack-button) also allows for an optional `state` parameter that will be returned on completion of the request. The `creating` and `created` callbacks include an options hash where this value can be accessed (to check for forgery attacks for instance).
|
|
143
200
|
```ruby
|
|
144
201
|
auth = OpenSSL::HMAC.hexdigest("SHA256", "key", "data")
|
|
@@ -153,9 +210,44 @@ instance.on :creating do |team, error, options|
|
|
|
153
210
|
end
|
|
154
211
|
```
|
|
155
212
|
|
|
156
|
-
|
|
213
|
+
##### Service Timers
|
|
214
|
+
|
|
215
|
+
You can introduce custom behavior into the service lifecycle on a timer. For example, check whether a team's trial has expired, or periodically cleanup data.
|
|
216
|
+
|
|
217
|
+
Note that unlike callbacks, timers are global for the entire service.
|
|
218
|
+
|
|
219
|
+
```ruby
|
|
220
|
+
instance = SlackRubyBotServer::Service.instance
|
|
221
|
+
|
|
222
|
+
instance.every :hour do
|
|
223
|
+
Team.each do |team|
|
|
224
|
+
begin
|
|
225
|
+
# do something with every team once an hour
|
|
226
|
+
rescue StandardError
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
instance.every :minute do
|
|
232
|
+
# called every minute
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
instance.every :second do
|
|
236
|
+
# called every second
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
instance.every 30 do
|
|
240
|
+
# called every 30 seconds
|
|
241
|
+
end
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
##### Extensions
|
|
245
|
+
|
|
246
|
+
A number of extensions use service manager callbacks and service timers to implement useful functionality.
|
|
157
247
|
|
|
248
|
+
* [slack-ruby-bot-server-events](https://github.com/slack-ruby/slack-ruby-bot-server-events): Easily handle Slack slash commands, interactive buttons and events.
|
|
158
249
|
* [slack-ruby-bot-server-mailchimp](https://github.com/slack-ruby/slack-ruby-bot-server-mailchimp): Subscribes new bot users to a Mailchimp mailing list.
|
|
250
|
+
* [slack-ruby-bot-server-stripe](https://github.com/slack-ruby/slack-ruby-bot-server-stripe): Enables paid bots with trial periods and commerce through Stripe.
|
|
159
251
|
|
|
160
252
|
#### Server Class
|
|
161
253
|
|
|
@@ -196,6 +288,18 @@ SlackRubyBotServer::Service.instance # MyService
|
|
|
196
288
|
SlackRubyBotServer::Service.instance.url # https://www.example.com
|
|
197
289
|
```
|
|
198
290
|
|
|
291
|
+
### HTML Templates
|
|
292
|
+
|
|
293
|
+
This library provides a [default HTML template and JS scripts](public) that implement the "Add to Slack" button workflow. Customize your pages by adding a `public` directory in your application and starting with a [index.html.erb](public/index.html.erb) template. The application's `views` and `public` folders are [loaded by default](lib/slack-ruby-bot-server/api/middleware.rb#L32).
|
|
294
|
+
|
|
295
|
+
You can add to or override template paths as follows.
|
|
296
|
+
|
|
297
|
+
```ruby
|
|
298
|
+
SlackRubyBotServer.configure do |config|
|
|
299
|
+
config.view_paths << File.expand_path(File.join(__dir__, 'public'))
|
|
300
|
+
end
|
|
301
|
+
```
|
|
302
|
+
|
|
199
303
|
### Access Tokens
|
|
200
304
|
|
|
201
305
|
By default the implementation of [Team](lib/slack-ruby-bot-server/models/team) stores a `bot_access_token` as `token` that grants a certain amount of privileges to the bot user as described in [Slack OAuth Docs](https://api.slack.com/docs/oauth) along with `activated_user_access_token` that represents the token of the installing user. 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 change required scopes make the following changes.
|
|
@@ -206,18 +310,20 @@ By default the implementation of [Team](lib/slack-ruby-bot-server/models/team) s
|
|
|
206
310
|
|
|
207
311
|
You can see a sample implementation in [slack-sup#3a497b](https://github.com/dblock/slack-sup/commit/3a497b436d25d3a7738562655cda64b180ae0096).
|
|
208
312
|
|
|
209
|
-
###
|
|
313
|
+
### Example Bots Using Slack Ruby Bot Server
|
|
210
314
|
|
|
211
|
-
* [slack-
|
|
212
|
-
* [slack-
|
|
213
|
-
* [slack-
|
|
214
|
-
* [slack-
|
|
215
|
-
* [slack-
|
|
216
|
-
* [slack-
|
|
217
|
-
* [slack-
|
|
315
|
+
* [slack-ruby-bot-server-sample](https://github.com/slack-ruby/slack-ruby-bot-server-sample), a generic sample
|
|
316
|
+
* [slack-sup](https://github.com/dblock/slack-sup), see [sup.playplay.io](https://sup.playplay.io)
|
|
317
|
+
* [slack-gamebot](https://github.com/dblock/slack-gamebot), see [www.playplay.io](https://www.playplay.io)
|
|
318
|
+
* [slack-market](https://github.com/dblock/slack-market), see [market.playplay.io](https://market.playplay.io)
|
|
319
|
+
* [slack-shellbot](https://github.com/slack-ruby/slack-shellbot), see [shell.playplay.io](https://shell.playplay.io)
|
|
320
|
+
* [slack-api-explorer](https://github.com/slack-ruby/slack-api-explorer), see [api-explorer.playplay.io](https://shell.playplay.io)
|
|
321
|
+
* [slack-strava](https://github.com/dblock/slack-strava), see [slava.playplay.io](https://slava.playplay.io)
|
|
322
|
+
* [slack-arena](https://github.com/dblock/slack-arena), see [arena.playplay.io](https://arena.playplay.io)
|
|
323
|
+
* [slack-rails-bot-starter](https://github.com/CrazyOptimist/slack-rails-bot-starter), an all-in-one rails starter kit built on top of the slack-ruby-bot-server and the slack-ruby-bot-server-events
|
|
218
324
|
|
|
219
325
|
### Copyright & License
|
|
220
326
|
|
|
221
|
-
Copyright [Daniel Doubrovkine](http://code.dblock.org) and Contributors, 2015-
|
|
327
|
+
Copyright [Daniel Doubrovkine](http://code.dblock.org) and Contributors, 2015-2020
|
|
222
328
|
|
|
223
329
|
[MIT License](LICENSE)
|
|
Binary file
|
|
@@ -2,15 +2,13 @@ require 'async/websocket'
|
|
|
2
2
|
|
|
3
3
|
require 'grape-swagger'
|
|
4
4
|
require 'slack-ruby-bot'
|
|
5
|
-
require 'slack-ruby-bot-server/service'
|
|
6
|
-
require 'slack-ruby-bot-server/server'
|
|
7
|
-
require 'slack-ruby-bot-server/config'
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
require_relative 'slack-ruby-bot-server/service'
|
|
7
|
+
require_relative 'slack-ruby-bot-server/server'
|
|
8
|
+
require_relative 'slack-ruby-bot-server/config'
|
|
9
|
+
require_relative 'slack-ruby-bot-server/ext'
|
|
10
|
+
require_relative 'slack-ruby-bot-server/version'
|
|
11
|
+
require_relative 'slack-ruby-bot-server/info'
|
|
12
|
+
require_relative "slack-ruby-bot-server/config/database_adapters/#{SlackRubyBotServer::Config.database_adapter}.rb"
|
|
13
|
+
require_relative 'slack-ruby-bot-server/api'
|
|
14
|
+
require_relative 'slack-ruby-bot-server/app'
|
|
@@ -3,7 +3,7 @@ require 'roar'
|
|
|
3
3
|
require 'grape-roar'
|
|
4
4
|
|
|
5
5
|
require_relative 'ext/grape/sort_extension'
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
require_relative 'api/helpers'
|
|
7
|
+
require_relative 'api/presenters'
|
|
8
|
+
require_relative 'api/endpoints'
|
|
9
|
+
require_relative 'api/middleware'
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
require_relative 'endpoints/teams_endpoint'
|
|
2
|
+
require_relative 'endpoints/status_endpoint'
|
|
3
|
+
require_relative 'endpoints/root_endpoint'
|
|
@@ -54,12 +54,16 @@ module SlackRubyBotServer
|
|
|
54
54
|
team ||= Team.where(team_id: rc['team_id']).first
|
|
55
55
|
|
|
56
56
|
if team
|
|
57
|
+
team.ping_if_active!
|
|
58
|
+
|
|
57
59
|
team.update_attributes!(
|
|
58
60
|
activated_user_id: user_id,
|
|
59
61
|
activated_user_access_token: access_token,
|
|
60
62
|
bot_user_id: bot_user_id
|
|
61
63
|
)
|
|
64
|
+
|
|
62
65
|
raise "Team #{team.name} is already registered." if team.active?
|
|
66
|
+
|
|
63
67
|
team.activate!(token)
|
|
64
68
|
else
|
|
65
69
|
team = Team.create!(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
require_relative 'helpers/cursor_helpers'
|
|
2
|
+
require_relative 'helpers/pagination_parameters'
|
|
3
|
+
require_relative 'helpers/sort_helpers'
|
|
4
|
+
require_relative 'helpers/error_helpers'
|
|
@@ -11,6 +11,7 @@ module SlackRubyBotServer
|
|
|
11
11
|
if SlackRubyBotServer::Config.mongoid?
|
|
12
12
|
def paginate_by_cursor(coll, _options)
|
|
13
13
|
raise 'Both cursor and offset parameters are present, these are mutually exclusive.' if params.key?(:offset) && params.key?(:cursor)
|
|
14
|
+
|
|
14
15
|
results = { results: [], next: nil }
|
|
15
16
|
coll = coll.skip(params[:offset].to_i) if params.key?(:offset)
|
|
16
17
|
size = (params[:size] || 10).to_i
|
|
@@ -26,6 +27,7 @@ module SlackRubyBotServer
|
|
|
26
27
|
elsif SlackRubyBotServer::Config.activerecord?
|
|
27
28
|
def paginate_by_cursor(coll, options)
|
|
28
29
|
raise 'Both cursor and offset parameters are present, these are mutually exclusive.' if params.key?(:offset) && params.key?(:cursor)
|
|
30
|
+
|
|
29
31
|
results = { results: [], next: nil }
|
|
30
32
|
size = (params[:size] || 10).to_i
|
|
31
33
|
results[:total_count] = coll.count(:all) if params[:total_count]
|
|
@@ -7,6 +7,7 @@ module SlackRubyBotServer
|
|
|
7
7
|
def sort_order(options = {})
|
|
8
8
|
params[:sort] = options[:default_sort_order] unless params[:sort]
|
|
9
9
|
return [] unless params[:sort]
|
|
10
|
+
|
|
10
11
|
sort_order = params[:sort].to_s
|
|
11
12
|
unless options[:default_sort_order] == sort_order
|
|
12
13
|
supported_sort_orders = route_sort
|
|
@@ -30,11 +30,7 @@ module SlackRubyBotServer
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
use Rack::ServerPages do |config|
|
|
33
|
-
config.view_path =
|
|
34
|
-
'views', # relative to Dir.pwd
|
|
35
|
-
'public', # relative to Dir.pwd
|
|
36
|
-
File.expand_path(File.join(__dir__, '../../../public')) # built-in fallback
|
|
37
|
-
]
|
|
33
|
+
config.view_path = SlackRubyBotServer::Config.view_paths
|
|
38
34
|
end
|
|
39
35
|
|
|
40
36
|
run Middleware.new
|
|
@@ -2,8 +2,8 @@ require 'roar/representer'
|
|
|
2
2
|
require 'roar/json'
|
|
3
3
|
require 'roar/json/hal'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
require_relative 'presenters/paginated_presenter'
|
|
6
|
+
require_relative 'presenters/status_presenter'
|
|
7
|
+
require_relative 'presenters/team_presenter'
|
|
8
|
+
require_relative 'presenters/teams_presenter'
|
|
9
|
+
require_relative 'presenters/root_presenter'
|
|
@@ -5,10 +5,18 @@ module SlackRubyBotServer
|
|
|
5
5
|
attr_accessor :server_class
|
|
6
6
|
attr_accessor :service_class
|
|
7
7
|
attr_accessor :database_adapter
|
|
8
|
+
attr_accessor :view_paths
|
|
8
9
|
|
|
9
10
|
def reset!
|
|
10
11
|
self.server_class = SlackRubyBotServer::Server
|
|
11
12
|
self.service_class = SlackRubyBotServer::Service
|
|
13
|
+
|
|
14
|
+
self.view_paths = [
|
|
15
|
+
'views',
|
|
16
|
+
'public',
|
|
17
|
+
File.expand_path(File.join(__dir__, '../../public'))
|
|
18
|
+
]
|
|
19
|
+
|
|
12
20
|
self.database_adapter = if defined?(::Mongoid)
|
|
13
21
|
:mongoid
|
|
14
22
|
elsif defined?(::ActiveRecord)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative '../../models/team/activerecord.rb'
|
|
2
2
|
|
|
3
3
|
module SlackRubyBotServer
|
|
4
4
|
module DatabaseAdapter
|
|
@@ -28,4 +28,4 @@ module SlackRubyBotServer
|
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
::Boolean =
|
|
31
|
+
::Boolean = Grape::API::Boolean
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative '../../models/team/mongoid.rb'
|
|
2
|
+
|
|
2
3
|
require 'kaminari/grape'
|
|
3
4
|
require 'mongoid-scroll'
|
|
4
5
|
|
|
@@ -6,7 +7,8 @@ module SlackRubyBotServer
|
|
|
6
7
|
module DatabaseAdapter
|
|
7
8
|
def self.check!
|
|
8
9
|
rc = Mongoid.default_client.command(ping: 1)
|
|
9
|
-
return if rc
|
|
10
|
+
return if rc&.ok?
|
|
11
|
+
|
|
10
12
|
raise rc.documents.first['error'] || 'Unexpected error.'
|
|
11
13
|
rescue StandardError => e
|
|
12
14
|
warn "Error connecting to MongoDB: #{e.message}"
|
|
@@ -9,7 +9,7 @@ module SlackRubyBot
|
|
|
9
9
|
rescue StandardError => e
|
|
10
10
|
logger.info "#{name.demodulize.upcase}: #{client.owner}, #{e.class}: #{e}"
|
|
11
11
|
logger.debug e.backtrace.join("\n")
|
|
12
|
-
client.say(channel: data.channel, text: e.message
|
|
12
|
+
client.say(channel: data.channel, text: e.message)
|
|
13
13
|
true
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -8,12 +8,12 @@ module SlackRubyBot
|
|
|
8
8
|
_invoke client, data
|
|
9
9
|
rescue Mongoid::Errors::Validations => e
|
|
10
10
|
logger.info "#{name.demodulize.upcase}: #{client.owner}, error - #{e.document.class}, #{e.document.errors.to_hash}"
|
|
11
|
-
client.say(channel: data.channel, text: e.document.errors.first[1]
|
|
11
|
+
client.say(channel: data.channel, text: e.document.errors.first[1])
|
|
12
12
|
true
|
|
13
13
|
rescue StandardError => e
|
|
14
14
|
logger.info "#{name.demodulize.upcase}: #{client.owner}, #{e.class}: #{e}"
|
|
15
15
|
logger.debug e.backtrace.join("\n")
|
|
16
|
-
client.say(channel: data.channel, text: e.message
|
|
16
|
+
client.say(channel: data.channel, text: e.message)
|
|
17
17
|
true
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -3,11 +3,14 @@ require_relative 'methods'
|
|
|
3
3
|
class Team < ActiveRecord::Base
|
|
4
4
|
include Methods
|
|
5
5
|
|
|
6
|
-
def self.purge!
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
def self.purge!(dt = 2.weeks.ago)
|
|
7
|
+
Team.where(active: false).where('updated_at <= ?', dt).each do |team|
|
|
8
|
+
begin
|
|
9
|
+
logger.info "Destroying #{team}, inactive since #{team.updated_at}."
|
|
10
|
+
team.destroy
|
|
11
|
+
rescue StandardError => e
|
|
12
|
+
logger.warn "Error destroying #{team}, #{e.message}."
|
|
13
|
+
end
|
|
11
14
|
end
|
|
12
15
|
end
|
|
13
16
|
end
|
|
@@ -38,5 +38,17 @@ module Methods
|
|
|
38
38
|
presence: client.users_getPresence(user: auth['user_id'])
|
|
39
39
|
}
|
|
40
40
|
end
|
|
41
|
+
|
|
42
|
+
def ping_if_active!
|
|
43
|
+
return unless active?
|
|
44
|
+
|
|
45
|
+
ping!
|
|
46
|
+
rescue Slack::Web::Api::Errors::SlackError => e
|
|
47
|
+
logger.warn "Active team #{self} ping, #{e.message}."
|
|
48
|
+
case e.message
|
|
49
|
+
when 'account_inactive', 'invalid_auth'
|
|
50
|
+
deactivate!
|
|
51
|
+
end
|
|
52
|
+
end
|
|
41
53
|
end
|
|
42
54
|
end
|
|
@@ -15,11 +15,15 @@ class Team
|
|
|
15
15
|
|
|
16
16
|
include Methods
|
|
17
17
|
|
|
18
|
-
def self.purge!
|
|
18
|
+
def self.purge!(dt = 2.weeks.ago)
|
|
19
19
|
# destroy teams inactive for two weeks
|
|
20
|
-
Team.where(active: false, :updated_at.lte =>
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
Team.where(active: false, :updated_at.lte => dt).each do |team|
|
|
21
|
+
begin
|
|
22
|
+
logger.info "Destroying #{team}, inactive since #{team.updated_at}."
|
|
23
|
+
team.destroy
|
|
24
|
+
rescue StandardError => e
|
|
25
|
+
logger.warn "Error destroying #{team}, #{e.message}."
|
|
26
|
+
end
|
|
23
27
|
end
|
|
24
28
|
end
|
|
25
29
|
end
|
|
@@ -15,10 +15,29 @@ module SlackRubyBotServer
|
|
|
15
15
|
|
|
16
16
|
def initialize
|
|
17
17
|
@callbacks = Hash.new { |h, k| h[k] = [] }
|
|
18
|
+
@intervals = Hash.new { |h, k| h[k] = [] }
|
|
18
19
|
end
|
|
19
20
|
|
|
20
|
-
def on(
|
|
21
|
-
|
|
21
|
+
def on(*types, &block)
|
|
22
|
+
Array(types).each do |type|
|
|
23
|
+
@callbacks[type.to_s] << block
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def every(*intervals, &block)
|
|
28
|
+
Array(intervals).each do |interval|
|
|
29
|
+
case interval
|
|
30
|
+
when :minute
|
|
31
|
+
interval = 60
|
|
32
|
+
when :hour
|
|
33
|
+
interval = 60 * 60
|
|
34
|
+
when :day
|
|
35
|
+
interval = 60 * 60 * 24
|
|
36
|
+
end
|
|
37
|
+
raise "Invalid interval \"#{interval}\"." unless interval.is_a?(Integer) && interval > 0
|
|
38
|
+
|
|
39
|
+
@intervals[interval] << block
|
|
40
|
+
end
|
|
22
41
|
end
|
|
23
42
|
|
|
24
43
|
def create!(team, options = {})
|
|
@@ -49,7 +68,7 @@ module SlackRubyBotServer
|
|
|
49
68
|
def stop!(team)
|
|
50
69
|
logger.info "Stopping team #{team}."
|
|
51
70
|
run_callbacks :stopping, team
|
|
52
|
-
team.server
|
|
71
|
+
team.server&.stop!
|
|
53
72
|
run_callbacks :stopped, team
|
|
54
73
|
rescue StandardError => e
|
|
55
74
|
run_callbacks :error, team, e
|
|
@@ -64,6 +83,15 @@ module SlackRubyBotServer
|
|
|
64
83
|
start!(team)
|
|
65
84
|
run_callbacks :booted, team
|
|
66
85
|
end
|
|
86
|
+
start_intervals!
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def start_intervals!
|
|
90
|
+
@intervals.each_pair do |period, calls|
|
|
91
|
+
_every period do
|
|
92
|
+
calls.each(&:call)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
67
95
|
end
|
|
68
96
|
|
|
69
97
|
def deactivate!(team)
|
|
@@ -86,6 +114,19 @@ module SlackRubyBotServer
|
|
|
86
114
|
|
|
87
115
|
private
|
|
88
116
|
|
|
117
|
+
def _every(tt, &_block)
|
|
118
|
+
::Async::Reactor.run do |task|
|
|
119
|
+
loop do
|
|
120
|
+
begin
|
|
121
|
+
task.sleep tt
|
|
122
|
+
yield
|
|
123
|
+
rescue StandardError => e
|
|
124
|
+
logger.error e
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
89
130
|
def start_server!(team, server, wait = 1)
|
|
90
131
|
team.server = server
|
|
91
132
|
server.start_async
|
|
@@ -106,6 +147,7 @@ module SlackRubyBotServer
|
|
|
106
147
|
def run_callbacks(type, team = nil, error = nil, options = {})
|
|
107
148
|
callbacks = @callbacks[type.to_s]
|
|
108
149
|
return false unless callbacks
|
|
150
|
+
|
|
109
151
|
callbacks.each do |c|
|
|
110
152
|
c.call team, error, options
|
|
111
153
|
end
|
data/public/index.html.erb
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
<title>Slack Ruby Bot Server</title>
|
|
4
4
|
<script src="/scripts/jquery-1.7.1.min.js"></script>
|
|
5
5
|
<script src="/scripts/url.min.js"></script>
|
|
6
|
+
<script src="/scripts/messages.js"></script>
|
|
6
7
|
<script src="/scripts/register.js"></script>
|
|
7
8
|
<script src="/scripts/stats.js"></script>
|
|
8
9
|
</head>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
var SlackRubyBotServer = {};
|
|
2
|
+
|
|
3
|
+
$(document).ready(function() {
|
|
4
|
+
|
|
5
|
+
SlackRubyBotServer.message = function(text) {
|
|
6
|
+
$('#messages').fadeOut('slow', function() {
|
|
7
|
+
$('#messages').fadeIn('slow').html(text)
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
SlackRubyBotServer.error = function(xhr) {
|
|
12
|
+
try {
|
|
13
|
+
var message;
|
|
14
|
+
if (xhr.responseText) {
|
|
15
|
+
var rc = JSON.parse(xhr.responseText);
|
|
16
|
+
if (rc && rc.message) {
|
|
17
|
+
message = rc.message;
|
|
18
|
+
if (message == 'invalid_code') {
|
|
19
|
+
message = 'The code returned from the OAuth workflow was invalid.'
|
|
20
|
+
} else if (message == 'code_already_used') {
|
|
21
|
+
message = 'The code returned from the OAuth workflow has already been used.'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
SlackRubyBotServer.message(message || xhr.statusText || xhr.responseText || 'Unexpected Error');
|
|
27
|
+
|
|
28
|
+
} catch(err) {
|
|
29
|
+
SlackRubyBotServer.message(err.message);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
});
|
data/public/scripts/register.js
CHANGED
|
@@ -1,35 +1,4 @@
|
|
|
1
|
-
var SlackRubyBotServer = {};
|
|
2
|
-
|
|
3
1
|
$(document).ready(function() {
|
|
4
|
-
|
|
5
|
-
SlackRubyBotServer.message = function(text) {
|
|
6
|
-
$('#messages').fadeOut('slow', function() {
|
|
7
|
-
$('#messages').fadeIn('slow').html(text)
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
SlackRubyBotServer.error = function(xhr) {
|
|
12
|
-
try {
|
|
13
|
-
var message;
|
|
14
|
-
if (xhr.responseText) {
|
|
15
|
-
var rc = JSON.parse(xhr.responseText);
|
|
16
|
-
if (rc && rc.message) {
|
|
17
|
-
message = rc.message;
|
|
18
|
-
if (message == 'invalid_code') {
|
|
19
|
-
message = 'The code returned from the OAuth workflow was invalid.'
|
|
20
|
-
} else if (message == 'code_already_used') {
|
|
21
|
-
message = 'The code returned from the OAuth workflow has already been used.'
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
SlackRubyBotServer.message(message || xhr.statusText || xhr.responseText || 'Unexpected Error');
|
|
27
|
-
|
|
28
|
-
} catch(err) {
|
|
29
|
-
SlackRubyBotServer.message(err.message);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
2
|
// Slack OAuth
|
|
34
3
|
var code = $.url('?code')
|
|
35
4
|
var state = $.url('?state')
|
|
@@ -13,7 +13,7 @@ whoami - print your username
|
|
|
13
13
|
EOS
|
|
14
14
|
def self.call(client, data, _match)
|
|
15
15
|
client.say(channel: data.channel, text: [HELP, SlackRubyBotServer::INFO].join("\n"))
|
|
16
|
-
client.say(channel: data.channel
|
|
16
|
+
client.say(channel: data.channel)
|
|
17
17
|
logger.info "HELP: #{client.owner}, user=#{data.user}"
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -8,7 +8,7 @@ describe Help do
|
|
|
8
8
|
let(:message_hook) { SlackRubyBot::Hooks::Message.new }
|
|
9
9
|
it 'default' do
|
|
10
10
|
expect(client).to receive(:say).with(channel: 'channel', text: [Help::HELP, SlackRubyBotServer::INFO].join("\n"))
|
|
11
|
-
expect(client).to receive(:say).with(channel: 'channel'
|
|
11
|
+
expect(client).to receive(:say).with(channel: 'channel')
|
|
12
12
|
message_hook.call(client, Hashie::Mash.new(channel: 'channel', text: "#{SlackRubyBot.config.user} help"))
|
|
13
13
|
end
|
|
14
14
|
end
|
|
@@ -13,7 +13,7 @@ whoami - print your username
|
|
|
13
13
|
EOS
|
|
14
14
|
def self.call(client, data, _match)
|
|
15
15
|
client.say(channel: data.channel, text: [HELP, SlackRubyBotServer::INFO].join("\n"))
|
|
16
|
-
client.say(channel: data.channel
|
|
16
|
+
client.say(channel: data.channel)
|
|
17
17
|
logger.info "HELP: #{client.owner}, user=#{data.user}"
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -8,7 +8,7 @@ describe Help do
|
|
|
8
8
|
let(:message_hook) { SlackRubyBot::Hooks::Message.new }
|
|
9
9
|
it 'default' do
|
|
10
10
|
expect(client).to receive(:say).with(channel: 'channel', text: [Help::HELP, SlackRubyBotServer::INFO].join("\n"))
|
|
11
|
-
expect(client).to receive(:say).with(channel: 'channel'
|
|
11
|
+
expect(client).to receive(:say).with(channel: 'channel')
|
|
12
12
|
message_hook.call(client, Hashie::Mash.new(channel: 'channel', text: "#{SlackRubyBot.config.user} help"))
|
|
13
13
|
end
|
|
14
14
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
lib = File.expand_path('lib', __dir__)
|
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
3
|
-
|
|
3
|
+
require_relative 'lib/slack-ruby-bot-server/version'
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = 'slack-ruby-bot-server'
|
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
|
14
14
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
|
|
15
15
|
spec.require_paths = ['lib']
|
|
16
16
|
|
|
17
|
-
spec.add_dependency 'async-websocket'
|
|
17
|
+
spec.add_dependency 'async-websocket', '~> 0.8.0'
|
|
18
18
|
spec.add_dependency 'foreman'
|
|
19
19
|
spec.add_dependency 'grape'
|
|
20
20
|
spec.add_dependency 'grape-roar', '>= 0.4.0'
|
metadata
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: slack-ruby-bot-server
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Doubrovkine
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-11-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: async-websocket
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 0.8.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 0.8.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: foreman
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -150,13 +150,14 @@ dependencies:
|
|
|
150
150
|
- - ">="
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
152
|
version: 0.12.0
|
|
153
|
-
description:
|
|
153
|
+
description:
|
|
154
154
|
email:
|
|
155
155
|
- dblock@dblock.org
|
|
156
156
|
executables: []
|
|
157
157
|
extensions: []
|
|
158
158
|
extra_rdoc_files: []
|
|
159
159
|
files:
|
|
160
|
+
- ".github/FUNDING.yml"
|
|
160
161
|
- ".gitignore"
|
|
161
162
|
- ".rspec"
|
|
162
163
|
- ".rubocop.yml"
|
|
@@ -173,7 +174,7 @@ files:
|
|
|
173
174
|
- RELEASING.md
|
|
174
175
|
- Rakefile
|
|
175
176
|
- UPGRADING.md
|
|
176
|
-
- images/
|
|
177
|
+
- images/create-app.png
|
|
177
178
|
- images/slackbotserver.gif
|
|
178
179
|
- images/slackbutton.gif
|
|
179
180
|
- lib/slack-ruby-bot-server.rb
|
|
@@ -219,6 +220,7 @@ files:
|
|
|
219
220
|
- public/index.html.erb
|
|
220
221
|
- public/robots.txt
|
|
221
222
|
- public/scripts/jquery-1.7.1.min.js
|
|
223
|
+
- public/scripts/messages.js
|
|
222
224
|
- public/scripts/register.js
|
|
223
225
|
- public/scripts/stats.js
|
|
224
226
|
- public/scripts/url.min.js
|
|
@@ -263,7 +265,7 @@ files:
|
|
|
263
265
|
homepage: https://github.com/slack-ruby/slack-ruby-bot-server
|
|
264
266
|
licenses: []
|
|
265
267
|
metadata: {}
|
|
266
|
-
post_install_message:
|
|
268
|
+
post_install_message:
|
|
267
269
|
rdoc_options: []
|
|
268
270
|
require_paths:
|
|
269
271
|
- lib
|
|
@@ -278,9 +280,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
278
280
|
- !ruby/object:Gem::Version
|
|
279
281
|
version: '0'
|
|
280
282
|
requirements: []
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
signing_key:
|
|
283
|
+
rubygems_version: 3.1.3
|
|
284
|
+
signing_key:
|
|
284
285
|
specification_version: 4
|
|
285
286
|
summary: A Grape API serving a Slack bot to multiple teams.
|
|
286
287
|
test_files: []
|
data/images/new.png
DELETED
|
Binary file
|