slack-bot-manager 0.1.0pre2 → 0.1.0pre3

Sign up to get free protection for your applications and to get access to all the features.
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