slack-ruby-client 0.13.1 → 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/.gitignore +1 -0
- data/.rubocop.yml +29 -5
- data/.rubocop_todo.yml +124 -44
- data/.travis.yml +5 -8
- data/CHANGELOG.md +92 -2
- data/CONTRIBUTING.md +19 -8
- data/Dangerfile +2 -0
- data/Gemfile +10 -5
- data/LICENSE.md +1 -1
- data/README.md +186 -49
- data/RELEASING.md +1 -1
- data/Rakefile +2 -1
- data/UPGRADING.md +72 -2
- data/bin/commands/admin_analytics.rb +16 -0
- data/bin/commands/admin_apps.rb +51 -0
- data/bin/commands/admin_apps_approved.rb +17 -0
- data/bin/commands/admin_apps_requests.rb +17 -0
- data/bin/commands/admin_apps_restricted.rb +17 -0
- data/bin/commands/admin_auth_policy.rb +39 -0
- data/bin/commands/admin_barriers.rb +47 -0
- data/bin/commands/admin_conversations.rb +169 -0
- 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 +54 -0
- data/bin/commands/admin_inviteRequests.rb +36 -0
- data/bin/commands/admin_inviteRequests_approved.rb +16 -0
- data/bin/commands/admin_inviteRequests_denied.rb +16 -0
- data/bin/commands/admin_teams.rb +27 -0
- data/bin/commands/admin_teams_admins.rb +16 -0
- data/bin/commands/admin_teams_owners.rb +16 -0
- data/bin/commands/admin_teams_settings.rb +64 -0
- data/bin/commands/admin_usergroups.rb +48 -0
- data/bin/commands/admin_users.rb +98 -0
- data/bin/commands/admin_users_session.rb +78 -0
- data/bin/commands/api.rb +1 -1
- data/bin/commands/apps.rb +15 -0
- 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/apps_permissions.rb +1 -0
- data/bin/commands/apps_permissions_resources.rb +1 -0
- data/bin/commands/apps_permissions_scopes.rb +1 -0
- data/bin/commands/apps_permissions_users.rb +1 -0
- data/bin/commands/auth.rb +1 -0
- data/bin/commands/auth_teams.rb +16 -0
- data/bin/commands/bots.rb +2 -0
- data/bin/commands/calls.rb +52 -0
- data/bin/commands/calls_participants.rb +25 -0
- data/bin/commands/channels.rb +1 -153
- data/bin/commands/chat.rb +56 -12
- data/bin/commands/chat_scheduledMessages.rb +19 -0
- data/bin/commands/conversations.rb +75 -5
- data/bin/commands/dialog.rb +1 -0
- data/bin/commands/dnd.rb +6 -3
- data/bin/commands/emoji.rb +1 -0
- data/bin/commands/files.rb +10 -18
- data/bin/commands/files_comments.rb +1 -21
- data/bin/commands/files_remote.rb +78 -0
- data/bin/commands/groups.rb +1 -161
- data/bin/commands/im.rb +1 -62
- data/bin/commands/migration.rb +2 -0
- data/bin/commands/mpim.rb +1 -60
- data/bin/commands/oauth.rb +2 -14
- data/bin/commands/oauth_v2.rb +29 -0
- data/bin/commands/openid_connect.rb +27 -0
- data/bin/commands/pins.rb +3 -6
- data/bin/commands/reactions.rb +3 -3
- data/bin/commands/reminders.rb +7 -0
- data/bin/commands/rtm.rb +3 -2
- data/bin/commands/search.rb +6 -1
- data/bin/commands/stars.rb +8 -6
- data/bin/commands/team.rb +5 -0
- data/bin/commands/team_billing.rb +13 -0
- data/bin/commands/team_preferences.rb +13 -0
- data/bin/commands/team_profile.rb +1 -0
- data/bin/commands/tooling_tokens.rb +14 -0
- data/bin/commands/usergroups.rb +7 -1
- data/bin/commands/usergroups_users.rb +3 -0
- data/bin/commands/users.rb +6 -4
- data/bin/commands/users_admin.rb +1 -0
- data/bin/commands/users_prefs.rb +1 -0
- data/bin/commands/users_profile.rb +6 -5
- data/bin/commands/views.rb +48 -0
- data/bin/commands/workflows.rb +38 -0
- data/bin/commands.rb +38 -8
- data/bin/slack +2 -3
- data/examples/hi_real_time_and_web/Gemfile +1 -0
- data/examples/hi_real_time_and_web/hi.rb +7 -3
- data/examples/hi_real_time_async_async/Gemfile +1 -0
- data/examples/hi_real_time_async_async/hi.rb +6 -2
- data/examples/hi_web/Gemfile +1 -0
- data/examples/hi_web/hi.rb +1 -0
- data/examples/new_ticket/Gemfile +1 -0
- data/examples/new_ticket/new_ticket.rb +1 -0
- data/lib/slack/config.rb +2 -2
- data/lib/slack/events/config.rb +32 -0
- data/lib/slack/events/request.rb +72 -0
- data/lib/slack/logger.rb +6 -5
- data/lib/slack/messages/formatting.rb +1 -0
- data/lib/slack/messages/message.rb +1 -4
- data/lib/slack/real_time/api/message.rb +3 -1
- data/lib/slack/real_time/api/message_id.rb +1 -0
- data/lib/slack/real_time/api/ping.rb +5 -2
- data/lib/slack/real_time/api/typing.rb +3 -1
- data/lib/slack/real_time/client.rb +101 -32
- data/lib/slack/real_time/concurrency/async.rb +77 -6
- data/lib/slack/real_time/concurrency.rb +1 -2
- data/lib/slack/real_time/config.rb +6 -10
- data/lib/slack/real_time/models/base.rb +1 -4
- data/lib/slack/real_time/models/bot.rb +1 -0
- data/lib/slack/real_time/models/channel.rb +1 -0
- data/lib/slack/real_time/models/group.rb +1 -0
- data/lib/slack/real_time/models/im.rb +1 -0
- data/lib/slack/real_time/models/team.rb +1 -0
- data/lib/slack/real_time/models/user.rb +1 -0
- data/lib/slack/real_time/models.rb +1 -0
- data/lib/slack/real_time/socket.rb +45 -17
- data/lib/slack/real_time/stores/base.rb +5 -7
- data/lib/slack/real_time/stores/starter.rb +17 -3
- data/lib/slack/real_time/stores/store.rb +33 -25
- data/lib/slack/real_time/stores.rb +1 -0
- data/lib/slack/version.rb +2 -1
- data/lib/slack/web/api/endpoints/admin_analytics.rb +28 -0
- data/lib/slack/web/api/endpoints/admin_apps.rb +78 -0
- data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
- 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 +260 -0
- 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 +88 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +61 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests_approved.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_inviteRequests_denied.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_teams.rb +50 -0
- data/lib/slack/web/api/endpoints/admin_teams_admins.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_teams_owners.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_teams_settings.rb +99 -0
- data/lib/slack/web/api/endpoints/admin_usergroups.rb +77 -0
- data/lib/slack/web/api/endpoints/admin_users.rb +163 -0
- data/lib/slack/web/api/endpoints/admin_users_session.rb +122 -0
- data/lib/slack/web/api/endpoints/api.rb +2 -3
- data/lib/slack/web/api/endpoints/apps.rb +27 -0
- 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/apps_permissions.rb +1 -0
- data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +1 -0
- data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +1 -0
- data/lib/slack/web/api/endpoints/apps_permissions_users.rb +1 -0
- data/lib/slack/web/api/endpoints/auth.rb +2 -1
- data/lib/slack/web/api/endpoints/auth_teams.rb +33 -0
- data/lib/slack/web/api/endpoints/bots.rb +4 -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 +2 -243
- data/lib/slack/web/api/endpoints/chat.rb +144 -47
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
- data/lib/slack/web/api/endpoints/conversations.rb +152 -41
- data/lib/slack/web/api/endpoints/dialog.rb +3 -2
- data/lib/slack/web/api/endpoints/dnd.rb +9 -4
- data/lib/slack/web/api/endpoints/emoji.rb +1 -0
- data/lib/slack/web/api/endpoints/files.rb +24 -29
- data/lib/slack/web/api/endpoints/files_comments.rb +2 -34
- data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
- data/lib/slack/web/api/endpoints/groups.rb +1 -253
- data/lib/slack/web/api/endpoints/im.rb +1 -101
- data/lib/slack/web/api/endpoints/migration.rb +5 -2
- data/lib/slack/web/api/endpoints/mpim.rb +1 -96
- data/lib/slack/web/api/endpoints/oauth.rb +7 -31
- data/lib/slack/web/api/endpoints/oauth_v2.rb +48 -0
- data/lib/slack/web/api/endpoints/openid_connect.rb +42 -0
- data/lib/slack/web/api/endpoints/pins.rb +8 -15
- data/lib/slack/web/api/endpoints/reactions.rb +20 -19
- data/lib/slack/web/api/endpoints/reminders.rb +18 -5
- data/lib/slack/web/api/endpoints/rtm.rb +11 -10
- data/lib/slack/web/api/endpoints/search.rb +28 -13
- data/lib/slack/web/api/endpoints/stars.rb +14 -11
- data/lib/slack/web/api/endpoints/team.rb +13 -4
- 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 +2 -1
- data/lib/slack/web/api/endpoints/tooling_tokens.rb +24 -0
- data/lib/slack/web/api/endpoints/usergroups.rb +27 -16
- data/lib/slack/web/api/endpoints/usergroups_users.rb +10 -5
- data/lib/slack/web/api/endpoints/users.rb +21 -20
- data/lib/slack/web/api/endpoints/users_admin.rb +1 -0
- data/lib/slack/web/api/endpoints/users_prefs.rb +1 -0
- data/lib/slack/web/api/endpoints/users_profile.rb +8 -7
- data/lib/slack/web/api/endpoints/views.rb +97 -0
- data/lib/slack/web/api/endpoints/workflows.rb +61 -0
- data/lib/slack/web/api/endpoints.rb +76 -18
- data/lib/slack/web/api/error.rb +1 -0
- data/lib/slack/web/api/errors/server_error.rb +37 -0
- data/lib/slack/web/api/errors/slack_error.rb +14 -1
- data/lib/slack/web/api/errors/too_many_requests_error.rb +2 -4
- data/lib/slack/web/api/errors.rb +1040 -0
- data/lib/slack/web/api/mixins/{channels.id.rb → conversations.id.rb} +4 -5
- data/lib/slack/web/api/mixins/ids.id.rb +3 -2
- data/lib/slack/web/api/mixins/users.id.rb +2 -3
- data/lib/slack/web/api/mixins/users.search.rb +1 -0
- data/lib/slack/web/api/mixins.rb +2 -2
- data/lib/slack/web/api/patches/chat.1.patch +70 -0
- data/lib/slack/web/api/patches/views.1.view-json.patch +40 -0
- data/lib/slack/web/api/patches/views.1.views-published.patch +16 -0
- data/lib/slack/web/api/templates/command.erb +1 -0
- data/lib/slack/web/api/templates/commands.erb +1 -0
- data/lib/slack/web/api/templates/endpoints.erb +2 -2
- data/lib/slack/web/api/templates/errors.erb +20 -0
- data/lib/slack/web/api/templates/method.erb +5 -1
- data/lib/slack/web/api/templates/method_spec.erb +2 -1
- data/lib/slack/web/client.rb +2 -1
- data/lib/slack/web/config.rb +3 -0
- data/lib/slack/web/faraday/connection.rb +24 -20
- data/lib/slack/web/faraday/request.rb +3 -1
- data/lib/slack/web/faraday/response/raise_error.rb +21 -6
- data/lib/slack/web/faraday/response/wrap_error.rb +24 -0
- data/lib/slack/web/pagination/cursor.rb +7 -7
- data/lib/slack-ruby-client.rb +10 -4
- data/lib/slack.rb +1 -0
- data/lib/slack_ruby_client.rb +1 -0
- data/lib/tasks/git.rake +1 -0
- data/lib/tasks/real_time.rake +15 -5
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +39 -10
- data/screenshots/create-app.png +0 -0
- data/slack-ruby-client.gemspec +9 -6
- 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 +83 -0
- data/spec/integration/integration_spec.rb +115 -47
- data/spec/slack/config_spec.rb +2 -0
- data/spec/slack/events/config_spec.rb +33 -0
- data/spec/slack/events/request_spec.rb +184 -0
- data/spec/slack/messages/formatting_spec.rb +25 -13
- data/spec/slack/real_time/api/message_spec.rb +6 -1
- data/spec/slack/real_time/api/ping_spec.rb +2 -0
- data/spec/slack/real_time/api/typing_spec.rb +5 -1
- data/spec/slack/real_time/client_spec.rb +244 -50
- data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
- 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 +3 -2
- data/spec/slack/real_time/event_handlers/channel_spec.rb +10 -7
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +2 -1
- data/spec/slack/real_time/event_handlers/group_spec.rb +5 -4
- data/spec/slack/real_time/event_handlers/im_spec.rb +9 -8
- data/spec/slack/real_time/event_handlers/team_spec.rb +3 -1
- data/spec/slack/real_time/event_handlers/user_spec.rb +3 -2
- data/spec/slack/real_time/rtm_connect_spec.rb +2 -1
- data/spec/slack/real_time/rtm_start_spec.rb +2 -1
- data/spec/slack/real_time/store_spec.rb +2 -1
- data/spec/slack/slack_spec.rb +40 -6
- data/spec/slack/version_spec.rb +2 -1
- data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_apps_spec.rb +18 -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/admin_conversations_ekm_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +32 -0
- data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +98 -0
- data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +37 -0
- data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +18 -0
- data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +53 -0
- data/spec/slack/web/api/endpoints/admin_teams_spec.rb +16 -0
- data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +37 -0
- data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +41 -0
- data/spec/slack/web/api/endpoints/admin_users_spec.rb +67 -0
- data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/apps_connections_spec.rb +8 -0
- 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 +16 -0
- data/spec/slack/web/api/endpoints/{apps_permissions_scopes_spec.rb → auth_teams_spec.rb} +2 -1
- data/spec/slack/web/api/endpoints/bots_spec.rb +1 -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/chat_scheduledMessages_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +9 -7
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +112 -36
- data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +12 -4
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +8 -3
- data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
- data/spec/slack/web/api/endpoints/dnd_spec.rb +4 -3
- data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/files_comments_spec.rb +3 -21
- data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
- data/spec/slack/web/api/endpoints/files_spec.rb +5 -4
- data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -22
- data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +16 -0
- data/spec/slack/web/api/endpoints/openid_connect_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/pins_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
- data/spec/slack/web/api/endpoints/reminders_spec.rb +3 -2
- data/spec/slack/web/api/endpoints/rtm_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/search_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/stars_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/{apps_permissions_resources_spec.rb → team_billing_spec.rb} +2 -1
- data/spec/slack/web/api/endpoints/team_preferences_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/team_profile_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +3 -2
- data/spec/slack/web/api/endpoints/users_admin_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/users_prefs_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/users_profile_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/workflows_spec.rb +26 -0
- data/spec/slack/web/api/error_spec.rb +7 -7
- data/spec/slack/web/api/errors/slack_error_spec.rb +26 -7
- data/spec/slack/web/api/mixins/conversations_list_spec.rb +21 -0
- data/spec/slack/web/api/mixins/conversations_spec.rb +43 -0
- data/spec/slack/web/api/mixins/users_spec.rb +17 -8
- data/spec/slack/web/api/pagination/cursor_spec.rb +41 -13
- data/spec/slack/web/client_spec.rb +168 -19
- data/spec/slack/web/faraday/request_spec.rb +80 -0
- data/spec/slack/web/faraday/response/raise_error_spec.rb +48 -12
- data/spec/spec_helper.rb +9 -2
- data/spec/support/queue_with_timeout.rb +5 -4
- data/spec/support/real_time/concurrency/mock.rb +1 -0
- data/spec/support/real_time/connected_client.rb +6 -6
- data/spec/support/real_time/event.rb +1 -0
- data/spec/support/token.rb +1 -0
- data/spec/support/vcr.rb +37 -1
- metadata +205 -147
- data/examples/hi_real_time/Gemfile +0 -5
- data/examples/hi_real_time/hi.gif +0 -0
- data/examples/hi_real_time/hi.rb +0 -37
- data/examples/hi_real_time_async_celluloid/Gemfile +0 -6
- data/examples/hi_real_time_async_celluloid/Procfile +0 -2
- data/examples/hi_real_time_async_celluloid/hi.rb +0 -35
- data/examples/hi_real_time_async_eventmachine/Gemfile +0 -6
- data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
- data/examples/hi_real_time_async_eventmachine/hi.rb +0 -35
- data/lib/slack/real_time/concurrency/celluloid.rb +0 -118
- data/lib/slack/real_time/concurrency/eventmachine.rb +0 -66
- 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 -26
- 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 -13
- data/screenshots/register-bot.png +0 -0
- 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 -106
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
- data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +0 -18
- data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
- data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
- data/spec/slack/web/api/errors/service_unavailable_spec.rb +0 -14
- data/spec/slack/web/api/mixins/channels_spec.rb +0 -33
- data/spec/slack/web/api/mixins/groups_spec.rb +0 -33
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Api
|
|
4
5
|
module Ping
|
|
5
6
|
#
|
|
6
|
-
# Clients should try to quickly detect disconnections, even in idle periods, so that users
|
|
7
|
-
#
|
|
7
|
+
# Clients should try to quickly detect disconnections, even in idle periods, so that users
|
|
8
|
+
# can easily tell the
|
|
9
|
+
# difference between being disconnected and everyone being quiet. Not all web browsers
|
|
10
|
+
# support the WebSocket
|
|
8
11
|
# ping spec, so the RTM protocol also supports ping/pong messages.
|
|
9
12
|
#
|
|
10
13
|
def ping(options = {})
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Api
|
|
@@ -6,7 +7,8 @@ module Slack
|
|
|
6
7
|
# Send a typing indicator to indicate that the user is currently writing a message.
|
|
7
8
|
#
|
|
8
9
|
# @option options [channel] :channel
|
|
9
|
-
# Channel to send message to. Can be a public channel, private group or IM channel.
|
|
10
|
+
# Channel to send message to. Can be a public channel, private group or IM channel.
|
|
11
|
+
# Can be an encoded ID, or a name.
|
|
10
12
|
def typing(options = {})
|
|
11
13
|
throw ArgumentError.new('Required arguments :channel missing') if options[:channel].nil?
|
|
12
14
|
send_json({ type: 'typing', id: next_id }.merge(options))
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
class Client
|
|
4
5
|
class ClientNotStartedError < StandardError; end
|
|
6
|
+
|
|
5
7
|
class ClientAlreadyStartedError < StandardError; end
|
|
6
8
|
|
|
7
9
|
include Api::MessageId
|
|
@@ -15,12 +17,8 @@ module Slack
|
|
|
15
17
|
attr_accessor :events
|
|
16
18
|
end
|
|
17
19
|
|
|
18
|
-
attr_accessor :web_client
|
|
19
|
-
attr_accessor :store
|
|
20
|
-
attr_accessor :url
|
|
21
|
-
attr_accessor(*Config::ATTRIBUTES)
|
|
20
|
+
attr_accessor :web_client, :store, :url, *Config::ATTRIBUTES
|
|
22
21
|
|
|
23
|
-
protected :logger, :logger=
|
|
24
22
|
protected :store_class, :store_class=
|
|
25
23
|
|
|
26
24
|
def initialize(options = {})
|
|
@@ -35,7 +33,7 @@ module Slack
|
|
|
35
33
|
|
|
36
34
|
%i[users self channels team teams groups ims bots].each do |store_method|
|
|
37
35
|
define_method store_method do
|
|
38
|
-
store
|
|
36
|
+
store&.send(store_method)
|
|
39
37
|
end
|
|
40
38
|
end
|
|
41
39
|
|
|
@@ -47,7 +45,7 @@ module Slack
|
|
|
47
45
|
# Start RealTime client and block until it disconnects.
|
|
48
46
|
def start!(&block)
|
|
49
47
|
@callback = block if block_given?
|
|
50
|
-
|
|
48
|
+
build_socket
|
|
51
49
|
@socket.start_sync(self)
|
|
52
50
|
end
|
|
53
51
|
|
|
@@ -55,17 +53,18 @@ module Slack
|
|
|
55
53
|
# The RealTime::Client will run in the background.
|
|
56
54
|
def start_async(&block)
|
|
57
55
|
@callback = block if block_given?
|
|
58
|
-
|
|
56
|
+
build_socket
|
|
59
57
|
@socket.start_async(self)
|
|
60
58
|
end
|
|
61
59
|
|
|
62
60
|
def stop!
|
|
63
61
|
raise ClientNotStartedError unless started?
|
|
64
|
-
|
|
62
|
+
|
|
63
|
+
@socket&.disconnect!
|
|
65
64
|
end
|
|
66
65
|
|
|
67
66
|
def started?
|
|
68
|
-
@socket
|
|
67
|
+
@socket&.connected?
|
|
69
68
|
end
|
|
70
69
|
|
|
71
70
|
class << self
|
|
@@ -80,38 +79,105 @@ module Slack
|
|
|
80
79
|
|
|
81
80
|
def run_loop
|
|
82
81
|
@socket.connect! do |driver|
|
|
83
|
-
@callback.call(driver) if @callback
|
|
84
|
-
|
|
85
82
|
driver.on :open do |event|
|
|
86
|
-
logger.debug("#{self
|
|
87
|
-
|
|
83
|
+
logger.debug("#{self}##{__method__}") { event.class.name }
|
|
84
|
+
open_event(event)
|
|
88
85
|
callback(event, :open)
|
|
89
86
|
end
|
|
90
87
|
|
|
91
88
|
driver.on :message do |event|
|
|
92
|
-
logger.debug("#{self
|
|
89
|
+
logger.debug("#{self}##{__method__}") { "#{event.class}, #{event.data}" }
|
|
93
90
|
dispatch(event)
|
|
94
91
|
end
|
|
95
92
|
|
|
96
93
|
driver.on :close do |event|
|
|
97
|
-
logger.debug("#{self
|
|
94
|
+
logger.debug("#{self}##{__method__}") { event.class.name }
|
|
98
95
|
callback(event, :close)
|
|
99
96
|
close(event)
|
|
100
97
|
callback(event, :closed)
|
|
101
98
|
end
|
|
99
|
+
|
|
100
|
+
# This must be called last to ensure any events are registered before invoking user code.
|
|
101
|
+
@callback&.call(driver)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Ensure the server is running, and ping the remote server if no other messages were sent.
|
|
106
|
+
def keep_alive?
|
|
107
|
+
# We can't ping the remote server if we aren't connected.
|
|
108
|
+
return false if @socket.nil? || !@socket.connected?
|
|
109
|
+
|
|
110
|
+
time_since_last_message = @socket.time_since_last_message
|
|
111
|
+
|
|
112
|
+
# If the server responded within the specified time, we are okay:
|
|
113
|
+
return true if time_since_last_message < websocket_ping
|
|
114
|
+
|
|
115
|
+
# If the server has not responded for a while:
|
|
116
|
+
return false if time_since_last_message > (websocket_ping * 2)
|
|
117
|
+
|
|
118
|
+
# Kick off the next ping message:
|
|
119
|
+
ping
|
|
120
|
+
|
|
121
|
+
true
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Check if the remote server is responsive, and if not, restart the connection.
|
|
125
|
+
def run_ping!
|
|
126
|
+
return if keep_alive?
|
|
127
|
+
|
|
128
|
+
logger.warn(to_s) { 'is offline' }
|
|
129
|
+
|
|
130
|
+
restart_async
|
|
131
|
+
rescue Slack::Web::Api::Errors::SlackError => e
|
|
132
|
+
# stop pinging if bot was uninstalled
|
|
133
|
+
case e.message
|
|
134
|
+
when 'account_inactive', 'invalid_auth'
|
|
135
|
+
logger.warn(to_s) { e.message }
|
|
136
|
+
raise e
|
|
137
|
+
end
|
|
138
|
+
logger.debug("#{self}##{__method__}") { e }
|
|
139
|
+
rescue StandardError => e
|
|
140
|
+
# disregard all ping worker failures, keep pinging
|
|
141
|
+
logger.debug("#{self}##{__method__}") { e }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def run_ping?
|
|
145
|
+
!websocket_ping.nil? && websocket_ping.positive?
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def websocket_ping_timer
|
|
149
|
+
websocket_ping / 2
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def to_s
|
|
153
|
+
if store&.team
|
|
154
|
+
"id=#{store.team.id}, name=#{store.team.name}, domain=#{store.team.domain}"
|
|
155
|
+
else
|
|
156
|
+
super
|
|
102
157
|
end
|
|
103
158
|
end
|
|
104
159
|
|
|
105
160
|
protected
|
|
106
161
|
|
|
162
|
+
def restart_async
|
|
163
|
+
logger.debug("#{self}##{__method__}")
|
|
164
|
+
@socket.close
|
|
165
|
+
start = web_client.send(rtm_start_method, start_options)
|
|
166
|
+
data = Slack::Messages::Message.new(start)
|
|
167
|
+
@url = data.url
|
|
168
|
+
@store = @store_class.new(data) if @store_class
|
|
169
|
+
@socket.restart_async(self, @url)
|
|
170
|
+
end
|
|
171
|
+
|
|
107
172
|
# @return [Slack::RealTime::Socket]
|
|
108
173
|
def build_socket
|
|
109
174
|
raise ClientAlreadyStartedError if started?
|
|
175
|
+
|
|
110
176
|
start = web_client.send(rtm_start_method, start_options)
|
|
111
177
|
data = Slack::Messages::Message.new(start)
|
|
112
178
|
@url = data.url
|
|
113
179
|
@store = @store_class.new(data) if @store_class
|
|
114
|
-
socket_class.new(@url, socket_options)
|
|
180
|
+
@socket = socket_class.new(@url, socket_options)
|
|
115
181
|
end
|
|
116
182
|
|
|
117
183
|
def rtm_start_method
|
|
@@ -133,23 +199,22 @@ module Slack
|
|
|
133
199
|
end
|
|
134
200
|
|
|
135
201
|
attr_reader :callbacks
|
|
202
|
+
|
|
136
203
|
def socket_class
|
|
137
204
|
concurrency::Socket
|
|
138
205
|
end
|
|
139
206
|
|
|
140
207
|
def send_json(data)
|
|
141
208
|
raise ClientNotStartedError unless started?
|
|
142
|
-
|
|
209
|
+
|
|
210
|
+
logger.debug("#{self}##{__method__}") { data }
|
|
143
211
|
@socket.send_data(data.to_json)
|
|
144
212
|
end
|
|
145
213
|
|
|
146
|
-
def
|
|
214
|
+
def open_event(_event); end
|
|
147
215
|
|
|
148
216
|
def close(_event)
|
|
149
|
-
socket
|
|
150
|
-
@socket = nil
|
|
151
|
-
|
|
152
|
-
[socket, socket_class].each do |s|
|
|
217
|
+
[@socket, socket_class].each do |s|
|
|
153
218
|
s.close if s.respond_to?(:close)
|
|
154
219
|
end
|
|
155
220
|
end
|
|
@@ -157,50 +222,54 @@ module Slack
|
|
|
157
222
|
def callback(event, type)
|
|
158
223
|
callbacks = self.callbacks[type.to_s]
|
|
159
224
|
return false unless callbacks
|
|
225
|
+
|
|
160
226
|
callbacks.each do |c|
|
|
161
227
|
c.call(event)
|
|
162
228
|
end
|
|
163
229
|
true
|
|
164
230
|
rescue StandardError => e
|
|
165
|
-
logger.error e
|
|
231
|
+
logger.error("#{self}##{__method__}") { e }
|
|
166
232
|
false
|
|
167
233
|
end
|
|
168
234
|
|
|
169
235
|
def dispatch(event)
|
|
170
236
|
return false unless event.data
|
|
237
|
+
|
|
171
238
|
data = Slack::Messages::Message.new(JSON.parse(event.data))
|
|
172
239
|
type = data.type
|
|
173
240
|
return false unless type
|
|
241
|
+
|
|
174
242
|
type = type.to_s
|
|
175
|
-
logger.debug("#{self
|
|
243
|
+
logger.debug("#{self}##{__method__}") { data.to_s }
|
|
176
244
|
run_handlers(type, data) if @store
|
|
177
245
|
run_callbacks(type, data)
|
|
178
246
|
rescue StandardError => e
|
|
179
|
-
logger.error e
|
|
247
|
+
logger.error("#{self}##{__method__}") { e }
|
|
180
248
|
false
|
|
181
249
|
end
|
|
182
250
|
|
|
183
251
|
def run_handlers(type, data)
|
|
252
|
+
return unless store.class.events
|
|
253
|
+
|
|
184
254
|
handlers = store.class.events[type.to_s]
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
store.instance_exec(data, &handler)
|
|
188
|
-
end
|
|
255
|
+
handlers&.each do |handler|
|
|
256
|
+
store.instance_exec(data, &handler)
|
|
189
257
|
end
|
|
190
258
|
rescue StandardError => e
|
|
191
|
-
logger.error e
|
|
259
|
+
logger.error("#{self}##{__method__}") { e }
|
|
192
260
|
false
|
|
193
261
|
end
|
|
194
262
|
|
|
195
263
|
def run_callbacks(type, data)
|
|
196
264
|
callbacks = self.callbacks[type]
|
|
197
265
|
return false unless callbacks
|
|
266
|
+
|
|
198
267
|
callbacks.each do |c|
|
|
199
268
|
c.call(data)
|
|
200
269
|
end
|
|
201
270
|
true
|
|
202
271
|
rescue StandardError => e
|
|
203
|
-
logger.error e
|
|
272
|
+
logger.error("#{self}##{__method__}") { e }
|
|
204
273
|
false
|
|
205
274
|
end
|
|
206
275
|
end
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'async/websocket'
|
|
3
|
+
require 'async/notification'
|
|
4
|
+
require 'async/clock'
|
|
2
5
|
|
|
3
6
|
module Slack
|
|
4
7
|
module RealTime
|
|
@@ -12,28 +15,89 @@ module Slack
|
|
|
12
15
|
class Socket < Slack::RealTime::Socket
|
|
13
16
|
attr_reader :client
|
|
14
17
|
|
|
18
|
+
def start_sync(client)
|
|
19
|
+
start_reactor(client).wait
|
|
20
|
+
end
|
|
21
|
+
|
|
15
22
|
def start_async(client)
|
|
16
23
|
Thread.new do
|
|
17
|
-
|
|
18
|
-
|
|
24
|
+
start_reactor(client)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def start_reactor(client)
|
|
29
|
+
Async do |task|
|
|
30
|
+
@restart = ::Async::Notification.new
|
|
31
|
+
|
|
32
|
+
if client.run_ping?
|
|
33
|
+
@ping_task = task.async do |subtask|
|
|
34
|
+
subtask.annotate "#{client} keep-alive"
|
|
35
|
+
|
|
36
|
+
# The timer task will naturally exit after the driver is set to nil.
|
|
37
|
+
while @restart
|
|
38
|
+
subtask.sleep client.websocket_ping_timer
|
|
39
|
+
client.run_ping! if @restart
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
while @restart
|
|
45
|
+
@client_task&.stop
|
|
46
|
+
|
|
47
|
+
@client_task = task.async do |subtask|
|
|
48
|
+
subtask.annotate "#{client} run-loop"
|
|
49
|
+
client.run_loop
|
|
50
|
+
rescue ::Async::Wrapper::Cancelled => e
|
|
51
|
+
# Will get restarted by ping worker.
|
|
52
|
+
rescue StandardError => e
|
|
53
|
+
client.logger.error(subtask.to_s) { e.message }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
@restart.wait
|
|
19
57
|
end
|
|
58
|
+
|
|
59
|
+
@ping_task&.stop
|
|
20
60
|
end
|
|
21
61
|
end
|
|
22
62
|
|
|
63
|
+
def restart_async(_client, new_url)
|
|
64
|
+
@url = new_url
|
|
65
|
+
@last_message_at = current_time
|
|
66
|
+
|
|
67
|
+
@restart&.signal
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def current_time
|
|
71
|
+
::Async::Clock.now
|
|
72
|
+
end
|
|
73
|
+
|
|
23
74
|
def connect!
|
|
24
75
|
super
|
|
25
76
|
run_loop
|
|
26
77
|
end
|
|
27
78
|
|
|
79
|
+
# Kill the restart/ping loop.
|
|
80
|
+
def disconnect!
|
|
81
|
+
super
|
|
82
|
+
ensure
|
|
83
|
+
if (restart = @restart)
|
|
84
|
+
@restart = nil
|
|
85
|
+
restart.signal
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Close the socket.
|
|
28
90
|
def close
|
|
29
|
-
@closing = true
|
|
30
|
-
@driver.close if @driver
|
|
31
91
|
super
|
|
92
|
+
ensure
|
|
93
|
+
if @socket
|
|
94
|
+
@socket.close
|
|
95
|
+
@socket = nil
|
|
96
|
+
end
|
|
32
97
|
end
|
|
33
98
|
|
|
34
99
|
def run_loop
|
|
35
|
-
@
|
|
36
|
-
while @driver && @driver.next_event
|
|
100
|
+
while @driver&.next_event
|
|
37
101
|
# $stderr.puts event.inspect
|
|
38
102
|
end
|
|
39
103
|
end
|
|
@@ -65,3 +129,10 @@ module Slack
|
|
|
65
129
|
end
|
|
66
130
|
end
|
|
67
131
|
end
|
|
132
|
+
|
|
133
|
+
if Gem::Version.new(Async::WebSocket::VERSION) >= Gem::Version.new('0.9.0')
|
|
134
|
+
raise(
|
|
135
|
+
"Incompatible version of async-websocket, #{Async::WebSocket::VERSION}, " \
|
|
136
|
+
"use \"gem 'async-websocket', '~> 0.8.0'\"."
|
|
137
|
+
)
|
|
138
|
+
end
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Concurrency
|
|
4
5
|
autoload :Async, 'slack/real_time/concurrency/async'
|
|
5
|
-
autoload :Eventmachine, 'slack/real_time/concurrency/eventmachine'
|
|
6
|
-
autoload :Celluloid, 'slack/real_time/concurrency/celluloid'
|
|
7
6
|
end
|
|
8
7
|
end
|
|
9
8
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Config
|
|
@@ -16,7 +17,8 @@ module Slack
|
|
|
16
17
|
logger
|
|
17
18
|
].freeze
|
|
18
19
|
|
|
19
|
-
attr_accessor(*Config::ATTRIBUTES)
|
|
20
|
+
attr_accessor(*Config::ATTRIBUTES - [:concurrency])
|
|
21
|
+
attr_writer :concurrency
|
|
20
22
|
|
|
21
23
|
def reset
|
|
22
24
|
self.websocket_ping = 30
|
|
@@ -36,15 +38,9 @@ module Slack
|
|
|
36
38
|
private
|
|
37
39
|
|
|
38
40
|
def detect_concurrency
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
rescue LoadError, NameError
|
|
43
|
-
false # could not be loaded, missing dependencies
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
raise NoConcurrencyError, 'Missing concurrency. Add async-websocket, faye-websocket or celluloid-io to your Gemfile.'
|
|
41
|
+
Slack::RealTime::Concurrency.const_get(:Async)
|
|
42
|
+
rescue LoadError, NameError
|
|
43
|
+
raise NoConcurrencyError, 'Missing concurrency. Add async-websocket to your Gemfile.'
|
|
48
44
|
end
|
|
49
45
|
end
|
|
50
46
|
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
class Socket
|
|
4
|
-
attr_accessor :url
|
|
5
|
-
attr_accessor :options
|
|
5
|
+
attr_accessor :url, :options
|
|
6
6
|
attr_reader :driver
|
|
7
|
-
attr_reader :logger
|
|
8
|
-
protected :logger
|
|
9
7
|
|
|
10
8
|
def initialize(url, options = {})
|
|
11
9
|
@url = url
|
|
12
|
-
@options = options
|
|
10
|
+
@options = options.dup
|
|
13
11
|
@driver = nil
|
|
14
|
-
@logger = options.delete(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
|
|
12
|
+
@logger = @options.delete(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
|
|
13
|
+
@last_message_at = nil
|
|
15
14
|
end
|
|
16
15
|
|
|
17
16
|
def send_data(message)
|
|
18
17
|
logger.debug("#{self.class}##{__method__}") { message }
|
|
19
18
|
case message
|
|
20
|
-
when Numeric then driver.text(message.to_s)
|
|
21
|
-
when String then driver.text(message)
|
|
22
|
-
when Array then driver.binary(message)
|
|
19
|
+
when Numeric then @driver.text(message.to_s)
|
|
20
|
+
when String then @driver.text(message)
|
|
21
|
+
when Array then @driver.binary(message)
|
|
23
22
|
else false
|
|
24
23
|
end
|
|
25
24
|
end
|
|
@@ -28,24 +27,31 @@ module Slack
|
|
|
28
27
|
return if connected?
|
|
29
28
|
|
|
30
29
|
connect
|
|
31
|
-
logger.debug("#{self.class}##{__method__}") { driver.class }
|
|
30
|
+
logger.debug("#{self.class}##{__method__}") { @driver.class }
|
|
31
|
+
|
|
32
|
+
@driver.on :message do
|
|
33
|
+
@last_message_at = current_time
|
|
34
|
+
end
|
|
32
35
|
|
|
33
|
-
yield driver if block_given?
|
|
36
|
+
yield @driver if block_given?
|
|
34
37
|
end
|
|
35
38
|
|
|
39
|
+
# Gracefully shut down the connection.
|
|
36
40
|
def disconnect!
|
|
37
|
-
driver.close
|
|
41
|
+
@driver.close
|
|
42
|
+
ensure
|
|
43
|
+
close
|
|
38
44
|
end
|
|
39
45
|
|
|
40
46
|
def connected?
|
|
41
|
-
|
|
47
|
+
!@driver.nil?
|
|
42
48
|
end
|
|
43
49
|
|
|
44
50
|
def start_sync(client)
|
|
45
51
|
thread = start_async(client)
|
|
46
|
-
thread
|
|
52
|
+
thread&.join
|
|
47
53
|
rescue Interrupt
|
|
48
|
-
thread
|
|
54
|
+
thread&.exit
|
|
49
55
|
end
|
|
50
56
|
|
|
51
57
|
# @return [#join]
|
|
@@ -53,12 +59,34 @@ module Slack
|
|
|
53
59
|
raise NotImplementedError, "Expected #{self.class} to implement #{__method__}."
|
|
54
60
|
end
|
|
55
61
|
|
|
62
|
+
def restart_async(_client, _url)
|
|
63
|
+
raise NotImplementedError, "Expected #{self.class} to implement #{__method__}."
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def time_since_last_message
|
|
67
|
+
return 0 unless @last_message_at
|
|
68
|
+
|
|
69
|
+
current_time - @last_message_at
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def current_time
|
|
73
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
74
|
+
end
|
|
75
|
+
|
|
56
76
|
def close
|
|
77
|
+
# When you call `driver.emit(:close)`, it will typically end up calling `client.close`
|
|
78
|
+
# which will call `@socket.close` and end up back here. In order to break this infinite
|
|
79
|
+
# recursion, we check and set `@driver = nil` before invoking `client.close`.
|
|
80
|
+
return unless (driver = @driver)
|
|
81
|
+
|
|
57
82
|
@driver = nil
|
|
83
|
+
driver.emit(:close)
|
|
58
84
|
end
|
|
59
85
|
|
|
60
86
|
protected
|
|
61
87
|
|
|
88
|
+
attr_reader :logger
|
|
89
|
+
|
|
62
90
|
def addr
|
|
63
91
|
URI(url).host
|
|
64
92
|
end
|
|
@@ -69,9 +97,9 @@ module Slack
|
|
|
69
97
|
|
|
70
98
|
def port
|
|
71
99
|
case (uri = URI(url)).scheme
|
|
72
|
-
when 'wss'
|
|
100
|
+
when 'wss', 'https'
|
|
73
101
|
URI::HTTPS::DEFAULT_PORT
|
|
74
|
-
when 'ws', 'http'
|
|
102
|
+
when 'ws', 'http'
|
|
75
103
|
URI::HTTP::DEFAULT_PORT
|
|
76
104
|
else
|
|
77
105
|
uri.port
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Stores
|
|
4
5
|
# Doesn't store anything.
|
|
5
6
|
class Base
|
|
6
|
-
|
|
7
|
+
class << self
|
|
8
|
+
attr_accessor :events
|
|
9
|
+
end
|
|
7
10
|
|
|
8
|
-
attr_accessor :users
|
|
9
|
-
attr_accessor :bots
|
|
10
|
-
attr_accessor :channels
|
|
11
|
-
attr_accessor :groups
|
|
12
|
-
attr_accessor :teams
|
|
13
|
-
attr_accessor :ims
|
|
11
|
+
attr_accessor :users, :bots, :channels, :groups, :teams, :ims
|
|
14
12
|
|
|
15
13
|
def self
|
|
16
14
|
nil
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Stores
|
|
4
5
|
# Only stores initial information.
|
|
5
6
|
class Starter < Base
|
|
6
|
-
attr_reader :self
|
|
7
|
-
|
|
8
|
-
attr_reader :team
|
|
7
|
+
attr_reader :self, :team
|
|
9
8
|
|
|
10
9
|
def initialize(attrs)
|
|
11
10
|
@team = Models::Team.new(attrs.team)
|
|
@@ -14,6 +13,21 @@ module Slack
|
|
|
14
13
|
|
|
15
14
|
### RealTime Events
|
|
16
15
|
|
|
16
|
+
# A shared channel invite was sent to a Slack user.
|
|
17
|
+
# @see https://api.slack.com/events/shared_channel_invite_received
|
|
18
|
+
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/shared_channel_invite_received.json
|
|
19
|
+
# on :shared_channel_invite_received do |data|
|
|
20
|
+
|
|
21
|
+
# An enterprise grid migration has started on an external workspace..
|
|
22
|
+
# @see https://api.slack.com/events/external_org_migration_started
|
|
23
|
+
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/external_org_migration_started.json
|
|
24
|
+
# on :external_org_migration_started do |data|
|
|
25
|
+
|
|
26
|
+
# An enterprise grid migration has finished on an external workspace..
|
|
27
|
+
# @see https://api.slack.com/events/external_org_migration_finished
|
|
28
|
+
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/external_org_migration_finished.json
|
|
29
|
+
# on :external_org_migration_finished do |data|
|
|
30
|
+
|
|
17
31
|
# A private channel was deleted.
|
|
18
32
|
# @see https://api.slack.com/events/group_deleted
|
|
19
33
|
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/group_deleted.json
|