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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.gitmodules +0 -9
  4. data/.rubocop_todo.yml +13 -8
  5. data/CHANGELOG.md +1 -1
  6. data/README.md +42 -15
  7. data/examples/botspotting/Gemfile +9 -0
  8. data/examples/botspotting/README.md +29 -0
  9. data/examples/botspotting/bot.rb +23 -0
  10. data/examples/botspotting/sample.env +3 -0
  11. data/examples/botspotting/slack.rb +35 -0
  12. data/examples/dm-bot/dm-bot.rb +16 -17
  13. data/examples/downforeveryone-bot/Gemfile +10 -0
  14. data/examples/downforeveryone-bot/README.md +23 -0
  15. data/examples/downforeveryone-bot/bot.rb +24 -0
  16. data/examples/downforeveryone-bot/lib/slack.rb +39 -0
  17. data/examples/downforeveryone-bot/lib/status.rb +45 -0
  18. data/examples/downforeveryone-bot/sample.env +3 -0
  19. data/examples/emoji-art-bot/Gemfile +9 -0
  20. data/examples/emoji-art-bot/README.md +43 -0
  21. data/examples/emoji-art-bot/bot.rb +24 -0
  22. data/examples/emoji-art-bot/lib/emoji.rb +37 -0
  23. data/examples/emoji-art-bot/lib/json/emoji.json +1305 -0
  24. data/examples/emoji-art-bot/lib/slack.rb +58 -0
  25. data/examples/emoji-art-bot/sample.env +2 -0
  26. data/lib/slack-bot-manager/client/base.rb +22 -5
  27. data/lib/slack-bot-manager/config.rb +46 -18
  28. data/lib/slack-bot-manager/manager/base.rb +3 -4
  29. data/lib/slack-bot-manager/{manager/storage → storage}/dalli.rb +0 -0
  30. data/lib/slack-bot-manager/{manager/storage → storage}/redis.rb +0 -0
  31. data/lib/slack-bot-manager/storage.rb +6 -0
  32. data/lib/slack-bot-manager/version.rb +1 -1
  33. data/lib/slack-bot-manager.rb +1 -1
  34. data/spec/fixtures/slack-bot-manager/web/rtm_start.yml +176 -3
  35. data/spec/integration/client_spec.rb +6 -2
  36. data/spec/integration/manager_spec.rb +1 -1
  37. data/spec/slack-bot-manager/client/base_spec.rb +34 -11
  38. metadata +22 -5
  39. data/examples/dm-bot/Gemfile.lock +0 -40
  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
@@ -0,0 +1,2 @@
1
+ APP_ENV=development
2
+ SLACK_TOKEN=
@@ -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 send_message(channel, text, *args)
78
+ def message(channel, text = nil, *args)
79
+ return false unless connection
77
80
  options = args.extract_options!
78
- # TODO : HANDLE CASES WHERE NEED TO POST ATTACHMENTS, SEND DMs, ETC
79
- options[:channel] = channel
80
- options[:text] = text
81
- connection.message(options)
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
- MANAGER_ATTRIBUTES = [
6
- :tokens_key,
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
- CLIENT_ATTRIBUTES = [
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
- self.check_interval = 5 # seconds
59
- self.storage_method = method(:detect_storage_method)
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 storage_method
87
- (val = @storage_method).respond_to?(:call) ? val.call : 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 detect_storage_method
115
- [:Redis, :Dalli].each do |storage_method|
142
+ def detect_storage_adapter
143
+ [:Redis, :Dalli].each do |storage_adapter|
116
144
  begin
117
- return SlackBotManager::Storage.const_get(storage_method)
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, :storage
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
@@ -0,0 +1,6 @@
1
+ module SlackBotManager
2
+ module Storage
3
+ autoload :Redis, 'slack-bot-manager/storage/redis'
4
+ autoload :Dalli, 'slack-bot-manager/storage/dalli'
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module SlackBotManager
2
- VERSION = '0.1.0pre2'.freeze
2
+ VERSION = '0.1.0pre3'.freeze
3
3
  end
@@ -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-zyx987wvu654
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.0pre2 <https://github.com/betaworks/slack-bot-manager>
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
- send_message(channel, hello)
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 3
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.storage_method = SlackBotManager::Storage.const_get(store)
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
- @token = ENV.delete('SLACK_API_TOKEN')
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'] = @token if @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('xoxb-abc123def456')
22
- expect(client.token).to eq 'xoxb-abc123def456'
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('xoxb-abc123def456')
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 'send message' do
53
- context 'should succeed' do
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
- puts client.send_message('C123ABC', 'Hello!').inspect
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
- it 'as post message'
62
- it 'as post message with attachments'
83
+ it 'ping' do
84
+ client.connect
85
+ client.ping
63
86
  end
64
87
  end
65
88