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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +16 -11
- data/CHANGELOG.md +11 -0
- data/README.md +40 -12
- data/UPGRADING.md +1 -1
- data/bin/commands.rb +1 -0
- data/bin/commands/channels.rb +3 -0
- data/bin/commands/conversations.rb +178 -0
- data/bin/commands/groups.rb +1 -9
- data/bin/commands/im.rb +3 -0
- data/bin/commands/rtm.rb +1 -0
- data/bin/commands/users.rb +3 -1
- data/lib/slack-ruby-client.rb +6 -0
- data/lib/slack/real_time/client.rb +1 -1
- data/lib/slack/real_time/concurrency/celluloid.rb +1 -1
- data/lib/slack/version.rb +1 -1
- data/lib/slack/web/api/endpoints.rb +2 -0
- data/lib/slack/web/api/endpoints/channels.rb +13 -1
- data/lib/slack/web/api/endpoints/conversations.rb +301 -0
- data/lib/slack/web/api/endpoints/groups.rb +2 -13
- data/lib/slack/web/api/endpoints/im.rb +13 -1
- data/lib/slack/web/api/endpoints/rtm.rb +2 -0
- data/lib/slack/web/api/endpoints/users.rb +11 -1
- data/lib/slack/web/api/templates/command.erb +2 -2
- data/lib/slack/web/api/templates/method.erb +10 -0
- data/lib/slack/web/config.rb +7 -3
- data/lib/slack/web/faraday/connection.rb +1 -1
- data/lib/slack/web/pagination/cursor.rb +48 -0
- data/spec/fixtures/slack/web/paginated_users_list.yml +181 -0
- data/spec/slack/real_time/client_spec.rb +60 -62
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +41 -31
- data/spec/slack/web/api/endpoints/conversations_spec.rb +100 -0
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -0
- data/spec/slack/web/api/pagination/cursor_spec.rb +70 -0
- 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
|
-
|
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
|
data/lib/slack/web/config.rb
CHANGED
@@ -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 =
|
24
|
-
self.ca_file =
|
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
|
-
|
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
|
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
|
-
|
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 '
|
158
|
-
expect(client.users
|
159
|
-
|
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
|
159
|
+
expect(client.channels).to be_nil
|
163
160
|
end
|
164
161
|
it 'no ims' do
|
165
|
-
expect(client.ims
|
162
|
+
expect(client.ims).to be_nil
|
166
163
|
end
|
167
164
|
it 'no bots' do
|
168
|
-
expect(client.bots
|
165
|
+
expect(client.bots).to be_nil
|
169
166
|
end
|
170
167
|
it 'no groups' do
|
171
|
-
expect(client.groups
|
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
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
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://
|
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/
|
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/
|
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/
|
332
|
-
expect(client.web_client).to receive(:
|
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 :
|
419
|
-
expect(client.web_client).to receive(:
|
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
|