slack-bot-manager 0.1.0pre2 → 0.1.0pre3
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/.gitignore +2 -1
- data/.gitmodules +0 -9
- data/.rubocop_todo.yml +13 -8
- data/CHANGELOG.md +1 -1
- data/README.md +42 -15
- data/examples/botspotting/Gemfile +9 -0
- data/examples/botspotting/README.md +29 -0
- data/examples/botspotting/bot.rb +23 -0
- data/examples/botspotting/sample.env +3 -0
- data/examples/botspotting/slack.rb +35 -0
- data/examples/dm-bot/dm-bot.rb +16 -17
- data/examples/downforeveryone-bot/Gemfile +10 -0
- data/examples/downforeveryone-bot/README.md +23 -0
- data/examples/downforeveryone-bot/bot.rb +24 -0
- data/examples/downforeveryone-bot/lib/slack.rb +39 -0
- data/examples/downforeveryone-bot/lib/status.rb +45 -0
- data/examples/downforeveryone-bot/sample.env +3 -0
- data/examples/emoji-art-bot/Gemfile +9 -0
- data/examples/emoji-art-bot/README.md +43 -0
- data/examples/emoji-art-bot/bot.rb +24 -0
- data/examples/emoji-art-bot/lib/emoji.rb +37 -0
- data/examples/emoji-art-bot/lib/json/emoji.json +1305 -0
- data/examples/emoji-art-bot/lib/slack.rb +58 -0
- data/examples/emoji-art-bot/sample.env +2 -0
- data/lib/slack-bot-manager/client/base.rb +22 -5
- data/lib/slack-bot-manager/config.rb +46 -18
- data/lib/slack-bot-manager/manager/base.rb +3 -4
- data/lib/slack-bot-manager/{manager/storage → storage}/dalli.rb +0 -0
- data/lib/slack-bot-manager/{manager/storage → storage}/redis.rb +0 -0
- data/lib/slack-bot-manager/storage.rb +6 -0
- data/lib/slack-bot-manager/version.rb +1 -1
- data/lib/slack-bot-manager.rb +1 -1
- data/spec/fixtures/slack-bot-manager/web/rtm_start.yml +176 -3
- data/spec/integration/client_spec.rb +6 -2
- data/spec/integration/manager_spec.rb +1 -1
- data/spec/slack-bot-manager/client/base_spec.rb +34 -11
- metadata +22 -5
- data/examples/dm-bot/Gemfile.lock +0 -40
- data/lib/slack-bot-manager/manager/storage.rb +0 -6
@@ -0,0 +1,58 @@
|
|
1
|
+
module SlackBotManager
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
def on_hello(data)
|
5
|
+
debug(data)
|
6
|
+
end
|
7
|
+
|
8
|
+
def on_message(data)
|
9
|
+
debug(data)
|
10
|
+
|
11
|
+
message = data['text'].downcase
|
12
|
+
|
13
|
+
if message.include? "emoji" and (message.include? "list" or message.include? "help")
|
14
|
+
list = "Usage: `emoji art [set] [size]` \n Emoji sets: `" + Emoji.list.join("`, `") + "`"
|
15
|
+
send_message(list, channel: data['channel'])
|
16
|
+
return
|
17
|
+
end
|
18
|
+
|
19
|
+
if message.include? "emoji" and message.include? "art"
|
20
|
+
# Set grid size
|
21
|
+
number = 4 # default
|
22
|
+
if message =~ /\d/
|
23
|
+
number = message.scan(/\d+/).first.to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
# Set emoji group
|
27
|
+
case
|
28
|
+
when message.include?("positive") || message.include?("happy") || message.include?("funny") || message.include?("lol") || message.include?(":)")
|
29
|
+
group = "positive"
|
30
|
+
when message.include?("negative") ||message.include?("anger") || message.include?("sad") || message.include?("angry") || message.include?(":(")
|
31
|
+
group = "negative"
|
32
|
+
when message.include?("weather") || message.include?("forecast")
|
33
|
+
group = "weather"
|
34
|
+
when message.include?("nature") || message.include?("plants") || message.include?("flowers")
|
35
|
+
group = "nature"
|
36
|
+
when message.include?("animal") || message.include?("creature")
|
37
|
+
group = "animals"
|
38
|
+
when message.include?("moon")
|
39
|
+
group = "moon"
|
40
|
+
when message.include?("flag")
|
41
|
+
group = "flags"
|
42
|
+
when message.include?("clock")
|
43
|
+
group = "clocks"
|
44
|
+
when message.include?("tile") || message.include?("squares")
|
45
|
+
group = "squares"
|
46
|
+
when message.include?("shapes") || message.include?("pattern")
|
47
|
+
group = "shapes"
|
48
|
+
else
|
49
|
+
group = "all" # default
|
50
|
+
end
|
51
|
+
Emoji.choose(group)
|
52
|
+
|
53
|
+
# Send message
|
54
|
+
message(data['channel'], Emoji.square(number))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -6,6 +6,7 @@ module SlackBotManager
|
|
6
6
|
|
7
7
|
attr_accessor :commands, :connection, :id, :token, :status
|
8
8
|
attr_accessor(*Config::CLIENT_ATTRIBUTES)
|
9
|
+
attr_accessor(*Config::READONLY_ATTRIBUTES)
|
9
10
|
|
10
11
|
def initialize(token, *args)
|
11
12
|
options = args.extract_options!
|
@@ -22,6 +23,7 @@ module SlackBotManager
|
|
22
23
|
SlackBotManager::Config::CLIENT_ATTRIBUTES.each do |key|
|
23
24
|
send("#{key}=", options[key] || SlackBotManager.config.send(key))
|
24
25
|
end
|
26
|
+
self.storage = SlackBotManager.config.send(:storage)
|
25
27
|
|
26
28
|
# Assign commands
|
27
29
|
methods.each do |n|
|
@@ -73,12 +75,27 @@ module SlackBotManager
|
|
73
75
|
unassign_event(evt)
|
74
76
|
end
|
75
77
|
|
76
|
-
def
|
78
|
+
def message(channel, text = nil, *args)
|
79
|
+
return false unless connection
|
77
80
|
options = args.extract_options!
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
81
|
+
if options.keys.length > 0
|
82
|
+
connection.web_client.chat_postMessage(options.merge(channel: channel, text: text))
|
83
|
+
else
|
84
|
+
connection.message(options.merge(channel: channel, text: text))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
alias send_message message
|
88
|
+
|
89
|
+
def typing(channel, *args)
|
90
|
+
return false unless connection
|
91
|
+
options = args.extract_options!
|
92
|
+
connection.typing(options.merge(channel: channel))
|
93
|
+
end
|
94
|
+
|
95
|
+
def ping(*args)
|
96
|
+
return false unless connection
|
97
|
+
options = args.extract_options!
|
98
|
+
connection.ping(options)
|
82
99
|
end
|
83
100
|
|
84
101
|
protected
|
@@ -2,23 +2,28 @@ module SlackBotManager
|
|
2
2
|
module Config
|
3
3
|
extend self
|
4
4
|
|
5
|
-
|
6
|
-
:
|
7
|
-
:teams_key,
|
8
|
-
:check_interval,
|
9
|
-
:storage_method,
|
10
|
-
:storage_options,
|
11
|
-
:logger,
|
12
|
-
:log_level,
|
13
|
-
:verbose
|
5
|
+
READONLY_ATTRIBUTES = [
|
6
|
+
:storage
|
14
7
|
].freeze
|
15
8
|
|
16
|
-
|
9
|
+
GLOBAL_ATTRIBUTES = [
|
10
|
+
:storage_options,
|
11
|
+
:storage_adapter,
|
17
12
|
:logger,
|
18
13
|
:log_level,
|
19
14
|
:verbose
|
20
15
|
].freeze
|
21
16
|
|
17
|
+
MANAGER_ATTRIBUTES = ([
|
18
|
+
:tokens_key,
|
19
|
+
:teams_key,
|
20
|
+
:check_interval
|
21
|
+
] + GLOBAL_ATTRIBUTES).freeze
|
22
|
+
|
23
|
+
CLIENT_ATTRIBUTES = ([
|
24
|
+
# n/a
|
25
|
+
] + GLOBAL_ATTRIBUTES).freeze
|
26
|
+
|
22
27
|
WEB_CLIENT_ATTRIBUTES = [
|
23
28
|
:user_agent,
|
24
29
|
:proxy,
|
@@ -43,8 +48,10 @@ module SlackBotManager
|
|
43
48
|
:bots
|
44
49
|
].freeze
|
45
50
|
|
51
|
+
attr_accessor :storage
|
46
52
|
attr_accessor(*Config::MANAGER_ATTRIBUTES)
|
47
53
|
attr_accessor(*Config::CLIENT_ATTRIBUTES)
|
54
|
+
attr_accessor(*Config::READONLY_ATTRIBUTES)
|
48
55
|
attr_accessor(*Config::WEB_CLIENT_ATTRIBUTES)
|
49
56
|
attr_accessor(*Config::RTM_CLIENT_ATTRIBUTES)
|
50
57
|
|
@@ -53,15 +60,23 @@ module SlackBotManager
|
|
53
60
|
Slack::Web::Config.reset
|
54
61
|
Slack::RealTime::Config.reset
|
55
62
|
|
63
|
+
# Token storage options
|
64
|
+
self.storage = nil
|
65
|
+
self.storage_options = {}
|
66
|
+
self.storage_adapter = method(:detect_storage_adapter)
|
67
|
+
|
68
|
+
# Token options
|
56
69
|
self.tokens_key = 'tokens:statuses'
|
57
70
|
self.teams_key = 'tokens:teams'
|
58
|
-
|
59
|
-
|
60
|
-
self.storage_options = {}
|
71
|
+
|
72
|
+
# Logger options
|
61
73
|
self.logger = defined?(Rails) ? Rails.logger : ::Logger.new(STDOUT)
|
62
74
|
self.log_level = ::Logger::INFO
|
63
75
|
self.logger.formatter = SlackBotManager::Logger::Formatter.new
|
64
76
|
self.verbose = false
|
77
|
+
|
78
|
+
# Connection options
|
79
|
+
self.check_interval = 5 # seconds
|
65
80
|
self.user_agent = "Slack Bot Manager/#{SlackBotManager::VERSION} <https://github.com/betaworks/slack-bot-manager>"
|
66
81
|
end
|
67
82
|
|
@@ -83,8 +98,21 @@ module SlackBotManager
|
|
83
98
|
end
|
84
99
|
end
|
85
100
|
|
86
|
-
def
|
87
|
-
(val = @
|
101
|
+
def storage_adapter
|
102
|
+
(val = @storage_adapter).respond_to?(:call) ? val.call : val
|
103
|
+
end
|
104
|
+
|
105
|
+
def storage_adapter=(val)
|
106
|
+
# return if self.storage.present? && val == @storage_adapter
|
107
|
+
@storage_adapter = val
|
108
|
+
self.storage = @storage_adapter.present? ? storage_adapter.new(self.storage_options) : nil
|
109
|
+
end
|
110
|
+
|
111
|
+
def storage_options=(val)
|
112
|
+
# return if val == @storage_options
|
113
|
+
@storage_options = val
|
114
|
+
self.storage = nil
|
115
|
+
self.storage_adapter = @storage_adapter # Re-initialize
|
88
116
|
end
|
89
117
|
|
90
118
|
def verbose=(val)
|
@@ -111,10 +139,10 @@ module SlackBotManager
|
|
111
139
|
|
112
140
|
private
|
113
141
|
|
114
|
-
def
|
115
|
-
[:Redis, :Dalli].each do |
|
142
|
+
def detect_storage_adapter
|
143
|
+
[:Redis, :Dalli].each do |storage_adapter|
|
116
144
|
begin
|
117
|
-
return SlackBotManager::Storage.const_get(
|
145
|
+
return SlackBotManager::Storage.const_get(storage_adapter)
|
118
146
|
rescue LoadError, NameError
|
119
147
|
false
|
120
148
|
end
|
@@ -5,8 +5,9 @@ module SlackBotManager
|
|
5
5
|
include Errors
|
6
6
|
include Logger
|
7
7
|
|
8
|
-
attr_accessor :connections
|
8
|
+
attr_accessor :connections
|
9
9
|
attr_accessor(*Config::MANAGER_ATTRIBUTES)
|
10
|
+
attr_accessor(*Config::READONLY_ATTRIBUTES)
|
10
11
|
|
11
12
|
def initialize(*args)
|
12
13
|
options = args.extract_options!
|
@@ -18,9 +19,7 @@ module SlackBotManager
|
|
18
19
|
SlackBotManager::Config::MANAGER_ATTRIBUTES.each do |key|
|
19
20
|
send("#{key}=", options[key] || SlackBotManager.config.send(key))
|
20
21
|
end
|
21
|
-
|
22
|
-
# Set token storage method
|
23
|
-
@storage = storage_method.new(storage_options)
|
22
|
+
self.storage = SlackBotManager.config.send(:storage)
|
24
23
|
end
|
25
24
|
|
26
25
|
# Include config helpers
|
File without changes
|
File without changes
|
data/lib/slack-bot-manager.rb
CHANGED
@@ -8,6 +8,7 @@ require 'slack-ruby-client'
|
|
8
8
|
require 'slack-bot-manager/version'
|
9
9
|
require 'slack-bot-manager/errors'
|
10
10
|
require 'slack-bot-manager/logger'
|
11
|
+
require 'slack-bot-manager/storage'
|
11
12
|
require 'slack-bot-manager/config'
|
12
13
|
require 'slack-bot-manager/extend.rb'
|
13
14
|
|
@@ -18,5 +19,4 @@ require 'slack-bot-manager/client/base'
|
|
18
19
|
# connection manager
|
19
20
|
require 'slack-bot-manager/manager/connection'
|
20
21
|
require 'slack-bot-manager/manager/tokens'
|
21
|
-
require 'slack-bot-manager/manager/storage'
|
22
22
|
require 'slack-bot-manager/manager/base'
|
@@ -5,12 +5,12 @@ http_interactions:
|
|
5
5
|
uri: https://slack.com/api/rtm.start
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: token=xoxb-
|
8
|
+
string: token=xoxb-abc123def456
|
9
9
|
headers:
|
10
10
|
Accept:
|
11
11
|
- application/json; charset=utf-8
|
12
12
|
User-Agent:
|
13
|
-
- Slack Bot Manager/0.1.
|
13
|
+
- Slack Bot Manager/0.1.0pre3 <https://github.com/betaworks/slack-bot-manager>
|
14
14
|
Content-Type:
|
15
15
|
- application/x-www-form-urlencoded
|
16
16
|
Accept-Encoding:
|
@@ -54,6 +54,179 @@ http_interactions:
|
|
54
54
|
- keep-alive
|
55
55
|
body:
|
56
56
|
encoding: ASCII-8BIT
|
57
|
-
string: '{"ok": true,"self": {"id": "U0GLEUCH1","name": "teambot","prefs": {"highlight_words": "","user_colors": "","color_names_in_list": true,"growls_enabled": true,"tz": null,"push_dm_alert": true,"push_mention_alert": true,"msg_replies": "{\"flexpane\":false }","push_everything": true,"push_idle_wait": 2,"push_sound": "b2.mp3","push_loud_channels": "","push_mention_channels": "","push_loud_channels_set": "","email_alerts": "instant","email_alerts_sleep_until": 0,"email_misc": true,"email_weekly": true,"welcome_message_hidden": false,"all_channels_loud": true,"loud_channels": "","never_channels": "","loud_channels_set": "","show_member_presence": true,"search_sort": "timestamp","expand_inline_imgs": true,"expand_internal_inline_imgs": true,"expand_snippets": false,"posts_formatting_guide": true,"seen_live_support_popup": false,"seen_welcome_2": false,"seen_ssb_prompt": false,"seen_spaces_new_xp_tooltip": false,"spaces_new_xp_banner_dismissed": false,"search_only_my_channels": false,"emoji_mode": "default","emoji_use": "","has_invited": false,"has_uploaded": false,"has_created_channel": false,"search_exclude_channels": "","messages_theme": "default","webapp_spellcheck": true,"no_joined_overlays": false,"no_created_overlays": false,"dropbox_enabled": false,"seen_domain_invite_reminder": false,"seen_member_invite_reminder": false,"mute_sounds": false,"arrow_history": false,"tab_ui_return_selects": true,"obey_inline_img_limit": true,"new_msg_snd": "knock_brush.mp3","collapsible": false,"collapsible_by_click": true,"require_at": false,"ssb_space_window": "","mac_ssb_bounce": "","mac_ssb_bullet": true,"expand_non_media_attachments": true,"show_typing": true,"pagekeys_handled": true,"last_snippet_type": "","display_real_names_override": 0,"time24": false,"enter_is_special_in_tbt": false,"graphic_emoticons": false,"convert_emoticons": true,"autoplay_chat_sounds": true,"ss_emojis": true,"sidebar_behavior": "","seen_onboarding_start": false,"onboarding_cancelled": false,"seen_onboarding_slackbot_conversation": false,"seen_onboarding_channels": false,"seen_onboarding_direct_messages": false,"seen_onboarding_invites": false,"seen_onboarding_search": false,"seen_onboarding_recent_mentions": false,"seen_onboarding_starred_items": false,"seen_onboarding_private_groups": false,"onboarding_slackbot_conversation_step": 0,"dnd_enabled": false,"dnd_start_hour": "22:00","dnd_end_hour": "08:00","mark_msgs_read_immediately": true,"start_scroll_at_oldest": true,"snippet_editor_wrap_long_lines": false,"ls_disabled": false,"sidebar_theme": "default","sidebar_theme_custom_values": "","f_key_search": false,"k_key_omnibox": true,"speak_growls": false,"mac_speak_voice": "com.apple.speech.synthesis.voice.Alex","mac_speak_speed": 250,"comma_key_prefs": false,"at_channel_suppressed_channels": "","push_at_channel_suppressed_channels": "","prompted_for_email_disabling": false,"full_text_extracts": false,"no_text_in_notifications": false,"muted_channels": "","no_macssb1_banner": false,"no_winssb1_banner": false,"no_omnibox_in_channels": false,"k_key_omnibox_auto_hide_count": 0,"hide_user_group_info_pane": false,"mentions_exclude_at_user_groups": false,"privacy_policy_seen": true,"search_exclude_bots": false,"fuzzy_matching": false,"load_lato_2": false,"fuller_timestamps": false,"last_seen_at_channel_warning": 0,"flex_resize_window": false,"msg_preview": false,"msg_preview_displaces": true,"msg_preview_persistent": true,"emoji_autocomplete_big": false,"winssb_run_from_tray": true,"winssb_window_flash_behavior": "idle","two_factor_auth_enabled": false,"two_factor_type": null,"two_factor_backup_type": null,"mentions_exclude_at_channels": true,"confirm_clear_all_unreads": true,"confirm_user_marked_away": true,"box_enabled": false,"seen_single_emoji_msg": false,"confirm_sh_call_start": true,"preferred_skin_tone": "","show_all_skin_tones": false,"separate_private_channels": false,"whats_new_read": 1452973574,"hotness": false,"frecency_jumper": "","jumbomoji": false},"created": 1452973574,"manual_presence": "active"},"team": {"id": "T0ABC123D","name": "Beta (Test x 2)","email_domain": "","domain": "betatesttest","msg_edit_window_mins": -1,"prefs": {"default_channels": ["C0GEN123X","C0RND123X"],"who_can_manage_integrations": {"user": ["U0GLEUCH1"]},"commands_only_regular": false,"msg_edit_window_mins": -1,"allow_message_deletion": true,"hide_referers": true,"display_real_names": false,"disable_file_uploads": "allow_all","who_can_at_everyone": "regular","who_can_at_channel": "ra","warn_before_at_channel": "always","who_can_create_channels": "regular","who_can_create_shared_channels": "admin","who_can_archive_channels": "regular","who_can_create_groups": "ra","who_can_post_general": "ra","who_can_kick_channels": "admin","who_can_kick_groups": "regular","dnd_enabled": true,"dnd_start_hour": "22:00","dnd_end_hour": "08:00","allow_shared_channels": false,"who_has_team_visibility": "ra","who_can_create_delete_user_groups": "admin","who_can_edit_user_groups": "admin","who_can_change_team_profile": "admin","retention_type": 0,"retention_duration": 0,"group_retention_type": 0,"group_retention_duration": 0,"dm_retention_type": 0,"dm_retention_duration": 0,"file_retention_type": 0,"file_retention_duration": 0,"allow_retention_override": true,"require_at_for_mention": 0,"compliance_export_start": 0,"invites_only_admins": true,"auth_mode": "normal"},"icon": {"image_34": "https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-34.png","image_44": "https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-44.png","image_68": "https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-68.png","image_88": "https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-88.png","image_102": "https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-102.png","image_132": "https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-132.png","image_default": true},"over_storage_limit": false,"plan": "","over_integrations_limit": true},"latest_event_ts": "1454301277.000000","channels": [{"id": "C0GEN123X","name": "general","is_channel": true,"created": 1449006552,"creator": "U0GLEUCH1","is_archived": false,"is_general": true,"has_pins": false,"is_member": true,"last_read": "1452885703.000003","latest": {"type": "message","user": "U0GLEUCH1","text": "Hello","ts": "1454301402.000005"},"unread_count": 116,"unread_count_display": 85,"members": ["U0GLEUCH1"],"topic": {"value": "Company-wide announcements and work-based matters","creator": "","last_set": 0},"purpose": {"value": "This channel is for team-wide communication and announcements. All team members are in this channel.","creator": "","last_set": 0}},{"id": "C0RND123X","name": "random","is_channel": true,"created": 1449006552,"creator": "U0GLEUCH1","is_archived": false,"is_general": false,"has_pins": false,"is_member": false}],"groups": [],"ims": [],"cache_ts": 1454301877,"subteams": {"self": [],"all": []},"dnd": {"dnd_enabled": false,"next_dnd_start_ts": 1,"next_dnd_end_ts": 1,"snooze_enabled": false},"users": [{"id": "U0GLEUCH1","team_id": "T0ABC123D","name": "gleuch","deleted": false,"status": null,"color": "9f69e7","real_name": "","tz": "America/Indiana/Indianapolis","tz_label": "Eastern Standard Time","tz_offset": -18000,"profile": {"avatar_hash": "g2008a0f04b2","real_name": "","real_name_normalized": "","email": "greg@betaworks.com","image_24": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=24&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F66f9%2Fimg%2Favatars%2Fava_0023-24.png","image_32": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=32&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F66f9%2Fimg%2Favatars%2Fava_0023-32.png","image_48": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=48&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F66f9%2Fimg%2Favatars%2Fava_0023-48.png","image_72": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=72&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F3654%2Fimg%2Favatars%2Fava_0023-72.png","image_192": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=192&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F7fa9%2Fimg%2Favatars%2Fava_0023-192.png","image_512": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=512&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F7fa9%2Fimg%2Favatars%2Fava_0023-512.png","fields": null},"is_admin": true,"is_owner": true,"is_primary_owner": true,"is_restricted": false,"is_ultra_restricted": false,"is_bot": false,"presence": "active"},{"id": "USLACKBOT","team_id": "T0ABC123D","name": "slackbot","deleted": false,"status": null,"color": "757575","real_name": "slackbot","tz": null,"tz_label": "Pacific Standard Time","tz_offset": -28800,"profile": {"first_name": "slackbot","last_name": "","image_24": "https://slack.global.ssl.fastly.net/0180/img/slackbot_24.png","image_32": "https://slack.global.ssl.fastly.net/66f9/img/slackbot_32.png","image_48": "https://slack.global.ssl.fastly.net/66f9/img/slackbot_48.png","image_72": "https://slack.global.ssl.fastly.net/0180/img/slackbot_72.png","image_192": "https://slack.global.ssl.fastly.net/66f9/img/slackbot_192.png","image_512": "https://slack.global.ssl.fastly.net/7fa9/img/slackbot_512.png","avatar_hash": "sv1444671949","real_name": "slackbot","real_name_normalized": "slackbot","email": null,"fields": null},"is_admin": false,"is_owner": false,"is_primary_owner": false,"is_restricted": false,"is_ultra_restricted": false,"is_bot": false,"presence": "active"}],"cache_version": "v12-rats","cache_ts_version": "v1-cat","bots": [{"id": "B0PLUS001","deleted": false,"name": "PlusPlus++","icons": {"image_36": "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2015-11-30/15612991041_8858260d7d5e37f0c994_36.jpg","image_48": "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2015-11-30/15612991041_8858260d7d5e37f0c994_48.jpg","image_72": "https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2015-11-30/15612991041_8858260d7d5e37f0c994_72.jpg"}}],"url": "wss://ms001.slack-msgs.com/websocket/abc123xox=="}'
|
57
|
+
string: '{"ok": true,"self": {"id": "U0GLEUCH1","name": "teambot","prefs": {"highlight_words":
|
58
|
+
"","user_colors": "","color_names_in_list": true,"growls_enabled": true,"tz":
|
59
|
+
null,"push_dm_alert": true,"push_mention_alert": true,"msg_replies": "{\"flexpane\":false
|
60
|
+
}","push_everything": true,"push_idle_wait": 2,"push_sound": "b2.mp3","push_loud_channels":
|
61
|
+
"","push_mention_channels": "","push_loud_channels_set": "","email_alerts":
|
62
|
+
"instant","email_alerts_sleep_until": 0,"email_misc": true,"email_weekly":
|
63
|
+
true,"welcome_message_hidden": false,"all_channels_loud": true,"loud_channels":
|
64
|
+
"","never_channels": "","loud_channels_set": "","show_member_presence": true,"search_sort":
|
65
|
+
"timestamp","expand_inline_imgs": true,"expand_internal_inline_imgs": true,"expand_snippets":
|
66
|
+
false,"posts_formatting_guide": true,"seen_live_support_popup": false,"seen_welcome_2":
|
67
|
+
false,"seen_ssb_prompt": false,"seen_spaces_new_xp_tooltip": false,"spaces_new_xp_banner_dismissed":
|
68
|
+
false,"search_only_my_channels": false,"emoji_mode": "default","emoji_use":
|
69
|
+
"","has_invited": false,"has_uploaded": false,"has_created_channel": false,"search_exclude_channels":
|
70
|
+
"","messages_theme": "default","webapp_spellcheck": true,"no_joined_overlays":
|
71
|
+
false,"no_created_overlays": false,"dropbox_enabled": false,"seen_domain_invite_reminder":
|
72
|
+
false,"seen_member_invite_reminder": false,"mute_sounds": false,"arrow_history":
|
73
|
+
false,"tab_ui_return_selects": true,"obey_inline_img_limit": true,"new_msg_snd":
|
74
|
+
"knock_brush.mp3","collapsible": false,"collapsible_by_click": true,"require_at":
|
75
|
+
false,"ssb_space_window": "","mac_ssb_bounce": "","mac_ssb_bullet": true,"expand_non_media_attachments":
|
76
|
+
true,"show_typing": true,"pagekeys_handled": true,"last_snippet_type": "","display_real_names_override":
|
77
|
+
0,"time24": false,"enter_is_special_in_tbt": false,"graphic_emoticons": false,"convert_emoticons":
|
78
|
+
true,"autoplay_chat_sounds": true,"ss_emojis": true,"sidebar_behavior": "","seen_onboarding_start":
|
79
|
+
false,"onboarding_cancelled": false,"seen_onboarding_slackbot_conversation":
|
80
|
+
false,"seen_onboarding_channels": false,"seen_onboarding_direct_messages":
|
81
|
+
false,"seen_onboarding_invites": false,"seen_onboarding_search": false,"seen_onboarding_recent_mentions":
|
82
|
+
false,"seen_onboarding_starred_items": false,"seen_onboarding_private_groups":
|
83
|
+
false,"onboarding_slackbot_conversation_step": 0,"dnd_enabled": false,"dnd_start_hour":
|
84
|
+
"22:00","dnd_end_hour": "08:00","mark_msgs_read_immediately": true,"start_scroll_at_oldest":
|
85
|
+
true,"snippet_editor_wrap_long_lines": false,"ls_disabled": false,"sidebar_theme":
|
86
|
+
"default","sidebar_theme_custom_values": "","f_key_search": false,"k_key_omnibox":
|
87
|
+
true,"speak_growls": false,"mac_speak_voice": "com.apple.speech.synthesis.voice.Alex","mac_speak_speed":
|
88
|
+
250,"comma_key_prefs": false,"at_channel_suppressed_channels": "","push_at_channel_suppressed_channels":
|
89
|
+
"","prompted_for_email_disabling": false,"full_text_extracts": false,"no_text_in_notifications":
|
90
|
+
false,"muted_channels": "","no_macssb1_banner": false,"no_winssb1_banner":
|
91
|
+
false,"no_omnibox_in_channels": false,"k_key_omnibox_auto_hide_count": 0,"hide_user_group_info_pane":
|
92
|
+
false,"mentions_exclude_at_user_groups": false,"privacy_policy_seen": true,"search_exclude_bots":
|
93
|
+
false,"fuzzy_matching": false,"load_lato_2": false,"fuller_timestamps": false,"last_seen_at_channel_warning":
|
94
|
+
0,"flex_resize_window": false,"msg_preview": false,"msg_preview_displaces":
|
95
|
+
true,"msg_preview_persistent": true,"emoji_autocomplete_big": false,"winssb_run_from_tray":
|
96
|
+
true,"winssb_window_flash_behavior": "idle","two_factor_auth_enabled": false,"two_factor_type":
|
97
|
+
null,"two_factor_backup_type": null,"mentions_exclude_at_channels": true,"confirm_clear_all_unreads":
|
98
|
+
true,"confirm_user_marked_away": true,"box_enabled": false,"seen_single_emoji_msg":
|
99
|
+
false,"confirm_sh_call_start": true,"preferred_skin_tone": "","show_all_skin_tones":
|
100
|
+
false,"separate_private_channels": false,"whats_new_read": 1452973574,"hotness":
|
101
|
+
false,"frecency_jumper": "","jumbomoji": false},"created": 1452973574,"manual_presence":
|
102
|
+
"active"},"team": {"id": "T0ABC123D","name": "Beta (Test x 2)","email_domain":
|
103
|
+
"","domain": "betatesttest","msg_edit_window_mins": -1,"prefs": {"default_channels":
|
104
|
+
["C0GEN123X","C0RND123X"],"who_can_manage_integrations": {"user": ["U0GLEUCH1"]},"commands_only_regular":
|
105
|
+
false,"msg_edit_window_mins": -1,"allow_message_deletion": true,"hide_referers":
|
106
|
+
true,"display_real_names": false,"disable_file_uploads": "allow_all","who_can_at_everyone":
|
107
|
+
"regular","who_can_at_channel": "ra","warn_before_at_channel": "always","who_can_create_channels":
|
108
|
+
"regular","who_can_create_shared_channels": "admin","who_can_archive_channels":
|
109
|
+
"regular","who_can_create_groups": "ra","who_can_post_general": "ra","who_can_kick_channels":
|
110
|
+
"admin","who_can_kick_groups": "regular","dnd_enabled": true,"dnd_start_hour":
|
111
|
+
"22:00","dnd_end_hour": "08:00","allow_shared_channels": false,"who_has_team_visibility":
|
112
|
+
"ra","who_can_create_delete_user_groups": "admin","who_can_edit_user_groups":
|
113
|
+
"admin","who_can_change_team_profile": "admin","retention_type": 0,"retention_duration":
|
114
|
+
0,"group_retention_type": 0,"group_retention_duration": 0,"dm_retention_type":
|
115
|
+
0,"dm_retention_duration": 0,"file_retention_type": 0,"file_retention_duration":
|
116
|
+
0,"allow_retention_override": true,"require_at_for_mention": 0,"compliance_export_start":
|
117
|
+
0,"invites_only_admins": true,"auth_mode": "normal"},"icon": {"image_34":
|
118
|
+
"https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-34.png","image_44":
|
119
|
+
"https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-44.png","image_68":
|
120
|
+
"https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-68.png","image_88":
|
121
|
+
"https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-88.png","image_102":
|
122
|
+
"https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-102.png","image_132":
|
123
|
+
"https://slack.global.ssl.fastly.net/66f9/img/avatars-teams/ava_0008-132.png","image_default":
|
124
|
+
true},"over_storage_limit": false,"plan": "","over_integrations_limit": true},"latest_event_ts":
|
125
|
+
"1454301277.000000","channels": [{"id": "C0GEN123X","name": "general","is_channel":
|
126
|
+
true,"created": 1449006552,"creator": "U0GLEUCH1","is_archived": false,"is_general":
|
127
|
+
true,"has_pins": false,"is_member": true,"last_read": "1452885703.000003","latest":
|
128
|
+
{"type": "message","user": "U0GLEUCH1","text": "Hello","ts": "1454301402.000005"},"unread_count":
|
129
|
+
116,"unread_count_display": 85,"members": ["U0GLEUCH1"],"topic": {"value":
|
130
|
+
"Company-wide announcements and work-based matters","creator": "","last_set":
|
131
|
+
0},"purpose": {"value": "This channel is for team-wide communication and announcements.
|
132
|
+
All team members are in this channel.","creator": "","last_set": 0}},{"id":
|
133
|
+
"C0RND123X","name": "random","is_channel": true,"created": 1449006552,"creator":
|
134
|
+
"U0GLEUCH1","is_archived": false,"is_general": false,"has_pins": false,"is_member":
|
135
|
+
false}],"groups": [],"ims": [],"cache_ts": 1454301877,"subteams": {"self":
|
136
|
+
[],"all": []},"dnd": {"dnd_enabled": false,"next_dnd_start_ts": 1,"next_dnd_end_ts":
|
137
|
+
1,"snooze_enabled": false},"users": [{"id": "U0GLEUCH1","team_id": "T0ABC123D","name":
|
138
|
+
"gleuch","deleted": false,"status": null,"color": "9f69e7","real_name": "","tz":
|
139
|
+
"America/Indiana/Indianapolis","tz_label": "Eastern Standard Time","tz_offset":
|
140
|
+
-18000,"profile": {"avatar_hash": "g2008a0f04b2","real_name": "","real_name_normalized":
|
141
|
+
"","email": "greg@betaworks.com","image_24": "https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=24&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F66f9%2Fimg%2Favatars%2Fava_0023-24.png","image_32":
|
142
|
+
"https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=32&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F66f9%2Fimg%2Favatars%2Fava_0023-32.png","image_48":
|
143
|
+
"https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=48&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F66f9%2Fimg%2Favatars%2Fava_0023-48.png","image_72":
|
144
|
+
"https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=72&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F3654%2Fimg%2Favatars%2Fava_0023-72.png","image_192":
|
145
|
+
"https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=192&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F7fa9%2Fimg%2Favatars%2Fava_0023-192.png","image_512":
|
146
|
+
"https://secure.gravatar.com/avatar/2008a0f04b2a447fdf984e0ff3a5c8ae.jpg?s=512&d=https%3A%2F%2Fslack.global.ssl.fastly.net%2F7fa9%2Fimg%2Favatars%2Fava_0023-512.png","fields":
|
147
|
+
null},"is_admin": true,"is_owner": true,"is_primary_owner": true,"is_restricted":
|
148
|
+
false,"is_ultra_restricted": false,"is_bot": false,"presence": "active"},{"id":
|
149
|
+
"USLACKBOT","team_id": "T0ABC123D","name": "slackbot","deleted": false,"status":
|
150
|
+
null,"color": "757575","real_name": "slackbot","tz": null,"tz_label": "Pacific
|
151
|
+
Standard Time","tz_offset": -28800,"profile": {"first_name": "slackbot","last_name":
|
152
|
+
"","image_24": "https://slack.global.ssl.fastly.net/0180/img/slackbot_24.png","image_32":
|
153
|
+
"https://slack.global.ssl.fastly.net/66f9/img/slackbot_32.png","image_48":
|
154
|
+
"https://slack.global.ssl.fastly.net/66f9/img/slackbot_48.png","image_72":
|
155
|
+
"https://slack.global.ssl.fastly.net/0180/img/slackbot_72.png","image_192":
|
156
|
+
"https://slack.global.ssl.fastly.net/66f9/img/slackbot_192.png","image_512":
|
157
|
+
"https://slack.global.ssl.fastly.net/7fa9/img/slackbot_512.png","avatar_hash":
|
158
|
+
"sv1444671949","real_name": "slackbot","real_name_normalized": "slackbot","email":
|
159
|
+
null,"fields": null},"is_admin": false,"is_owner": false,"is_primary_owner":
|
160
|
+
false,"is_restricted": false,"is_ultra_restricted": false,"is_bot": false,"presence":
|
161
|
+
"active"}],"cache_version": "v12-rats","cache_ts_version": "v1-cat","bots":
|
162
|
+
[{"id": "B0PLUS001","deleted": false,"name": "PlusPlus++","icons": {"image_36":
|
163
|
+
"https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2015-11-30/15612991041_8858260d7d5e37f0c994_36.jpg","image_48":
|
164
|
+
"https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2015-11-30/15612991041_8858260d7d5e37f0c994_48.jpg","image_72":
|
165
|
+
"https://s3-us-west-2.amazonaws.com/slack-files2/avatars/2015-11-30/15612991041_8858260d7d5e37f0c994_72.jpg"}}],"url":
|
166
|
+
"wss://ms001.slack-msgs.com/websocket/abc123xox=="}'
|
58
167
|
http_version:
|
59
168
|
recorded_at: Mon, 01 Feb 2016 04:44:44 GMT
|
169
|
+
- request:
|
170
|
+
method: post
|
171
|
+
uri: https://slack.com/api/chat.postMessage
|
172
|
+
body:
|
173
|
+
encoding: UTF-8
|
174
|
+
string: as_user=false&channel=C123ABC&text=Hello%21&token=xoxb-abc123def456&username=botbotbot
|
175
|
+
headers:
|
176
|
+
Accept:
|
177
|
+
- application/json; charset=utf-8
|
178
|
+
User-Agent:
|
179
|
+
- Slack Bot Manager/0.1.0pre3 <https://github.com/betaworks/slack-bot-manager>
|
180
|
+
Content-Type:
|
181
|
+
- application/x-www-form-urlencoded
|
182
|
+
Accept-Encoding:
|
183
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
184
|
+
response:
|
185
|
+
status:
|
186
|
+
code: 200
|
187
|
+
message: OK
|
188
|
+
headers:
|
189
|
+
Content-Type:
|
190
|
+
- application/json; charset=utf-8
|
191
|
+
Content-Length:
|
192
|
+
- '137'
|
193
|
+
Connection:
|
194
|
+
- keep-alive
|
195
|
+
Access-Control-Allow-Origin:
|
196
|
+
- "*"
|
197
|
+
Cache-Control:
|
198
|
+
- private, no-cache, no-store, must-revalidate
|
199
|
+
Content-Security-Policy:
|
200
|
+
- referrer no-referrer;
|
201
|
+
Date:
|
202
|
+
- Sun, 07 Feb 2016 19:11:19 GMT
|
203
|
+
Expires:
|
204
|
+
- Mon, 26 Jul 1997 05:00:00 GMT
|
205
|
+
Pragma:
|
206
|
+
- no-cache
|
207
|
+
Server:
|
208
|
+
- Apache
|
209
|
+
Strict-Transport-Security:
|
210
|
+
- max-age=31536000; includeSubDomains; preload
|
211
|
+
Vary:
|
212
|
+
- Accept-Encoding
|
213
|
+
X-Accepted-Oauth-Scopes:
|
214
|
+
- chat:write:bot,post
|
215
|
+
X-Content-Type-Options:
|
216
|
+
- nosniff
|
217
|
+
X-Oauth-Scopes:
|
218
|
+
- identify,bot:basic
|
219
|
+
X-Xss-Protection:
|
220
|
+
- '0'
|
221
|
+
X-Cache:
|
222
|
+
- Miss from cloudfront
|
223
|
+
Via:
|
224
|
+
- 1.1 0414240d048e19a0b44e27850befa8c4.cloudfront.net (CloudFront)
|
225
|
+
X-Amz-Cf-Id:
|
226
|
+
- owUkQexxW3EJ3vOPrf9hfmfcc3bzKCBKuzbPvhNyJTAfLs_wXljAkg==
|
227
|
+
body:
|
228
|
+
encoding: ASCII-8BIT
|
229
|
+
string: '{"ok":true,"channel":"C123ABC","ts":"1454872279.000008","message":{"text":"Hello!","username":"botbotbot","type":"message","subtype":"bot_message","ts":"1454872279.000008"}}'
|
230
|
+
http_version:
|
231
|
+
recorded_at: Sun, 07 Feb 2016 19:11:18 GMT
|
232
|
+
recorded_with: VCR 3.0.1
|
@@ -46,16 +46,20 @@ RSpec.describe 'client integration test', skip: !ENV['SLACK_API_TOKEN'] && 'miss
|
|
46
46
|
# On hello, say hello
|
47
47
|
conn.on :hello do |_|
|
48
48
|
channel = client_channels.keys.first
|
49
|
-
|
49
|
+
message(channel, hello)
|
50
50
|
end
|
51
51
|
|
52
52
|
# Disconnect if message is not hello
|
53
53
|
conn.on :message do |_|
|
54
|
+
channel = client_channels.keys.first
|
55
|
+
typing(channel)
|
56
|
+
sleep 2
|
57
|
+
message(channel, 'Bye!')
|
54
58
|
disconnect
|
55
59
|
end
|
56
60
|
|
57
61
|
conn.connect
|
58
|
-
sleep
|
62
|
+
sleep 5
|
59
63
|
fail if conn.connected?
|
60
64
|
end
|
61
65
|
end
|
@@ -44,7 +44,7 @@ RSpec.describe 'manager integration test', skip: !ENV['SLACK_API_TOKEN'] && 'mis
|
|
44
44
|
context store.to_s do
|
45
45
|
before do
|
46
46
|
SlackBotManager::Manager.configure do |config|
|
47
|
-
config.
|
47
|
+
config.storage_adapter = SlackBotManager::Storage.const_get(store)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -4,7 +4,8 @@ RSpec.describe SlackBotManager::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
4
4
|
let(:url) { 'wss://ms001.slack-msgs.com/websocket/abc123xox==' }
|
5
5
|
|
6
6
|
before do
|
7
|
-
@
|
7
|
+
@old_token = ENV.delete('SLACK_API_TOKEN')
|
8
|
+
@token = 'xoxb-abc123def456'
|
8
9
|
|
9
10
|
SlackBotManager::Config.reset
|
10
11
|
SlackBotManager::Client.configure do |config|
|
@@ -13,16 +14,16 @@ RSpec.describe SlackBotManager::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
13
14
|
end
|
14
15
|
|
15
16
|
after do
|
16
|
-
ENV['SLACK_API_TOKEN'] = @
|
17
|
+
ENV['SLACK_API_TOKEN'] = @old_token if @old_token
|
17
18
|
end
|
18
19
|
|
19
20
|
context 'iniitalize' do
|
20
21
|
it 'requires a token' do
|
21
|
-
client = SlackBotManager::Client.new(
|
22
|
-
expect(client.token).to eq
|
22
|
+
client = SlackBotManager::Client.new(@token)
|
23
|
+
expect(client.token).to eq @token
|
23
24
|
end
|
24
25
|
it 'be disconnected' do
|
25
|
-
client = SlackBotManager::Client.new(
|
26
|
+
client = SlackBotManager::Client.new(@token)
|
26
27
|
expect(client.status).to eq :disconnected
|
27
28
|
end
|
28
29
|
end
|
@@ -49,17 +50,39 @@ RSpec.describe SlackBotManager::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
52
|
-
context '
|
53
|
-
|
54
|
-
let(:client) { SlackBotManager::Client.new(@token) }
|
53
|
+
context 'should succeed' do
|
54
|
+
let(:client) { SlackBotManager::Client.new(@token) }
|
55
55
|
|
56
|
+
context 'send message' do
|
56
57
|
it 'as socket message' do
|
57
58
|
client.connect
|
58
|
-
|
59
|
+
client.message('C123ABC', 'Hello!')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'as socket message (send_message alias)' do
|
63
|
+
client.connect
|
64
|
+
client.send_message('C123ABC', 'Hello!')
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'as post message' do
|
68
|
+
client.connect
|
69
|
+
client.message('C123ABC', 'Hello!', as_user: false, username: 'botbotbot')
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'as post message with attachments' do
|
73
|
+
client.connect
|
74
|
+
client.message('C123ABC', 'Hello!', attachments: [{ title: 'Hello!', text: 'abc' }])
|
59
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'typing' do
|
79
|
+
client.connect
|
80
|
+
client.typing('C123ABC')
|
81
|
+
end
|
60
82
|
|
61
|
-
|
62
|
-
|
83
|
+
it 'ping' do
|
84
|
+
client.connect
|
85
|
+
client.ping
|
63
86
|
end
|
64
87
|
end
|
65
88
|
|