slack-ruby-client 0.9.1 → 0.10.0

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +16 -11
  3. data/CHANGELOG.md +11 -0
  4. data/README.md +40 -12
  5. data/UPGRADING.md +1 -1
  6. data/bin/commands.rb +1 -0
  7. data/bin/commands/channels.rb +3 -0
  8. data/bin/commands/conversations.rb +178 -0
  9. data/bin/commands/groups.rb +1 -9
  10. data/bin/commands/im.rb +3 -0
  11. data/bin/commands/rtm.rb +1 -0
  12. data/bin/commands/users.rb +3 -1
  13. data/lib/slack-ruby-client.rb +6 -0
  14. data/lib/slack/real_time/client.rb +1 -1
  15. data/lib/slack/real_time/concurrency/celluloid.rb +1 -1
  16. data/lib/slack/version.rb +1 -1
  17. data/lib/slack/web/api/endpoints.rb +2 -0
  18. data/lib/slack/web/api/endpoints/channels.rb +13 -1
  19. data/lib/slack/web/api/endpoints/conversations.rb +301 -0
  20. data/lib/slack/web/api/endpoints/groups.rb +2 -13
  21. data/lib/slack/web/api/endpoints/im.rb +13 -1
  22. data/lib/slack/web/api/endpoints/rtm.rb +2 -0
  23. data/lib/slack/web/api/endpoints/users.rb +11 -1
  24. data/lib/slack/web/api/templates/command.erb +2 -2
  25. data/lib/slack/web/api/templates/method.erb +10 -0
  26. data/lib/slack/web/config.rb +7 -3
  27. data/lib/slack/web/faraday/connection.rb +1 -1
  28. data/lib/slack/web/pagination/cursor.rb +48 -0
  29. data/spec/fixtures/slack/web/paginated_users_list.yml +181 -0
  30. data/spec/slack/real_time/client_spec.rb +60 -62
  31. data/spec/slack/real_time/concurrency/celluloid_spec.rb +41 -31
  32. data/spec/slack/web/api/endpoints/conversations_spec.rb +100 -0
  33. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -0
  34. data/spec/slack/web/api/pagination/cursor_spec.rb +70 -0
  35. metadata +12 -3
@@ -23,6 +23,8 @@ module Slack
23
23
  #
24
24
  # @option options [Object] :batch_presence_aware
25
25
  # Group presence change notices as presence_change_batch events when possible. See batching.
26
+ # @option options [Object] :include_locale
27
+ # Set this to true to receive the locale for users and channels. Defaults to false.
26
28
  # @option options [Object] :mpim_aware
27
29
  # Returns MPIMs to the client in the API response.
28
30
  # @option options [Object] :no_latest
@@ -41,6 +41,8 @@ module Slack
41
41
  #
42
42
  # @option options [user] :user
43
43
  # User to get info on.
44
+ # @option options [Object] :include_locale
45
+ # Set this to true to receive the locale for this user. Defaults to false.
44
46
  # @see https://api.slack.com/methods/users.info
45
47
  # @see https://github.com/dblock/slack-api-ref/blob/master/methods/users/users.info.json
46
48
  def users_info(options = {})
@@ -54,6 +56,8 @@ module Slack
54
56
  #
55
57
  # @option options [Object] :cursor
56
58
  # Paginate through collections of data by setting the cursor parameter to a next_cursor attribute returned by a previous request's response_metadata. Default value fetches the first "page" of the collection. See pagination for more detail.
59
+ # @option options [Object] :include_locale
60
+ # Set this to true to receive the locale for users. Defaults to false.
57
61
  # @option options [Object] :limit
58
62
  # The maximum number of items to return. Fewer than the requested number of items may be returned, even if the end of the users list hasn't been reached.
59
63
  # @option options [Object] :presence
@@ -61,7 +65,13 @@ module Slack
61
65
  # @see https://api.slack.com/methods/users.list
62
66
  # @see https://github.com/dblock/slack-api-ref/blob/master/methods/users/users.list.json
63
67
  def users_list(options = {})
64
- post('users.list', options)
68
+ if block_given?
69
+ Pagination::Cursor.new(self, :users_list, options).each do |page|
70
+ yield page
71
+ end
72
+ else
73
+ post('users.list', options)
74
+ end
65
75
  end
66
76
 
67
77
  #
@@ -20,8 +20,8 @@ command '<%= group['name'].gsub(".", "_") %>' do |g|
20
20
  g.long_desc %( <%= data["desc"].split("\n").join(" ") %> )
21
21
  g.command '<%= name %>' do |c|
22
22
  <% data["args"].each do |arg_name, arg_v| %>
23
- <% if arg_v["desc"].include?("'") %>
24
- c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"] %>"
23
+ <% if arg_v["desc"].include?("'") %>
24
+ c.flag '<%= arg_name %>', desc: "<%= arg_v["desc"].gsub('"', '\'') %>"
25
25
  <% else %>
26
26
  c.flag '<%= arg_name %>', desc: '<%= arg_v["desc"] %>'
27
27
  <% end %>
@@ -39,7 +39,17 @@ module Slack
39
39
  <% if data['args']['user'] %>
40
40
  options = options.merge(user: users_id(options)['user']['id']) if options[:user]
41
41
  <% end %>
42
+ <% if data['args'].keys.include?('cursor') %>
43
+ if block_given?
44
+ Pagination::Cursor.new(self, :<%= group.gsub(".", "_") %>_<%= name %>, options).each do |page|
45
+ yield page
46
+ end
47
+ else
48
+ post('<%= group %>.<%= name %>', options)
49
+ end
50
+ <% else %>
42
51
  post('<%= group %>.<%= name %>', options)
52
+ <% end %>
43
53
  end
44
54
  <% end %>
45
55
  end
@@ -12,7 +12,9 @@ module Slack
12
12
  :endpoint,
13
13
  :token,
14
14
  :timeout,
15
- :open_timeout
15
+ :open_timeout,
16
+ :default_page_size,
17
+ :default_max_retries
16
18
  ].freeze
17
19
 
18
20
  attr_accessor(*Config::ATTRIBUTES)
@@ -20,13 +22,15 @@ module Slack
20
22
  def reset
21
23
  self.endpoint = 'https://slack.com/api/'
22
24
  self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
23
- self.ca_path = `openssl version -a | grep OPENSSLDIR | awk '{print $2}'|sed -e 's/\"//g'`
24
- self.ca_file = "#{ca_path}/ca-certificates.crt"
25
+ self.ca_path = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
26
+ self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
25
27
  self.token = nil
26
28
  self.proxy = nil
27
29
  self.logger = nil
28
30
  self.timeout = nil
29
31
  self.open_timeout = nil
32
+ self.default_page_size = 100
33
+ self.default_max_retries = 100
30
34
  end
31
35
  end
32
36
 
@@ -11,7 +11,7 @@ module Slack
11
11
 
12
12
  options[:headers]['User-Agent'] = user_agent if user_agent
13
13
  options[:proxy] = proxy if proxy
14
- options[:ssl] = { ca_path: ca_path, ca_file: ca_file }
14
+ options[:ssl] = { ca_path: ca_path, ca_file: ca_file } if ca_path || ca_file
15
15
 
16
16
  request_options = {}
17
17
  request_options[:timeout] = timeout if timeout
@@ -0,0 +1,48 @@
1
+ module Slack
2
+ module Web
3
+ module Api
4
+ module Pagination
5
+ class Cursor
6
+ include Enumerable
7
+
8
+ attr_reader :client
9
+ attr_reader :verb
10
+ attr_reader :sleep_interval
11
+ attr_reader :max_retries
12
+ attr_reader :params
13
+
14
+ def initialize(client, verb, params = {})
15
+ @client = client
16
+ @verb = verb
17
+ @params = params.dup
18
+ @sleep_interval = @params.delete(:sleep_interval)
19
+ @max_retries = @params.delete(:max_retries) || client.default_max_retries
20
+ end
21
+
22
+ def each
23
+ next_cursor = nil
24
+ retry_count = 0
25
+ loop do
26
+ query = { limit: client.default_page_size }.merge(params).merge(cursor: next_cursor)
27
+ begin
28
+ response = client.send(verb, query)
29
+ rescue Slack::Web::Api::Errors::TooManyRequestsError => e
30
+ raise e if retry_count >= max_retries
31
+ client.logger.debug("#{self.class}##{__method__}") { e.to_s }
32
+ retry_count += 1
33
+ sleep(e.retry_after.seconds)
34
+ next
35
+ end
36
+ yield response
37
+ break unless response.response_metadata
38
+ next_cursor = response.response_metadata.next_cursor
39
+ break if next_cursor.blank?
40
+ retry_count = 0
41
+ sleep(sleep_interval) if sleep_interval
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,181 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://slack.com/api/users.list
6
+ body:
7
+ encoding: UTF-8
8
+ string: limit=5&presence=true&token=token
9
+ headers:
10
+ Accept:
11
+ - application/json; charset=utf-8
12
+ User-Agent:
13
+ - Slack Ruby Client/0.9.2
14
+ Content-Type:
15
+ - application/x-www-form-urlencoded
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Content-Type:
24
+ - application/json; charset=utf-8
25
+ body:
26
+ encoding: ASCII-8BIT
27
+ string: '{"ok":true,"offset":"U07518DTL","members":[{"id":"USLACKBOT","team_id":"T04KB5WQH","name":"slackbot","deleted":false,"color":"757575","real_name":"slackbot","tz":null,"tz_label":"Pacific
28
+ Daylight Time","tz_offset":-25200,"profile":{"first_name":"slackbot","last_name":"","image_24":"https:\/\/a.slack-edge.com\/0180\/img\/slackbot_24.png","image_32":"https:\/\/a.slack-edge.com\/2fac\/plugins\/slackbot\/assets\/service_32.png","image_48":"https:\/\/a.slack-edge.com\/2fac\/plugins\/slackbot\/assets\/service_48.png","image_72":"https:\/\/a.slack-edge.com\/0180\/img\/slackbot_72.png","image_192":"https:\/\/a.slack-edge.com\/66f9\/img\/slackbot_192.png","image_512":"https:\/\/a.slack-edge.com\/1801\/img\/slackbot_512.png","avatar_hash":"sv1444671949","always_active":true,"real_name":"slackbot","real_name_normalized":"slackbot","fields":null,"team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"updated":0,"is_app_user":false},{"id":"U04JPQ0JS","team_id":"T04KB5WQH","name":"gamebot","deleted":true,"profile":{"bot_id":"B04JPQ0JE","image_24":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4635825662_28d3661bf00dc6013442_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4635825662_28d3661bf00dc6013442_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4635825662_28d3661bf00dc6013442_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4635825662_28d3661bf00dc6013442_48.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4635825662_28d3661bf00dc6013442_48.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4635825662_28d3661bf00dc6013442_original.jpg","first_name":"Game","last_name":"Bot","title":"Game
29
+ ons.","avatar_hash":"28d3661bf00d","real_name":"Game Bot","real_name_normalized":"Game
30
+ Bot","team":"T04KB5WQH"},"is_bot":true,"updated":1459895593,"is_app_user":false,"presence":"away"},{"id":"U04JZBDQQ","team_id":"T04KB5WQH","name":"foo","deleted":true,"profile":{"bot_id":"B04JZBDQC","image_24":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4645387956_44604ca32e800d947f22_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4645387956_44604ca32e800d947f22_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4645387956_44604ca32e800d947f22_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4645387956_44604ca32e800d947f22_72.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4645387956_44604ca32e800d947f22_192.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-04-28\/4645387956_44604ca32e800d947f22_original.jpg","avatar_hash":"44604ca32e80","real_name":"","real_name_normalized":"","team":"T04KB5WQH"},"is_bot":true,"updated":1459895600,"is_app_user":false,"presence":"away"},{"id":"U04KB5WQR","team_id":"T04KB5WQH","name":"dblock","deleted":false,"color":"9f69e7","real_name":"Daniel","tz":"America\/Indiana\/Indianapolis","tz_label":"Eastern
31
+ Daylight Time","tz_offset":-14400,"profile":{"first_name":"Daniel","last_name":"","title":"","phone":"","skype":"","avatar_hash":"g3d925b45ac0","real_name":"Daniel","real_name_normalized":"Daniel","email":"dblock@example.com","image_24":"https:\/\/secure.gravatar.com\/avatar\/3d925b45ac07ec0ae5bd04888f6c5b61.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0015-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/3d925b45ac07ec0ae5bd04888f6c5b61.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0015-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/3d925b45ac07ec0ae5bd04888f6c5b61.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0015-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/3d925b45ac07ec0ae5bd04888f6c5b61.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0015-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/3d925b45ac07ec0ae5bd04888f6c5b61.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0015-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/3d925b45ac07ec0ae5bd04888f6c5b61.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0015-512.png","team":"T04KB5WQH"},"is_admin":true,"is_owner":true,"is_primary_owner":true,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"updated":1459895609,"is_app_user":false,"presence":"active"},{"id":"U06JGTU5V","team_id":"T04KB5WQH","name":"mathbot","deleted":true,"profile":{"bot_id":"B06JH1N93","image_24":"https:\/\/avatars.slack-edge.com\/2015-06-19\/6629501812_c507c80d735dfc75bbc8_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-06-19\/6629501812_c507c80d735dfc75bbc8_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-06-19\/6629501812_c507c80d735dfc75bbc8_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-06-19\/6629501812_c507c80d735dfc75bbc8_48.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-06-19\/6629501812_c507c80d735dfc75bbc8_48.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-06-19\/6629501812_c507c80d735dfc75bbc8_original.jpg","first_name":"Math","last_name":"Bot","avatar_hash":"c507c80d735d","real_name":"Math
32
+ Bot","real_name_normalized":"Math Bot","team":"T04KB5WQH"},"is_bot":true,"updated":1459895914,"is_app_user":false,"presence":"away"}],"cache_ts":1504041966,"response_metadata":{"next_cursor":"dXNlcjpVMDc1MThEVEw="}}'
33
+ http_version:
34
+ recorded_at: Tue, 29 Aug 2017 21:26:06 GMT
35
+ - request:
36
+ method: post
37
+ uri: https://slack.com/api/users.list
38
+ body:
39
+ encoding: UTF-8
40
+ string: cursor=dXNlcjpVMDc1MThEVEw%3D&limit=5&presence=true&token=token
41
+ headers:
42
+ Accept:
43
+ - application/json; charset=utf-8
44
+ User-Agent:
45
+ - Slack Ruby Client/0.9.2
46
+ Content-Type:
47
+ - application/x-www-form-urlencoded
48
+ Accept-Encoding:
49
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
50
+ response:
51
+ status:
52
+ code: 200
53
+ message: OK
54
+ headers:
55
+ Content-Type:
56
+ - application/json; charset=utf-8
57
+ body:
58
+ encoding: ASCII-8BIT
59
+ string: '{"ok":true,"offset":"U0GPR6KDJ","members":[{"id":"U07518DTL","team_id":"T04KB5WQH","name":"testbot","deleted":false,"color":"674b1b","real_name":"Art
60
+ Bot","tz":null,"tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"bot_id":"B0751JU2H","image_24":"https:\/\/avatars.slack-edge.com\/2015-07-02\/7171641589_359bf095c1fe0841e582_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-07-02\/7171641589_359bf095c1fe0841e582_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-07-02\/7171641589_359bf095c1fe0841e582_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-07-02\/7171641589_359bf095c1fe0841e582_48.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-07-02\/7171641589_359bf095c1fe0841e582_48.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-07-02\/7171641589_359bf095c1fe0841e582_original.jpg","title":"Also
61
+ used in Travis-CI for slack-ruby-client.","avatar_hash":"359bf095c1fe","first_name":"Art","last_name":"Bot","real_name":"Art
62
+ Bot","real_name_normalized":"Art Bot","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1464624441,"is_app_user":false,"presence":"away"},{"id":"U07KECJ77","team_id":"T04KB5WQH","name":"aws","deleted":true,"profile":{"bot_id":"B07KECJ6R","image_24":"https:\/\/avatars.slack-edge.com\/2015-07-14\/7660472085_4755a86e204c9706c84f_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-07-14\/7660472085_4755a86e204c9706c84f_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-07-14\/7660472085_4755a86e204c9706c84f_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-07-14\/7660472085_4755a86e204c9706c84f_48.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-07-14\/7660472085_4755a86e204c9706c84f_48.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-07-14\/7660472085_4755a86e204c9706c84f_original.jpg","first_name":"AWS","last_name":"Cloud","avatar_hash":"4755a86e204c","real_name":"AWS
63
+ Cloud","real_name_normalized":"AWS Cloud","team":"T04KB5WQH"},"is_bot":true,"updated":1459895941,"is_app_user":false,"presence":"away"},{"id":"U092BDCLV","team_id":"T04KB5WQH","name":"artsy","deleted":true,"profile":{"bot_id":"B092B5DDG","image_24":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_48.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_48.jpg","image_512":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_48.jpg","image_1024":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_48.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-08-13\/9080316676_7bbab49314a0429c7f7d_original.jpg","first_name":"Artsy","last_name":"Bot","title":"Searches
64
+ Artsy.","avatar_hash":"7bbab49314a0","real_name":"Artsy Bot","real_name_normalized":"Artsy
65
+ Bot","team":"T04KB5WQH"},"is_bot":true,"updated":1459895974,"is_app_user":false,"presence":"away"},{"id":"U092V4E9L","team_id":"T04KB5WQH","name":"broskoski","deleted":true,"profile":{"first_name":"Cab","avatar_hash":"g99621cbca6e","real_name":"Cab","real_name_normalized":"Cab","email":"cab@example.com","image_24":"https:\/\/secure.gravatar.com\/avatar\/99621cbca6ea94706a8f5dcdc5e8af4a.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F0180%2Fimg%2Favatars%2Fava_0017-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/99621cbca6ea94706a8f5dcdc5e8af4a.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0017-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/99621cbca6ea94706a8f5dcdc5e8af4a.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0017-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/99621cbca6ea94706a8f5dcdc5e8af4a.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0017-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/99621cbca6ea94706a8f5dcdc5e8af4a.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0017-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/99621cbca6ea94706a8f5dcdc5e8af4a.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0017-512.png","team":"T04KB5WQH"},"is_bot":false,"updated":1459895974,"is_app_user":false,"presence":"away"},{"id":"U0EA7TZJN","team_id":"T04KB5WQH","name":"bar","deleted":true,"profile":{"bot_id":"B0EA31LQM","image_24":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_24.jpg","image_32":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_32.jpg","image_48":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_48.jpg","image_72":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_72.jpg","image_192":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_192.jpg","image_512":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_512.jpg","image_1024":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_512.jpg","image_original":"https:\/\/avatars.slack-edge.com\/2015-11-11\/14346833313_f359ba59a1211d17912b_original.jpg","avatar_hash":"f359ba59a121","real_name":"","real_name_normalized":"","team":"T04KB5WQH"},"is_bot":true,"updated":1459896059,"is_app_user":false,"presence":"away"}],"cache_ts":1504042259,"response_metadata":{"next_cursor":"dXNlcjpVMEdQUjZLREo="}}'
66
+ http_version:
67
+ recorded_at: Tue, 29 Aug 2017 21:30:59 GMT
68
+ - request:
69
+ method: post
70
+ uri: https://slack.com/api/users.list
71
+ body:
72
+ encoding: UTF-8
73
+ string: cursor=dXNlcjpVMEdQUjZLREo%3D&limit=5&presence=true&token=token
74
+ headers:
75
+ Accept:
76
+ - application/json; charset=utf-8
77
+ User-Agent:
78
+ - Slack Ruby Client/0.9.2
79
+ Content-Type:
80
+ - application/x-www-form-urlencoded
81
+ Accept-Encoding:
82
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
83
+ response:
84
+ status:
85
+ code: 200
86
+ message: OK
87
+ headers:
88
+ Content-Type:
89
+ - application/json; charset=utf-8
90
+ body:
91
+ encoding: ASCII-8BIT
92
+ string: '{"ok":true,"offset":"U0HLFUZLJ","members":[{"id":"U0GPR6KDJ","team_id":"T04KB5WQH","name":"slackbotserver","deleted":false,"color":"2b6836","real_name":"slack-ruby-bot-server","tz":null,"tz_label":"Pacific
93
+ Daylight Time","tz_offset":-25200,"profile":{"first_name":"slack-ruby-bot-server","bot_id":"B0GPWQWHY","api_app_id":"A0GPRTG9Z","avatar_hash":"g36f3834829d","real_name":"slack-ruby-bot-server","real_name_normalized":"slack-ruby-bot-server","image_24":"https:\/\/secure.gravatar.com\/avatar\/36f3834829d1ec429f7d6acebccc7641.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0008-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/36f3834829d1ec429f7d6acebccc7641.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0008-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/36f3834829d1ec429f7d6acebccc7641.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0008-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/36f3834829d1ec429f7d6acebccc7641.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0008-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/36f3834829d1ec429f7d6acebccc7641.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0008-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/36f3834829d1ec429f7d6acebccc7641.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0008-512.png","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1464900685,"is_app_user":false,"presence":"away"},{"id":"U0H15MV1R","team_id":"T04KB5WQH","name":"pongbot","deleted":false,"color":"99a949","real_name":"PlayPlay.io
94
+ - Ping-Pong for Slack","tz":null,"tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"first_name":"PlayPlay.io
95
+ - Ping-Pong for Slack","bot_id":"B0H184MLZ","api_app_id":"A0H0ZJHP0","avatar_hash":"bfc0baddb5a2","image_24":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52297978466_bfc0baddb5a2d42da036_original.png","real_name":"PlayPlay.io
96
+ - Ping-Pong for Slack","real_name_normalized":"PlayPlay.io - Ping-Pong for
97
+ Slack","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1466351075,"is_app_user":false,"presence":"active"},{"id":"U0H701CJZ","team_id":"T04KB5WQH","name":"chessbot","deleted":false,"color":"df3dc0","real_name":"PlayPlay.io
98
+ - Chess for Slack","tz":null,"tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"first_name":"PlayPlay.io
99
+ - Chess for Slack","bot_id":"B0H74MK3J","api_app_id":"A0H70N5C3","avatar_hash":"8f99e84480d6","image_24":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52298008610_8f99e84480d6baed1771_original.png","real_name":"PlayPlay.io
100
+ - Chess for Slack","real_name_normalized":"PlayPlay.io - Chess for Slack","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1466351099,"is_app_user":false,"presence":"away"},{"id":"U0HC7MSEA","team_id":"T04KB5WQH","name":"poolbot","deleted":false,"color":"4cc091","real_name":"PlayPlay.io
101
+ - Billiards for Slack","tz":null,"tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"first_name":"PlayPlay.io
102
+ - Billiards for Slack","bot_id":"B0HC7D1SN","api_app_id":"A0HC74EET","avatar_hash":"c95d3eeede11","image_24":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52283120304_c95d3eeede11f766a974_original.png","real_name":"PlayPlay.io
103
+ - Billiards for Slack","real_name_normalized":"PlayPlay.io - Billiards for
104
+ Slack","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1466351115,"is_app_user":false,"presence":"away"},{"id":"U0HF43KT7","team_id":"T04KB5WQH","name":"tictactoe","deleted":false,"color":"9b3b45","real_name":"PlayPlay.io
105
+ - Tic-Tac-Toe for Slack","tz":null,"tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"first_name":"PlayPlay.io
106
+ - Tic-Tac-Toe for Slack","bot_id":"B0HF56491","api_app_id":"A0HF3E0AH","avatar_hash":"4a2b920dbea1","image_24":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-06-19\/52238814435_4a2b920dbea1335fd188_original.png","real_name":"PlayPlay.io
107
+ - Tic-Tac-Toe for Slack","real_name_normalized":"PlayPlay.io - Tic-Tac-Toe
108
+ for Slack","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1466351125,"is_app_user":false,"presence":"away"}],"cache_ts":1504042259,"response_metadata":{"next_cursor":"dXNlcjpVMEhMRlVaTEo="}}'
109
+ http_version:
110
+ recorded_at: Tue, 29 Aug 2017 21:30:59 GMT
111
+ - request:
112
+ method: post
113
+ uri: https://slack.com/api/users.list
114
+ body:
115
+ encoding: UTF-8
116
+ string: cursor=dXNlcjpVMEhMRlVaTEo%3D&limit=5&presence=true&token=token
117
+ headers:
118
+ Accept:
119
+ - application/json; charset=utf-8
120
+ User-Agent:
121
+ - Slack Ruby Client/0.9.2
122
+ Content-Type:
123
+ - application/x-www-form-urlencoded
124
+ Accept-Encoding:
125
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
126
+ response:
127
+ status:
128
+ code: 200
129
+ message: OK
130
+ headers:
131
+ Content-Type:
132
+ - application/json; charset=utf-8
133
+ body:
134
+ encoding: ASCII-8BIT
135
+ string: '{"ok":true,"offset":"U0S0G028K","members":[{"id":"U0HLFUZLJ","team_id":"T04KB5WQH","name":"player1","deleted":false,"color":"d58247","real_name":"Player
136
+ 1","tz":"America\/Indiana\/Indianapolis","tz_label":"Eastern Daylight Time","tz_offset":-14400,"profile":{"first_name":"Player","last_name":"1","avatar_hash":"gcde4e113736","real_name":"Player
137
+ 1","real_name_normalized":"Player 1","email":"dblock+example.com.org","image_24":"https:\/\/secure.gravatar.com\/avatar\/cde4e1137364cf971f15160113b04e86.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0009-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/cde4e1137364cf971f15160113b04e86.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0009-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/cde4e1137364cf971f15160113b04e86.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0009-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/cde4e1137364cf971f15160113b04e86.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0009-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/cde4e1137364cf971f15160113b04e86.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0009-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/cde4e1137364cf971f15160113b04e86.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0009-512.png","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"updated":1451916406,"is_app_user":false,"presence":"away"},{"id":"U0HPMN0GY","team_id":"T04KB5WQH","name":"slak","deleted":true,"profile":{"first_name":"API
138
+ Explorer","bot_id":"B0HPLG4M7","api_app_id":"A0HP7340N","avatar_hash":"36be3c0d4513","image_24":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-01-21\/19073458786_36be3c0d451350c9f03b_original.png","real_name":"API
139
+ Explorer","real_name_normalized":"API Explorer","team":"T04KB5WQH"},"is_bot":true,"updated":1453387970,"is_app_user":false,"presence":"away"},{"id":"U0J1GAHN1","team_id":"T04KB5WQH","name":"travis-ci","deleted":false,"color":"5a4592","real_name":"","tz":null,"tz_label":"Pacific
140
+ Daylight Time","tz_offset":-25200,"profile":{"bot_id":"B0J1L75DY","api_app_id":"","avatar_hash":"dd0191970c25","image_24":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-01-08\/18054871664_dd0191970c25e54ef23f_original.png","title":"Used
141
+ for Travis-CI integration tests on https:\/\/github.com\/dblock\/slack-ruby-client.","real_name":"","real_name_normalized":"","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1452271052,"is_app_user":false,"presence":"away"},{"id":"U0LAVPSLF","team_id":"T04KB5WQH","name":"market","deleted":false,"color":"db3150","real_name":"Market","tz":null,"tz_label":"Pacific
142
+ Daylight Time","tz_offset":-25200,"profile":{"bot_id":"B0LAPCFT6","api_app_id":"A0LAU0998","first_name":"Market","avatar_hash":"522645c5607a","image_24":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_24.png","image_32":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_32.png","image_48":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_48.png","image_72":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_72.png","image_192":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_192.png","image_512":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_512.png","image_1024":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_512.png","image_original":"https:\/\/avatars.slack-edge.com\/2016-06-12\/50217631700_522645c5607acc032c6f_original.png","real_name":"Market","real_name_normalized":"Market","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1465761630,"is_app_user":false,"presence":"active"},{"id":"U0RU32XGB","team_id":"T04KB5WQH","name":"demo_app","deleted":true,"profile":{"bot_id":"B0S04SHFX","api_app_id":"A0S05U5H7","first_name":"Demo
143
+ App","avatar_hash":"g470eaf566ca","real_name":"Demo App","real_name_normalized":"Demo
144
+ App","image_24":"https:\/\/secure.gravatar.com\/avatar\/470eaf566ca842e4c7a2a6113aaabeff.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/470eaf566ca842e4c7a2a6113aaabeff.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/470eaf566ca842e4c7a2a6113aaabeff.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/470eaf566ca842e4c7a2a6113aaabeff.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/470eaf566ca842e4c7a2a6113aaabeff.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0006-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/470eaf566ca842e4c7a2a6113aaabeff.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0006-512.png","team":"T04KB5WQH"},"is_bot":true,"updated":1457642340,"is_app_user":false,"presence":"away"}],"cache_ts":1504042259,"response_metadata":{"next_cursor":"dXNlcjpVMFMwRzAyOEs="}}'
145
+ http_version:
146
+ recorded_at: Tue, 29 Aug 2017 21:30:59 GMT
147
+ - request:
148
+ method: post
149
+ uri: https://slack.com/api/users.list
150
+ body:
151
+ encoding: UTF-8
152
+ string: cursor=dXNlcjpVMFMwRzAyOEs%3D&limit=5&presence=true&token=token
153
+ headers:
154
+ Accept:
155
+ - application/json; charset=utf-8
156
+ User-Agent:
157
+ - Slack Ruby Client/0.9.2
158
+ Content-Type:
159
+ - application/x-www-form-urlencoded
160
+ Accept-Encoding:
161
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
162
+ response:
163
+ status:
164
+ code: 200
165
+ message: OK
166
+ headers:
167
+ Content-Type:
168
+ - application/json; charset=utf-8
169
+ body:
170
+ encoding: ASCII-8BIT
171
+ string: '{"ok":true,"members":[{"id":"U0S0G028K","team_id":"T04KB5WQH","name":"demofoo","deleted":true,"profile":{"bot_id":"B0S21UP2L","api_app_id":"A0S212AD7","first_name":"Demo
172
+ App","avatar_hash":"g7ff909dc801","real_name":"Demo App","real_name_normalized":"Demo
173
+ App","image_24":"https:\/\/secure.gravatar.com\/avatar\/7ff909dc801e9b78da70deb57d6a9548.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0023-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/7ff909dc801e9b78da70deb57d6a9548.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0023-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/7ff909dc801e9b78da70deb57d6a9548.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0023-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/7ff909dc801e9b78da70deb57d6a9548.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F3654%2Fimg%2Favatars%2Fava_0023-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/7ff909dc801e9b78da70deb57d6a9548.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0023-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/7ff909dc801e9b78da70deb57d6a9548.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0023-512.png","team":"T04KB5WQH"},"is_bot":true,"updated":1457698194,"is_app_user":false,"presence":"away"},{"id":"U6HMJSC01","team_id":"T04KB5WQH","name":"test_app","deleted":false,"color":"53b759","real_name":"Test
174
+ App","tz":null,"tz_label":"Pacific Daylight Time","tz_offset":-25200,"profile":{"bot_id":"B6KAQDLCF","api_app_id":"A19GAJ72T","always_active":false,"first_name":"Test
175
+ App","avatar_hash":"g620010e14ef","real_name":"Test App","real_name_normalized":"Test
176
+ App","image_24":"https:\/\/secure.gravatar.com\/avatar\/620010e14ef438a65db182bd767da3bc.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/620010e14ef438a65db182bd767da3bc.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/620010e14ef438a65db182bd767da3bc.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/620010e14ef438a65db182bd767da3bc.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0006-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/620010e14ef438a65db182bd767da3bc.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0006-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/620010e14ef438a65db182bd767da3bc.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0006-512.png","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":true,"updated":1503251742,"is_app_user":false,"presence":"away"},{"id":"U6QNX3JR5","team_id":"T04KB5WQH","name":"dblockplayplay","deleted":false,"color":"c386df","real_name":"Daniel
177
+ Play","tz":"America\/New_York","tz_label":"Eastern Daylight Time","tz_offset":-14400,"profile":{"first_name":"Daniel","last_name":"Play","avatar_hash":"gedc34867051","title":"","real_name":"Daniel
178
+ Play","real_name_normalized":"Daniel Play","email":"dblock+example.com.org","image_24":"https:\/\/secure.gravatar.com\/avatar\/edc348670516c40654a171bdc09709b1.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F0180%2Fimg%2Favatars%2Fava_0003-24.png","image_32":"https:\/\/secure.gravatar.com\/avatar\/edc348670516c40654a171bdc09709b1.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0003-32.png","image_48":"https:\/\/secure.gravatar.com\/avatar\/edc348670516c40654a171bdc09709b1.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0003-48.png","image_72":"https:\/\/secure.gravatar.com\/avatar\/edc348670516c40654a171bdc09709b1.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0003-72.png","image_192":"https:\/\/secure.gravatar.com\/avatar\/edc348670516c40654a171bdc09709b1.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0003-192.png","image_512":"https:\/\/secure.gravatar.com\/avatar\/edc348670516c40654a171bdc09709b1.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0003-512.png","team":"T04KB5WQH"},"is_admin":false,"is_owner":false,"is_primary_owner":false,"is_restricted":false,"is_ultra_restricted":false,"is_bot":false,"updated":1502923687,"is_app_user":false,"presence":"away"}],"cache_ts":1504042260,"response_metadata":{"next_cursor":""}}'
179
+ http_version:
180
+ recorded_at: Tue, 29 Aug 2017 21:31:00 GMT
181
+ recorded_with: VCR 3.0.3
@@ -53,7 +53,7 @@ RSpec.describe Slack::RealTime::Client do
53
53
  allow(socket).to receive(:start_sync)
54
54
  client.start!
55
55
  end
56
- context 'properties provided upon connection' do
56
+ describe 'properties provided upon connection' do
57
57
  it 'sets url' do
58
58
  expect(client.url).to eq url
59
59
  end
@@ -117,7 +117,6 @@ RSpec.describe Slack::RealTime::Client do
117
117
  end
118
118
  end
119
119
  context 'subclassed' do
120
- let(:client) { Class.new(Slack::RealTime::Client).new(store_class: Slack::RealTime::Stores::Store) }
121
120
  it 'runs event handlers' do
122
121
  event = Slack::RealTime::Event.new(
123
122
  'type' => 'team_rename',
@@ -129,8 +128,8 @@ RSpec.describe Slack::RealTime::Client do
129
128
  end
130
129
  end
131
130
  end
132
- context 'client with a default store', vcr: { cassette_name: 'web/rtm_connect' } do
133
- let(:client) { Slack::RealTime::Client.new }
131
+ context 'client with starter store', vcr: { cassette_name: 'web/rtm_connect' } do
132
+ let(:client) { Slack::RealTime::Client.new(store_class: Slack::RealTime::Stores::Starter) }
134
133
  let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
135
134
  describe '#start!' do
136
135
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
@@ -140,35 +139,33 @@ RSpec.describe Slack::RealTime::Client do
140
139
  allow(socket).to receive(:start_sync)
141
140
  client.start!
142
141
  end
143
- context 'properties provided upon connection' do
142
+ describe 'properties provided upon connection' do
144
143
  it 'sets url' do
145
144
  expect(client.url).to eq url
146
145
  end
147
146
  it 'sets team' do
148
147
  expect(client.team.domain).to eq 'dblockdotorg'
149
148
  end
150
- it 'sets teams' do
151
- expect(client.teams.count).to eq 1
152
- expect(client.teams.values.first).to eq client.team
153
- end
154
149
  it 'sets self' do
155
150
  expect(client.self.id).to eq 'U07518DTL'
156
151
  end
157
- it 'sets user' do
158
- expect(client.users.count).to eq 1
159
- expect(client.users.values.first['id']).to eq 'U07518DTL'
152
+ it 'no users' do
153
+ expect(client.users).to be_nil
154
+ end
155
+ it 'no teams' do
156
+ expect(client.teams).to be_nil
160
157
  end
161
158
  it 'no channels' do
162
- expect(client.channels.count).to eq 0
159
+ expect(client.channels).to be_nil
163
160
  end
164
161
  it 'no ims' do
165
- expect(client.ims.count).to eq 0
162
+ expect(client.ims).to be_nil
166
163
  end
167
164
  it 'no bots' do
168
- expect(client.bots.count).to eq 0
165
+ expect(client.bots).to be_nil
169
166
  end
170
167
  it 'no groups' do
171
- expect(client.groups.count).to eq 0
168
+ expect(client.groups).to be_nil
172
169
  end
173
170
  end
174
171
  it 'uses web client to fetch url' do
@@ -200,46 +197,47 @@ RSpec.describe Slack::RealTime::Client do
200
197
  expect(client.send(:next_id)).to eq previous_id + 1
201
198
  end
202
199
  end
203
- context 'store_class: nil' do
204
- let(:client) { Slack::RealTime::Client.new(store_class: nil) }
205
- it 'sets store to nil' do
206
- expect(client.store).to be nil
207
- end
208
- it "doesn't handle events" do
209
- event = Slack::RealTime::Event.new(
210
- 'type' => 'team_rename',
211
- 'name' => 'New Team Name Inc.'
212
- )
213
- expect(client).to_not receive(:run_handlers)
214
- client.send(:dispatch, event)
215
- end
216
- it 'self' do
217
- expect(client.self).to be nil
218
- end
219
- it 'team' do
220
- expect(client.team).to be nil
221
- end
222
- end
223
200
  end
224
- context 'with defaults' do
225
- let(:client) { Slack::RealTime::Client.new }
226
- describe '#initialize' do
227
- it 'sets ping' do
228
- expect(client.websocket_ping).to eq 30
229
- end
230
- it "doesn't set proxy" do
231
- expect(client.websocket_proxy).to be nil
232
- end
233
- it 'defaults logger' do
234
- expect(client.send(:logger)).to be_a ::Logger
235
- end
236
- it 'sets default store_class' do
237
- expect(client.send(:store_class)).to eq Slack::RealTime::Store
238
- end
239
- (Slack::RealTime::Config::ATTRIBUTES - [:logger, :store_class]).each do |key|
240
- it "sets #{key}" do
241
- expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
242
- end
201
+ end
202
+ context 'client with nil store', vcr: { cassette_name: 'web/rtm_connect' } do
203
+ let(:client) { Slack::RealTime::Client.new(store_class: nil) }
204
+ let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
205
+ it 'sets store to nil' do
206
+ expect(client.store).to be nil
207
+ end
208
+ it "doesn't handle events" do
209
+ event = Slack::RealTime::Event.new(
210
+ 'type' => 'team_rename',
211
+ 'name' => 'New Team Name Inc.'
212
+ )
213
+ expect(client).to_not receive(:run_handlers)
214
+ client.send(:dispatch, event)
215
+ end
216
+ it 'self' do
217
+ expect(client.self).to be nil
218
+ end
219
+ it 'team' do
220
+ expect(client.team).to be nil
221
+ end
222
+ end
223
+ context 'client with defaults' do
224
+ let(:client) { Slack::RealTime::Client.new }
225
+ describe '#initialize' do
226
+ it 'sets ping' do
227
+ expect(client.websocket_ping).to eq 30
228
+ end
229
+ it "doesn't set proxy" do
230
+ expect(client.websocket_proxy).to be nil
231
+ end
232
+ it 'defaults logger' do
233
+ expect(client.send(:logger)).to be_a ::Logger
234
+ end
235
+ it 'sets default store_class' do
236
+ expect(client.send(:store_class)).to eq Slack::RealTime::Store
237
+ end
238
+ (Slack::RealTime::Config::ATTRIBUTES - [:logger, :store_class]).each do |key|
239
+ it "sets #{key}" do
240
+ expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
243
241
  end
244
242
  end
245
243
  end
@@ -261,7 +259,7 @@ RSpec.describe Slack::RealTime::Client do
261
259
  after do
262
260
  Slack::RealTime::Client.config.reset
263
261
  end
264
- let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
262
+ let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' }
265
263
  let(:client) { Slack::RealTime::Client.new }
266
264
  context 'ping' do
267
265
  before do
@@ -273,7 +271,7 @@ RSpec.describe Slack::RealTime::Client do
273
271
  it 'sets ping' do
274
272
  expect(client.websocket_ping).to eq 15
275
273
  end
276
- it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_connect' } do
274
+ it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_start' } do
277
275
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(url, nil, ping: 15).and_return(ws)
278
276
  client.start!
279
277
  end
@@ -298,7 +296,7 @@ RSpec.describe Slack::RealTime::Client do
298
296
  headers: { 'User-Agent' => 'ruby' }
299
297
  )
300
298
  end
301
- it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_connect' } do
299
+ it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_start' } do
302
300
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
303
301
  url,
304
302
  nil,
@@ -328,8 +326,8 @@ RSpec.describe Slack::RealTime::Client do
328
326
  allow(socket).to receive(:connect!)
329
327
  allow(socket).to receive(:start_sync)
330
328
  end
331
- it 'calls rtm_start with start options', vcr: { cassette_name: 'web/rtm_connect' } do
332
- expect(client.web_client).to receive(:rtm_connect).with(simple_latest: true).and_call_original
329
+ it 'calls rtm_start with start options', vcr: { cassette_name: 'web/rtm_start' } do
330
+ expect(client.web_client).to receive(:rtm_start).with(simple_latest: true).and_call_original
333
331
  client.start!
334
332
  end
335
333
  end
@@ -415,8 +413,8 @@ RSpec.describe Slack::RealTime::Client do
415
413
  allow(socket).to receive(:connect!)
416
414
  allow(socket).to receive(:start_sync)
417
415
  end
418
- it 'defaults to :rtm_connect', vcr: { cassette_name: 'web/rtm_connect' } do
419
- expect(client.web_client).to receive(:rtm_connect).and_call_original
416
+ it 'defaults to :rtm_start when using full store', vcr: { cassette_name: 'web/rtm_start' } do
417
+ expect(client.web_client).to receive(:rtm_start).and_call_original
420
418
  client.start!
421
419
  end
422
420
  end