slack-ruby-client 0.14.6 → 1.0.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/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +15 -3
- data/.rubocop_todo.yml +110 -38
- data/.travis.yml +2 -5
- data/CHANGELOG.md +42 -0
- data/CONTRIBUTING.md +19 -8
- data/Dangerfile +1 -1
- data/Gemfile +1 -2
- data/LICENSE.md +1 -1
- data/README.md +38 -36
- data/RELEASING.md +1 -1
- data/UPGRADING.md +62 -2
- data/bin/commands/admin_analytics.rb +16 -0
- data/bin/commands/admin_apps.rb +26 -2
- data/bin/commands/admin_apps_requests.rb +1 -0
- data/bin/commands/admin_auth_policy.rb +39 -0
- data/bin/commands/admin_barriers.rb +47 -0
- data/bin/commands/admin_conversations.rb +155 -3
- data/bin/commands/admin_conversations_ekm.rb +17 -0
- data/bin/commands/admin_conversations_restrictAccess.rb +37 -0
- data/bin/commands/admin_conversations_whitelist.rb +37 -0
- data/bin/commands/admin_emoji.rb +1 -1
- data/bin/commands/admin_teams.rb +1 -1
- data/bin/commands/admin_usergroups.rb +48 -0
- data/bin/commands/admin_users.rb +3 -2
- data/bin/commands/admin_users_session.rb +62 -0
- data/bin/commands/api.rb +0 -1
- data/bin/commands/apps_connections.rb +13 -0
- data/bin/commands/apps_event_authorizations.rb +16 -0
- data/bin/commands/apps_manifest.rb +51 -0
- data/bin/commands/auth_teams.rb +16 -0
- data/bin/commands/bots.rb +1 -0
- data/bin/commands/calls.rb +52 -0
- data/bin/commands/calls_participants.rb +25 -0
- data/bin/commands/channels.rb +1 -155
- data/bin/commands/chat.rb +17 -12
- data/bin/commands/chat_scheduledMessages.rb +1 -0
- data/bin/commands/conversations.rb +71 -3
- data/bin/commands/dnd.rb +2 -0
- data/bin/commands/files.rb +6 -4
- data/bin/commands/files_remote.rb +2 -2
- data/bin/commands/groups.rb +1 -162
- data/bin/commands/im.rb +1 -63
- data/bin/commands/migration.rb +1 -0
- data/bin/commands/mpim.rb +1 -61
- data/bin/commands/oauth.rb +0 -13
- data/bin/commands/oauth_v2.rb +13 -1
- data/bin/commands/openid_connect.rb +27 -0
- data/bin/commands/pins.rb +2 -4
- data/bin/commands/reactions.rb +1 -0
- data/bin/commands/reminders.rb +6 -0
- data/bin/commands/rtm.rb +2 -2
- data/bin/commands/search.rb +4 -0
- data/bin/commands/stars.rb +7 -6
- data/bin/commands/team.rb +3 -0
- data/bin/commands/team_billing.rb +13 -0
- data/bin/commands/team_preferences.rb +13 -0
- data/bin/commands/tooling_tokens.rb +14 -0
- data/bin/commands/usergroups.rb +5 -0
- data/bin/commands/usergroups_users.rb +2 -0
- data/bin/commands/users.rb +4 -2
- data/bin/commands/users_profile.rb +5 -5
- data/bin/commands/views.rb +2 -2
- data/bin/commands/workflows.rb +38 -0
- data/bin/commands.rb +17 -8
- data/lib/slack/config.rb +1 -2
- data/lib/slack/events/request.rb +10 -4
- data/lib/slack/messages/message.rb +0 -4
- data/lib/slack/real_time/client.rb +6 -6
- data/lib/slack/real_time/concurrency/async.rb +7 -11
- data/lib/slack/real_time/concurrency.rb +0 -2
- data/lib/slack/real_time/config.rb +5 -14
- data/lib/slack/real_time/models/base.rb +0 -4
- data/lib/slack/real_time/socket.rb +3 -4
- data/lib/slack/real_time/stores/base.rb +4 -7
- data/lib/slack/real_time/stores/starter.rb +6 -3
- data/lib/slack/real_time/stores/store.rb +5 -0
- data/lib/slack/version.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
- data/lib/slack/web/api/endpoints/admin_apps.rb +42 -6
- data/lib/slack/web/api/endpoints/admin_apps_approved.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +4 -2
- data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_auth_policy.rb +72 -0
- data/lib/slack/web/api/endpoints/admin_barriers.rb +82 -0
- data/lib/slack/web/api/endpoints/admin_conversations.rb +234 -4
- data/lib/slack/web/api/endpoints/admin_conversations_ekm.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +61 -0
- data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +64 -0
- data/lib/slack/web/api/endpoints/admin_emoji.rb +10 -10
- data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +3 -3
- data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_teams_admins.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams_owners.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams_settings.rb +5 -5
- data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
- data/lib/slack/web/api/endpoints/admin_users.rb +23 -23
- data/lib/slack/web/api/endpoints/admin_users_session.rb +97 -3
- data/lib/slack/web/api/endpoints/api.rb +1 -3
- data/lib/slack/web/api/endpoints/apps.rb +2 -2
- data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
- data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
- data/lib/slack/web/api/endpoints/apps_manifest.rb +75 -0
- data/lib/slack/web/api/endpoints/auth.rb +1 -1
- data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
- data/lib/slack/web/api/endpoints/bots.rb +3 -1
- data/lib/slack/web/api/endpoints/calls.rb +83 -0
- data/lib/slack/web/api/endpoints/calls_participants.rb +42 -0
- data/lib/slack/web/api/endpoints/channels.rb +1 -245
- data/lib/slack/web/api/endpoints/chat.rb +76 -66
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +5 -3
- data/lib/slack/web/api/endpoints/conversations.rb +149 -41
- data/lib/slack/web/api/endpoints/dialog.rb +2 -2
- data/lib/slack/web/api/endpoints/dnd.rb +6 -3
- data/lib/slack/web/api/endpoints/files.rb +21 -17
- data/lib/slack/web/api/endpoints/files_comments.rb +1 -1
- data/lib/slack/web/api/endpoints/files_remote.rb +23 -23
- data/lib/slack/web/api/endpoints/groups.rb +0 -253
- data/lib/slack/web/api/endpoints/im.rb +0 -101
- data/lib/slack/web/api/endpoints/migration.rb +4 -2
- data/lib/slack/web/api/endpoints/mpim.rb +0 -96
- data/lib/slack/web/api/endpoints/oauth.rb +5 -30
- data/lib/slack/web/api/endpoints/oauth_v2.rb +24 -6
- data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
- data/lib/slack/web/api/endpoints/pins.rb +7 -12
- data/lib/slack/web/api/endpoints/reactions.rb +16 -14
- data/lib/slack/web/api/endpoints/reminders.rb +17 -5
- data/lib/slack/web/api/endpoints/rtm.rb +10 -10
- data/lib/slack/web/api/endpoints/search.rb +27 -13
- data/lib/slack/web/api/endpoints/stars.rb +13 -11
- data/lib/slack/web/api/endpoints/team.rb +11 -5
- data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
- data/lib/slack/web/api/endpoints/team_preferences.rb +21 -0
- data/lib/slack/web/api/endpoints/team_profile.rb +1 -1
- data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
- data/lib/slack/web/api/endpoints/usergroups.rb +26 -16
- data/lib/slack/web/api/endpoints/usergroups_users.rb +9 -5
- data/lib/slack/web/api/endpoints/users.rb +20 -18
- data/lib/slack/web/api/endpoints/users_profile.rb +7 -7
- data/lib/slack/web/api/endpoints/views.rb +13 -13
- data/lib/slack/web/api/endpoints/workflows.rb +61 -0
- data/lib/slack/web/api/endpoints.rb +35 -18
- data/lib/slack/web/api/errors/server_error.rb +37 -0
- data/lib/slack/web/api/errors/too_many_requests_error.rb +1 -4
- data/lib/slack/web/api/errors.rb +486 -12
- data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +3 -5
- data/lib/slack/web/api/mixins/ids.id.rb +3 -5
- data/lib/slack/web/api/mixins/users.id.rb +1 -3
- data/lib/slack/web/api/mixins.rb +1 -2
- data/lib/slack/web/api/patches/{chat.6.block-kit-support.patch → chat.1.patch} +25 -24
- data/lib/slack/web/api/templates/endpoints.erb +1 -2
- data/lib/slack/web/api/templates/method.erb +4 -1
- data/lib/slack/web/api/templates/method_spec.erb +1 -1
- data/lib/slack/web/config.rb +2 -0
- data/lib/slack/web/faraday/connection.rb +23 -20
- data/lib/slack/web/faraday/request.rb +2 -1
- data/lib/slack/web/faraday/response/raise_error.rb +12 -1
- data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
- data/lib/slack/web/pagination/cursor.rb +3 -7
- data/lib/slack-ruby-client.rb +4 -4
- data/lib/tasks/web.rake +11 -3
- data/slack-ruby-client.gemspec +6 -7
- data/spec/fixtures/slack/web/429_error.yml +50 -54
- data/spec/fixtures/slack/web/auth_test_error.yml +51 -18
- data/spec/fixtures/slack/web/auth_test_success.yml +50 -26
- data/spec/fixtures/slack/web/conversations_info.yml +167 -0
- data/spec/fixtures/slack/web/conversations_setTopic.yml +84 -0
- data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +172 -0
- data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +253 -0
- data/spec/fixtures/slack/web/paginated_users_list.yml +501 -69
- data/spec/fixtures/slack/web/rtm_connect.yml +267 -30
- data/spec/fixtures/slack/web/rtm_start.yml +771 -60
- data/spec/fixtures/slack/web/users_info.yml +153 -69
- data/spec/fixtures/slack/web/users_list.yml +102 -41
- data/spec/fixtures/slack/web/views_open_error.yml +49 -42
- data/spec/slack/events/request_spec.rb +13 -8
- data/spec/slack/real_time/client_spec.rb +35 -22
- data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +10 -0
- data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +10 -0
- data/spec/slack/real_time/event_handlers/bot_spec.rb +1 -1
- data/spec/slack/real_time/event_handlers/channel_spec.rb +1 -1
- data/spec/slack/real_time/event_handlers/im_spec.rb +5 -5
- data/spec/slack/real_time/event_handlers/user_spec.rb +2 -2
- data/spec/slack/real_time/rtm_connect_spec.rb +1 -1
- data/spec/slack/real_time/rtm_start_spec.rb +1 -1
- data/spec/slack/slack_spec.rb +3 -1
- data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_apps_spec.rb +10 -0
- data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +35 -0
- data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +38 -0
- data/spec/slack/web/api/endpoints/{apps_permissions_scopes_spec.rb → admin_conversations_ekm_spec.rb} +1 -1
- data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
- data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +85 -0
- data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +6 -6
- data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +10 -10
- data/spec/slack/web/api/endpoints/admin_teams_spec.rb +2 -2
- data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
- data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +28 -0
- data/spec/slack/web/api/endpoints/admin_users_spec.rb +15 -23
- data/spec/slack/web/api/endpoints/{apps_permissions_resources_spec.rb → apps_connections_spec.rb} +1 -1
- data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +36 -0
- data/spec/slack/web/api/endpoints/apps_spec.rb +2 -2
- data/spec/slack/web/api/endpoints/auth_teams_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/calls_participants_spec.rb +24 -0
- data/spec/slack/web/api/endpoints/calls_spec.rb +31 -0
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +4 -6
- data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +2 -2
- data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -5
- data/spec/slack/web/api/endpoints/files_comments_spec.rb +2 -2
- data/spec/slack/web/api/endpoints/files_remote_spec.rb +3 -3
- data/spec/slack/web/api/endpoints/files_spec.rb +4 -4
- data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -22
- data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +6 -3
- data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/pins_spec.rb +1 -4
- data/spec/slack/web/api/endpoints/reactions_spec.rb +3 -3
- data/spec/slack/web/api/endpoints/reminders_spec.rb +2 -2
- data/spec/slack/web/api/endpoints/team_billing_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +2 -2
- data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
- data/spec/slack/web/api/error_spec.rb +5 -7
- data/spec/slack/web/api/errors/slack_error_spec.rb +21 -26
- data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
- data/spec/slack/web/api/mixins/{channels_spec.rb → conversations_spec.rb} +8 -8
- data/spec/slack/web/api/mixins/users_spec.rb +1 -1
- data/spec/slack/web/api/pagination/cursor_spec.rb +1 -3
- data/spec/slack/web/client_spec.rb +123 -1
- data/spec/slack/web/faraday/request_spec.rb +80 -0
- data/spec/slack/web/faraday/response/raise_error_spec.rb +8 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/real_time/connected_client.rb +1 -7
- data/spec/support/vcr.rb +36 -1
- metadata +95 -173
- data/examples/hi_real_time/Gemfile +0 -6
- data/examples/hi_real_time/hi.gif +0 -0
- data/examples/hi_real_time/hi.rb +0 -41
- data/examples/hi_real_time_async_celluloid/Gemfile +0 -7
- data/examples/hi_real_time_async_celluloid/Procfile +0 -2
- data/examples/hi_real_time_async_celluloid/hi.rb +0 -39
- data/examples/hi_real_time_async_eventmachine/Gemfile +0 -7
- data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
- data/examples/hi_real_time_async_eventmachine/hi.rb +0 -39
- data/lib/slack/real_time/concurrency/celluloid.rb +0 -142
- data/lib/slack/real_time/concurrency/eventmachine.rb +0 -85
- data/lib/slack/web/api/mixins/channels.id.json +0 -20
- data/lib/slack/web/api/mixins/groups.id.json +0 -20
- data/lib/slack/web/api/mixins/groups.id.rb +0 -27
- data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +0 -13
- data/lib/slack/web/api/patches/chat.2.attachments-json.patch +0 -17
- data/lib/slack/web/api/patches/chat.3.update-attachments-support.patch +0 -21
- data/lib/slack/web/api/patches/chat.4.postEphemeral-attachments-support.patch +0 -17
- data/lib/slack/web/api/patches/chat.5.postEphemeral-text-or-attachments.patch +0 -15
- data/spec/fixtures/slack/web/503_error.yml +0 -14
- data/spec/fixtures/slack/web/channels_info.yml +0 -46
- data/spec/fixtures/slack/web/groups_info.yml +0 -43
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -116
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -57
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -16
- data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -19
- data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -101
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -13
- data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -13
- data/spec/slack/web/api/endpoints/im_spec.rb +0 -39
- data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -39
- data/spec/slack/web/api/endpoints/views_spec.rb +0 -29
- data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -17
- data/spec/slack/web/api/mixins/groups_spec.rb +0 -43
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'slack-ruby-client'
|
|
3
|
-
|
|
4
|
-
raise 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
|
|
5
|
-
|
|
6
|
-
$stdout.sync = true
|
|
7
|
-
logger = Logger.new($stdout)
|
|
8
|
-
logger.level = Logger::DEBUG
|
|
9
|
-
threads = []
|
|
10
|
-
|
|
11
|
-
ENV['SLACK_API_TOKENS'].split.each do |token|
|
|
12
|
-
logger.info "Starting #{token[0..12]} ..."
|
|
13
|
-
|
|
14
|
-
client = Slack::RealTime::Client.new(token: token)
|
|
15
|
-
|
|
16
|
-
client.on :hello do
|
|
17
|
-
logger.info(
|
|
18
|
-
"Successfully connected, welcome '#{client.self.name}' to " \
|
|
19
|
-
"the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
|
20
|
-
)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
client.on :message do |data|
|
|
24
|
-
logger.info data
|
|
25
|
-
|
|
26
|
-
client.typing channel: data.channel
|
|
27
|
-
|
|
28
|
-
case data.text
|
|
29
|
-
when 'bot hi'
|
|
30
|
-
client.message channel: data.channel, text: "Hi <@#{data.user}>!"
|
|
31
|
-
when /^bot/
|
|
32
|
-
client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
threads << client.start_async
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
threads.each(&:join)
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'slack-ruby-client'
|
|
3
|
-
|
|
4
|
-
raise 'Missing ENV[SLACK_API_TOKENS]!' unless ENV.key?('SLACK_API_TOKENS')
|
|
5
|
-
|
|
6
|
-
$stdout.sync = true
|
|
7
|
-
logger = Logger.new($stdout)
|
|
8
|
-
logger.level = Logger::DEBUG
|
|
9
|
-
threads = []
|
|
10
|
-
|
|
11
|
-
ENV['SLACK_API_TOKENS'].split.each do |token|
|
|
12
|
-
logger.info "Starting #{token[0..12]} ..."
|
|
13
|
-
|
|
14
|
-
client = Slack::RealTime::Client.new(token: token)
|
|
15
|
-
|
|
16
|
-
client.on :hello do
|
|
17
|
-
logger.info(
|
|
18
|
-
"Successfully connected, welcome '#{client.self.name}' to " \
|
|
19
|
-
"the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
|
20
|
-
)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
client.on :message do |data|
|
|
24
|
-
logger.info data
|
|
25
|
-
|
|
26
|
-
client.typing channel: data.channel
|
|
27
|
-
|
|
28
|
-
case data.text
|
|
29
|
-
when 'bot hi'
|
|
30
|
-
client.message channel: data.channel, text: "Hi <@#{data.user}>!"
|
|
31
|
-
when /^bot/
|
|
32
|
-
client.message channel: data.channel, text: "Sorry <@#{data.user}>, what?"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
threads << client.start_async
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
threads.each(&:join)
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'websocket/driver'
|
|
3
|
-
require 'socket'
|
|
4
|
-
require 'forwardable'
|
|
5
|
-
require 'celluloid/current'
|
|
6
|
-
require 'celluloid/io'
|
|
7
|
-
|
|
8
|
-
module Slack
|
|
9
|
-
module RealTime
|
|
10
|
-
module Concurrency
|
|
11
|
-
module Celluloid
|
|
12
|
-
class Socket < Slack::RealTime::Socket
|
|
13
|
-
include ::Celluloid::IO
|
|
14
|
-
include ::Celluloid::Internals::Logger
|
|
15
|
-
|
|
16
|
-
BLOCK_SIZE = 4096
|
|
17
|
-
|
|
18
|
-
extend ::Forwardable
|
|
19
|
-
def_delegators :driver, :text, :binary
|
|
20
|
-
|
|
21
|
-
attr_reader :socket
|
|
22
|
-
|
|
23
|
-
def initialize(*args)
|
|
24
|
-
super
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def connect!
|
|
28
|
-
super
|
|
29
|
-
run_loop
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def run_loop
|
|
33
|
-
@closing = false
|
|
34
|
-
@socket = build_socket
|
|
35
|
-
@connected = @socket.connect
|
|
36
|
-
driver.start
|
|
37
|
-
loop { read } if socket
|
|
38
|
-
rescue EOFError, Errno::ECONNRESET, Errno::EPIPE => e
|
|
39
|
-
logger.debug("#{self.class}##{__method__}") { e }
|
|
40
|
-
unless @closing
|
|
41
|
-
driver.emit(
|
|
42
|
-
:close,
|
|
43
|
-
WebSocket::Driver::CloseEvent.new(1001, 'server closed connection')
|
|
44
|
-
)
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def disconnect!
|
|
49
|
-
super
|
|
50
|
-
@ping_timer&.cancel
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def close
|
|
54
|
-
@closing = true
|
|
55
|
-
super
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def read
|
|
59
|
-
buffer = socket.readpartial(BLOCK_SIZE)
|
|
60
|
-
raise EOFError unless buffer && !buffer.empty?
|
|
61
|
-
|
|
62
|
-
async.handle_read(buffer)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def handle_read(buffer)
|
|
66
|
-
logger.debug("#{self.class}##{__method__}") { buffer }
|
|
67
|
-
driver&.parse buffer
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def write(data)
|
|
71
|
-
logger.debug("#{self.class}##{__method__}") { data }
|
|
72
|
-
socket.write(data)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def start_async(client)
|
|
76
|
-
@client = client
|
|
77
|
-
Actor.new(future.run_ping_loop)
|
|
78
|
-
Actor.new(future.run_client_loop)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def run_client_loop
|
|
82
|
-
@client.run_loop
|
|
83
|
-
rescue StandardError => e
|
|
84
|
-
logger.debug("#{self.class}##{__method__}") { e }
|
|
85
|
-
raise e
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def run_ping_loop
|
|
89
|
-
return unless @client.run_ping?
|
|
90
|
-
|
|
91
|
-
@ping_timer = every @client.websocket_ping_timer do
|
|
92
|
-
@client.run_ping!
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def restart_async(client, new_url)
|
|
97
|
-
@last_message_at = current_time
|
|
98
|
-
@url = new_url
|
|
99
|
-
@client = client
|
|
100
|
-
Actor.new(future.run_client_loop)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def connected?
|
|
104
|
-
!@connected.nil? && !@driver.nil?
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
protected
|
|
108
|
-
|
|
109
|
-
class Actor
|
|
110
|
-
attr_reader :future
|
|
111
|
-
|
|
112
|
-
def initialize(future)
|
|
113
|
-
@future = future
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def join
|
|
117
|
-
@future.value
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
def build_socket
|
|
122
|
-
socket = ::Celluloid::IO::TCPSocket.new(addr, port)
|
|
123
|
-
socket = ::Celluloid::IO::SSLSocket.new(socket, build_ssl_context) if secure?
|
|
124
|
-
socket
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def build_ssl_context
|
|
128
|
-
OpenSSL::SSL::SSLContext.new(:TLSv1_2_client)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def build_driver
|
|
132
|
-
::WebSocket::Driver.client(self)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def connect
|
|
136
|
-
@driver = build_driver
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
end
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'faye/websocket'
|
|
3
|
-
require 'eventmachine'
|
|
4
|
-
|
|
5
|
-
module Slack
|
|
6
|
-
module RealTime
|
|
7
|
-
module Concurrency
|
|
8
|
-
module Eventmachine
|
|
9
|
-
class Client < Faye::WebSocket::Client
|
|
10
|
-
def initialize(url, protocols = nil, options = {})
|
|
11
|
-
@logger =
|
|
12
|
-
options.fetch(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
|
|
13
|
-
super url, protocols, options.except(:logger)
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def parse(data)
|
|
17
|
-
logger.debug("#{self.class}##{__method__}") { data }
|
|
18
|
-
super data
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def write(data)
|
|
22
|
-
logger.debug("#{self.class}##{__method__}") { data }
|
|
23
|
-
super data
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
protected
|
|
27
|
-
|
|
28
|
-
attr_reader :logger
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
class Socket < Slack::RealTime::Socket
|
|
32
|
-
def start_async(client)
|
|
33
|
-
@thread = ensure_reactor_running
|
|
34
|
-
|
|
35
|
-
if client.run_ping?
|
|
36
|
-
EventMachine.add_periodic_timer client.websocket_ping_timer do
|
|
37
|
-
client.run_ping!
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
client.run_loop
|
|
42
|
-
|
|
43
|
-
@thread
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def restart_async(client, new_url)
|
|
47
|
-
@url = new_url
|
|
48
|
-
@last_message_at = current_time
|
|
49
|
-
@thread = ensure_reactor_running
|
|
50
|
-
|
|
51
|
-
client.run_loop
|
|
52
|
-
|
|
53
|
-
@thread
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def disconnect!
|
|
57
|
-
super
|
|
58
|
-
EventMachine.stop_event_loop if EventMachine.reactor_running?
|
|
59
|
-
@thread = nil
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def send_data(message)
|
|
63
|
-
logger.debug("#{self.class}##{__method__}") { message }
|
|
64
|
-
driver.send(message)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
protected
|
|
68
|
-
|
|
69
|
-
# @return [Thread]
|
|
70
|
-
def ensure_reactor_running
|
|
71
|
-
return if EventMachine.reactor_running?
|
|
72
|
-
|
|
73
|
-
reactor = Thread.new { EventMachine.run }
|
|
74
|
-
Thread.pass until EventMachine.reactor_running?
|
|
75
|
-
reactor
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def connect
|
|
79
|
-
@driver = Client.new(url, nil, options.merge(logger: logger))
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mixin": true,
|
|
3
|
-
"group": "channels",
|
|
4
|
-
"name": "channels.id",
|
|
5
|
-
"desc": "This method returns the ID of a team channel.",
|
|
6
|
-
"args": {
|
|
7
|
-
"channel": {
|
|
8
|
-
"required": true,
|
|
9
|
-
"example": "#general",
|
|
10
|
-
"desc": "Channel to get ID for, prefixed with #.",
|
|
11
|
-
"type": "channel"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
"errors": {
|
|
15
|
-
"channel_not_found": "Value passed for channel was invalid.",
|
|
16
|
-
"not_authed": "No authentication token provided.",
|
|
17
|
-
"invalid_auth": "Invalid authentication token.",
|
|
18
|
-
"account_inactive": "Authentication token is for a deleted user or team."
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"mixin": true,
|
|
3
|
-
"group": "groups",
|
|
4
|
-
"name": "groups.id",
|
|
5
|
-
"desc": "This method returns the ID of a group.",
|
|
6
|
-
"args": {
|
|
7
|
-
"channel": {
|
|
8
|
-
"required": true,
|
|
9
|
-
"example": "#general",
|
|
10
|
-
"desc": "Group channel to get ID for, prefixed with #.",
|
|
11
|
-
"type": "group"
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
"errors": {
|
|
15
|
-
"channel_not_found": "Value passed for group was invalid.",
|
|
16
|
-
"not_authed": "No authentication token provided.",
|
|
17
|
-
"invalid_auth": "Invalid authentication token.",
|
|
18
|
-
"account_inactive": "Authentication token is for a deleted user or team."
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require_relative 'ids.id'
|
|
3
|
-
|
|
4
|
-
module Slack
|
|
5
|
-
module Web
|
|
6
|
-
module Api
|
|
7
|
-
module Mixins
|
|
8
|
-
module Groups
|
|
9
|
-
include Ids
|
|
10
|
-
#
|
|
11
|
-
# This method returns a group ID given a group name.
|
|
12
|
-
#
|
|
13
|
-
# @option options [channel] :channel
|
|
14
|
-
# Group channel to get ID for, prefixed with #.
|
|
15
|
-
def groups_id(options = {})
|
|
16
|
-
name = options[:channel]
|
|
17
|
-
throw ArgumentError.new('Required arguments :channel missing') if name.nil?
|
|
18
|
-
|
|
19
|
-
id_for(:group, name, '#', :groups, 'channel_not_found') do
|
|
20
|
-
groups_list
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
|
|
2
|
-
index 1f7a8d7..2ec4bed 100644
|
|
3
|
-
--- a/lib/slack/web/api/endpoints/chat.rb
|
|
4
|
-
+++ b/lib/slack/web/api/endpoints/chat.rb
|
|
5
|
-
@@ -49,7 +49,7 @@ module Slack
|
|
6
|
-
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postMessage.json
|
|
7
|
-
def chat_postMessage(options = {})
|
|
8
|
-
throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
|
|
9
|
-
- throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
|
|
10
|
-
+ throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
|
|
11
|
-
post('chat.postMessage', options)
|
|
12
|
-
end
|
|
13
|
-
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
|
|
2
|
-
index 1f7a8d7..89b1562 100644
|
|
3
|
-
--- a/lib/slack/web/api/endpoints/chat.rb
|
|
4
|
-
+++ b/lib/slack/web/api/endpoints/chat.rb
|
|
5
|
-
@@ -50,6 +50,12 @@ module Slack
|
|
6
|
-
def chat_postMessage(options = {})
|
|
7
|
-
throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
|
|
8
|
-
throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
|
|
9
|
-
+ # attachments must be passed as an encoded JSON string
|
|
10
|
-
+ if options.key?(:attachments)
|
|
11
|
-
+ attachments = options[:attachments]
|
|
12
|
-
+ attachments = JSON.dump(attachments) unless attachments.is_a?(String)
|
|
13
|
-
+ options = options.merge(attachments: attachments)
|
|
14
|
-
+ end
|
|
15
|
-
post('chat.postMessage', options)
|
|
16
|
-
end
|
|
17
|
-
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
|
|
2
|
-
index 5186416..490bc91 100644
|
|
3
|
-
--- a/lib/slack/web/api/endpoints/chat.rb
|
|
4
|
-
+++ b/lib/slack/web/api/endpoints/chat.rb
|
|
5
|
-
@@ -154,9 +154,15 @@ module Slack
|
|
6
|
-
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.update.json
|
|
7
|
-
def chat_update(options = {})
|
|
8
|
-
throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
|
|
9
|
-
- throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
|
|
10
|
-
+ throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
|
|
11
|
-
throw ArgumentError.new('Required arguments :ts missing') if options[:ts].nil?
|
|
12
|
-
options = options.merge(channel: channels_id(options)['channel']['id']) if options[:channel]
|
|
13
|
-
+ # attachments must be passed as an encoded JSON string
|
|
14
|
-
+ if options.key?(:attachments)
|
|
15
|
-
+ attachments = options[:attachments]
|
|
16
|
-
+ attachments = JSON.dump(attachments) unless attachments.is_a?(String)
|
|
17
|
-
+ options = options.merge(attachments: attachments)
|
|
18
|
-
+ end
|
|
19
|
-
post('chat.update', options)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
|
|
2
|
-
index 846126e..0c254c6 100644
|
|
3
|
-
--- a/lib/slack/web/api/endpoints/chat.rb
|
|
4
|
-
+++ b/lib/slack/web/api/endpoints/chat.rb
|
|
5
|
-
@@ -62,6 +62,12 @@ module Slack
|
|
6
|
-
throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
|
|
7
|
-
throw ArgumentError.new('Required arguments :user missing') if options[:user].nil?
|
|
8
|
-
options = options.merge(user: users_id(options)['user']['id']) if options[:user]
|
|
9
|
-
+ # attachments must be passed as an encoded JSON string
|
|
10
|
-
+ if options.key?(:attachments)
|
|
11
|
-
+ attachments = options[:attachments]
|
|
12
|
-
+ attachments = JSON.dump(attachments) unless attachments.is_a?(String)
|
|
13
|
-
+ options = options.merge(attachments: attachments)
|
|
14
|
-
+ end
|
|
15
|
-
post('chat.postEphemeral', options)
|
|
16
|
-
end
|
|
17
|
-
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
diff --git a/lib/slack/web/api/endpoints/chat.rb b/lib/slack/web/api/endpoints/chat.rb
|
|
2
|
-
index e1c409d..3b24fea 100644
|
|
3
|
-
--- a/lib/slack/web/api/endpoints/chat.rb
|
|
4
|
-
+++ b/lib/slack/web/api/endpoints/chat.rb
|
|
5
|
-
@@ -120,9 +120,8 @@ module Slack
|
|
6
|
-
# @see https://api.slack.com/methods/chat.postEphemeral
|
|
7
|
-
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/chat/chat.postEphemeral.json
|
|
8
|
-
def chat_postEphemeral(options = {})
|
|
9
|
-
- throw ArgumentError.new('Required arguments :attachments missing') if options[:attachments].nil?
|
|
10
|
-
throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
|
|
11
|
-
- throw ArgumentError.new('Required arguments :text missing') if options[:text].nil?
|
|
12
|
-
+ throw ArgumentError.new('Required arguments :text or :attachments missing') if options[:text].nil? && options[:attachments].nil?
|
|
13
|
-
throw ArgumentError.new('Required arguments :user missing') if options[:user].nil?
|
|
14
|
-
options = options.merge(user: users_id(options)['user']['id']) if options[:user]
|
|
15
|
-
# attachments must be passed as an encoded JSON string
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
http_interactions:
|
|
3
|
-
- request:
|
|
4
|
-
method: post
|
|
5
|
-
uri: https://slack.com/api/auth.test
|
|
6
|
-
response:
|
|
7
|
-
status:
|
|
8
|
-
code: 503
|
|
9
|
-
message: Service Unavailable
|
|
10
|
-
body:
|
|
11
|
-
encoding: US-ASCII
|
|
12
|
-
string: ''
|
|
13
|
-
http_version:
|
|
14
|
-
recorded_at: Thu, 30 Nov 2017 14:36:26 GMT
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
http_interactions:
|
|
3
|
-
- request:
|
|
4
|
-
method: post
|
|
5
|
-
uri: https://slack.com/api/channels.list
|
|
6
|
-
body:
|
|
7
|
-
encoding: UTF-8
|
|
8
|
-
string: token=token
|
|
9
|
-
response:
|
|
10
|
-
status:
|
|
11
|
-
code: 200
|
|
12
|
-
message: OK
|
|
13
|
-
headers:
|
|
14
|
-
Content-Type:
|
|
15
|
-
- application/json; charset=utf-8
|
|
16
|
-
body:
|
|
17
|
-
encoding: UTF-8
|
|
18
|
-
string: '{"ok":true,"channels":[{"id":"C04KB5X4D","name":"general","is_channel":true,"created":1430222230,"creator":"U04KB5WQR","is_archived":false,"is_general":true,"is_member":true,"last_read":"1435863302.000026","latest":{"type":"message","user":"U0HPMN0GY","text":"```\n{\"ok\":true,\"args\":{\"token\":\"xoxb-17803748576-H794PZkqOo4DkjYddb438F2J\"}}```","ts":"1452025068.000045"},"unread_count":321,"unread_count_display":283,"members":["U04JPQ0JS","U04JZBDQQ","U04KB5WQR"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This
|
|
19
|
-
channel is for team-wide communication and announcements. All team members
|
|
20
|
-
are in this channel.","creator":"","last_set":0}}]}'
|
|
21
|
-
http_version:
|
|
22
|
-
recorded_at: Fri, 22 Jan 2016 19:01:46 GMT
|
|
23
|
-
- request:
|
|
24
|
-
method: post
|
|
25
|
-
uri: https://slack.com/api/channels.info
|
|
26
|
-
body:
|
|
27
|
-
encoding: UTF-8
|
|
28
|
-
string: channel=C04KB5X4D&token=token
|
|
29
|
-
headers:
|
|
30
|
-
Content-Type:
|
|
31
|
-
- application/x-www-form-urlencoded
|
|
32
|
-
response:
|
|
33
|
-
status:
|
|
34
|
-
code: 200
|
|
35
|
-
message: OK
|
|
36
|
-
headers:
|
|
37
|
-
Content-Type:
|
|
38
|
-
- application/json; charset=utf-8
|
|
39
|
-
body:
|
|
40
|
-
encoding: UTF-8
|
|
41
|
-
string: '{"ok":true,"channel":{"id":"C04KB5X4D","name":"general","is_channel":true,"created":1430222230,"creator":"U04KB5WQR","is_archived":false,"is_general":true,"is_member":true,"last_read":"1435863302.000026","latest":{"type":"message","user":"U0HPMN0GY","text":"```\n{\"ok\":true,\"args\":{\"token\":\"xoxb-17803748576-H794PZkqOo4DkjYddb438F2J\"}}```","ts":"1452025068.000045"},"unread_count":321,"unread_count_display":283,"members":["U04JPQ0JS","U04JZBDQQ","U04KB5WQR","U06JGTU5V","U07518DTL","U07KECJ77","U092BDCLV","U092V4E9L","U0EA7TZJN","U0H701CJZ","U0HLFUZLJ","U0HPMN0GY"],"topic":{"value":"","creator":"","last_set":0},"purpose":{"value":"This
|
|
42
|
-
channel is for team-wide communication and announcements. All team members
|
|
43
|
-
are in this channel.","creator":"","last_set":0}}}'
|
|
44
|
-
http_version:
|
|
45
|
-
recorded_at: Fri, 22 Jan 2016 19:01:46 GMT
|
|
46
|
-
recorded_with: VCR 3.0.1
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
http_interactions:
|
|
3
|
-
- request:
|
|
4
|
-
method: post
|
|
5
|
-
uri: https://slack.com/api/groups.list
|
|
6
|
-
body:
|
|
7
|
-
encoding: UTF-8
|
|
8
|
-
string: token=token
|
|
9
|
-
response:
|
|
10
|
-
status:
|
|
11
|
-
code: 200
|
|
12
|
-
message: OK
|
|
13
|
-
headers:
|
|
14
|
-
Content-Type:
|
|
15
|
-
- application/json; charset=utf-8
|
|
16
|
-
body:
|
|
17
|
-
encoding: ASCII-8BIT
|
|
18
|
-
string: '{"ok":true,"groups":[{"id":"G0K7EV5A7","name":"mpdm-dblock--rubybot--player1-1","is_group":true,"created":1453561861,"creator":"U04KB5WQR","is_archived":false,"is_mpim":true,"members":["U04KB5WQR","U0HLFUZLJ","U07518DTL"],"topic":{"value":"Group
|
|
19
|
-
messaging","creator":"U04KB5WQR","last_set":1453561861},"purpose":{"value":"Group
|
|
20
|
-
messaging with: @dblock @rubybot @player1","creator":"U04KB5WQR","last_set":1453561861}}]}'
|
|
21
|
-
http_version:
|
|
22
|
-
recorded_at: Sat, 23 Jan 2016 15:19:10 GMT
|
|
23
|
-
- request:
|
|
24
|
-
method: post
|
|
25
|
-
uri: https://slack.com/api/groups.info
|
|
26
|
-
body:
|
|
27
|
-
encoding: UTF-8
|
|
28
|
-
string: channel=G0K7EV5A7&token=token
|
|
29
|
-
response:
|
|
30
|
-
status:
|
|
31
|
-
code: 200
|
|
32
|
-
message: OK
|
|
33
|
-
headers:
|
|
34
|
-
Content-Type:
|
|
35
|
-
- application/json; charset=utf-8
|
|
36
|
-
body:
|
|
37
|
-
encoding: ASCII-8BIT
|
|
38
|
-
string: '{"ok":true,"group":{"id":"G0K7EV5A7","name":"mpdm-dblock--rubybot--player1-1","is_group":true,"created":1453561861,"creator":"U04KB5WQR","is_archived":false,"is_mpim":true,"is_open":false,"last_read":"0000000000.000000","latest":null,"unread_count":0,"unread_count_display":0,"members":["U04KB5WQR","U0HLFUZLJ","U07518DTL"],"topic":{"value":"Group
|
|
39
|
-
messaging","creator":"U04KB5WQR","last_set":1453561861},"purpose":{"value":"Group
|
|
40
|
-
messaging with: @dblock @rubybot @player1","creator":"U04KB5WQR","last_set":1453561861}}}'
|
|
41
|
-
http_version:
|
|
42
|
-
recorded_at: Sat, 23 Jan 2016 15:19:46 GMT
|
|
43
|
-
recorded_with: VCR 3.0.0
|