slack-ruby-client 0.11.0 → 2.7.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 +5 -5
- data/.coveralls.yml +2 -0
- data/.github/FUNDING.yml +2 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/integration_test.yml +45 -0
- data/.github/workflows/lint.yml +14 -0
- data/.github/workflows/pr_lint.yml +21 -0
- data/.github/workflows/test.yml +56 -0
- data/.github/workflows/update_api.yml +81 -0
- data/.gitignore +7 -3
- data/.rubocop.yml +40 -2
- data/.rubocop_todo.yml +209 -55
- data/.ruby-version +1 -0
- data/CHANGELOG.md +257 -30
- data/CONTRIBUTING.md +44 -29
- data/Dangerfile +2 -0
- data/Gemfile +28 -6
- data/Gemfile.danger +6 -0
- data/LICENSE.md +1 -1
- data/README.md +473 -134
- data/RELEASING.md +2 -2
- data/Rakefile +2 -1
- data/SECURITY.md +9 -0
- data/UPGRADING.md +117 -3
- data/bin/commands/admin_analytics.rb +22 -0
- data/bin/commands/admin_apps.rb +57 -0
- data/bin/commands/admin_apps_activities.rb +32 -0
- data/bin/commands/admin_apps_approved.rb +24 -0
- data/bin/commands/admin_apps_config.rb +31 -0
- data/bin/commands/admin_apps_requests.rb +35 -0
- data/bin/commands/admin_apps_restricted.rb +24 -0
- data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
- data/bin/commands/admin_auth_policy.rb +45 -0
- data/bin/commands/admin_barriers.rb +53 -0
- data/bin/commands/admin_conversations.rb +260 -0
- data/bin/commands/admin_conversations_ekm.rb +23 -0
- data/bin/commands/admin_conversations_restrictAccess.rb +43 -0
- data/bin/commands/admin_emoji.rb +60 -0
- data/bin/commands/admin_functions.rb +23 -0
- data/bin/commands/admin_functions_permissions.rb +31 -0
- data/bin/commands/admin_inviteRequests.rb +42 -0
- data/bin/commands/admin_inviteRequests_approved.rb +22 -0
- data/bin/commands/admin_inviteRequests_denied.rb +22 -0
- data/bin/commands/admin_roles.rb +46 -0
- data/bin/commands/admin_teams.rb +33 -0
- data/bin/commands/admin_teams_admins.rb +22 -0
- data/bin/commands/admin_teams_owners.rb +22 -0
- data/bin/commands/admin_teams_settings.rb +70 -0
- data/bin/commands/admin_usergroups.rb +54 -0
- data/bin/commands/admin_users.rb +106 -0
- data/bin/commands/admin_users_session.rb +84 -0
- data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
- data/bin/commands/admin_workflows.rb +42 -0
- data/bin/commands/admin_workflows_collaborators.rb +31 -0
- data/bin/commands/admin_workflows_permissions.rb +21 -0
- data/bin/commands/admin_workflows_triggers_types_permissions.rb +31 -0
- data/bin/commands/api.rb +15 -9
- data/bin/commands/apps.rb +21 -0
- data/bin/commands/apps_activities.rb +32 -0
- data/bin/commands/apps_auth_external.rb +32 -0
- data/bin/commands/apps_connections.rb +19 -0
- data/bin/commands/apps_datastore.rb +116 -0
- data/bin/commands/apps_event_authorizations.rb +22 -0
- data/bin/commands/apps_manifest.rb +58 -0
- data/bin/commands/assistant_search.rb +27 -0
- data/bin/commands/assistant_threads.rb +45 -0
- data/bin/commands/auth.rb +22 -15
- data/bin/commands/auth_teams.rb +22 -0
- data/bin/commands/bookmarks.rb +60 -0
- data/bin/commands/bots.rb +16 -8
- data/bin/commands/calls.rb +58 -0
- data/bin/commands/calls_participants.rb +31 -0
- data/bin/commands/canvases.rb +41 -0
- data/bin/commands/canvases_access.rb +34 -0
- data/bin/commands/canvases_sections.rb +21 -0
- data/bin/commands/chat.rb +158 -99
- data/bin/commands/chat_scheduledMessages.rb +25 -0
- data/bin/commands/conversations.rb +241 -157
- data/bin/commands/conversations_canvases.rb +22 -0
- data/bin/commands/conversations_externalInvitePermissions.rb +22 -0
- data/bin/commands/conversations_requestSharedInvite.rb +48 -0
- data/bin/commands/dialog.rb +16 -9
- data/bin/commands/dnd.rb +47 -38
- data/bin/commands/emoji.rb +15 -7
- data/bin/commands/files.rb +113 -87
- data/bin/commands/files_comments.rb +16 -30
- data/bin/commands/files_remote.rb +84 -0
- data/bin/commands/functions.rb +31 -0
- data/bin/commands/functions_distributions_permissions.rb +61 -0
- data/bin/commands/functions_workflows_steps.rb +23 -0
- data/bin/commands/functions_workflows_steps_responses.rb +23 -0
- data/bin/commands/migration.rb +17 -9
- data/bin/commands/oauth.rb +19 -24
- data/bin/commands/oauth_v2.rb +35 -0
- data/bin/commands/openid_connect.rb +33 -0
- data/bin/commands/pins.rb +33 -30
- data/bin/commands/reactions.rb +53 -45
- data/bin/commands/reminders.rb +54 -41
- data/bin/commands/rtm.rb +16 -22
- data/bin/commands/search.rb +44 -33
- data/bin/commands/stars.rb +39 -29
- data/bin/commands/team.rb +50 -34
- data/bin/commands/team_billing.rb +19 -0
- data/bin/commands/team_externalTeams.rb +35 -0
- data/bin/commands/team_preferences.rb +19 -0
- data/bin/commands/team_profile.rb +15 -8
- data/bin/commands/tooling_tokens.rb +20 -0
- data/bin/commands/usergroups.rb +69 -53
- data/bin/commands/usergroups_users.rb +30 -19
- data/bin/commands/users.rb +114 -84
- data/bin/commands/users_admin.rb +29 -22
- data/bin/commands/users_discoverableContacts.rb +20 -0
- data/bin/commands/users_prefs.rb +14 -7
- data/bin/commands/users_profile.rb +27 -20
- data/bin/commands/views.rb +56 -0
- data/bin/commands/workflows.rb +44 -0
- data/bin/commands/workflows_triggers_permissions.rb +60 -0
- data/bin/slack +50 -46
- data/examples/files_upload_v2/.env.example +1 -0
- data/examples/{hi_real_time → files_upload_v2}/Gemfile +2 -2
- data/examples/files_upload_v2/README.md +13 -0
- data/examples/files_upload_v2/files_upload_v2.rb +45 -0
- 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_eventmachine → hi_real_time_async_async}/Gemfile +2 -1
- data/examples/{hi_real_time_async_eventmachine → hi_real_time_async_async}/hi.rb +12 -7
- 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/examples/oauth_v2/.env.example +4 -0
- data/examples/oauth_v2/Gemfile +7 -0
- data/examples/oauth_v2/README.md +33 -0
- data/examples/oauth_v2/oauth_v2.rb +60 -0
- data/lib/slack/config.rb +2 -2
- data/lib/slack/events/config.rb +32 -0
- data/lib/slack/events/request.rb +76 -0
- data/lib/slack/logger.rb +6 -5
- data/lib/slack/messages/formatting.rb +66 -1
- data/lib/slack/messages/message.rb +1 -4
- data/lib/slack/real_time/api/message.rb +6 -3
- 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/templates/event_handler.erb +5 -1
- data/lib/slack/real_time/api/typing.rb +5 -2
- data/lib/slack/real_time/client.rb +117 -54
- data/lib/slack/real_time/concurrency/async.rb +142 -0
- data/lib/slack/real_time/concurrency.rb +2 -2
- data/lib/slack/real_time/config.rb +12 -13
- 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 +5 -0
- data/lib/slack/real_time/models/im.rb +1 -0
- data/lib/slack/real_time/models/{group.rb → mpim.rb} +2 -1
- 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 +3 -1
- data/lib/slack/real_time/socket.rb +49 -17
- data/lib/slack/real_time/stores/base.rb +28 -14
- data/lib/slack/real_time/stores/starter.rb +325 -287
- data/lib/slack/real_time/stores/store.rb +271 -186
- data/lib/slack/real_time/stores.rb +2 -7
- data/lib/slack/utils/security.rb +44 -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_activities.rb +53 -0
- data/lib/slack/web/api/endpoints/admin_apps_approved.rb +37 -0
- data/lib/slack/web/api/endpoints/admin_apps_config.rb +40 -0
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +53 -0
- data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +37 -0
- data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -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 +397 -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_emoji.rb +88 -0
- data/lib/slack/web/api/endpoints/admin_functions.rb +36 -0
- data/lib/slack/web/api/endpoints/admin_functions_permissions.rb +41 -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_roles.rb +73 -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 +167 -0
- data/lib/slack/web/api/endpoints/admin_users_session.rb +121 -0
- data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
- data/lib/slack/web/api/endpoints/admin_workflows.rb +67 -0
- data/lib/slack/web/api/endpoints/admin_workflows_collaborators.rb +42 -0
- data/lib/slack/web/api/endpoints/admin_workflows_permissions.rb +26 -0
- data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +41 -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_activities.rb +54 -0
- data/lib/slack/web/api/endpoints/apps_auth_external.rb +41 -0
- data/lib/slack/web/api/endpoints/apps_connections.rb +21 -0
- data/lib/slack/web/api/endpoints/apps_datastore.rb +181 -0
- data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +34 -0
- data/lib/slack/web/api/endpoints/apps_manifest.rb +79 -0
- data/lib/slack/web/api/endpoints/assistant_search.rb +44 -0
- data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -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/bookmarks.rb +90 -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/canvases.rb +54 -0
- data/lib/slack/web/api/endpoints/canvases_access.rb +47 -0
- data/lib/slack/web/api/endpoints/canvases_sections.rb +27 -0
- data/lib/slack/web/api/endpoints/chat.rb +172 -87
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +40 -0
- data/lib/slack/web/api/endpoints/conversations.rb +190 -64
- data/lib/slack/web/api/endpoints/conversations_canvases.rb +28 -0
- data/lib/slack/web/api/endpoints/conversations_externalInvitePermissions.rb +31 -0
- data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
- data/lib/slack/web/api/endpoints/dialog.rb +6 -10
- data/lib/slack/web/api/endpoints/dnd.rb +11 -5
- data/lib/slack/web/api/endpoints/emoji.rb +3 -0
- data/lib/slack/web/api/endpoints/files.rb +85 -36
- data/lib/slack/web/api/endpoints/files_comments.rb +4 -36
- data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
- data/lib/slack/web/api/endpoints/functions.rb +43 -0
- data/lib/slack/web/api/endpoints/functions_distributions_permissions.rb +84 -0
- data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +30 -0
- data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +30 -0
- data/lib/slack/web/api/endpoints/migration.rb +6 -3
- data/lib/slack/web/api/endpoints/oauth.rb +10 -32
- 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 +11 -18
- data/lib/slack/web/api/endpoints/reactions.rb +31 -20
- data/lib/slack/web/api/endpoints/reminders.rb +25 -12
- data/lib/slack/web/api/endpoints/rtm.rb +4 -22
- data/lib/slack/web/api/endpoints/search.rb +33 -18
- data/lib/slack/web/api/endpoints/stars.rb +23 -10
- data/lib/slack/web/api/endpoints/team.rb +38 -7
- data/lib/slack/web/api/endpoints/team_billing.rb +21 -0
- data/lib/slack/web/api/endpoints/team_externalTeams.rb +53 -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 +44 -25
- data/lib/slack/web/api/endpoints/usergroups_users.rb +23 -14
- data/lib/slack/web/api/endpoints/users.rb +57 -18
- data/lib/slack/web/api/endpoints/users_admin.rb +5 -2
- data/lib/slack/web/api/endpoints/users_discoverableContacts.rb +24 -0
- data/lib/slack/web/api/endpoints/users_prefs.rb +2 -0
- data/lib/slack/web/api/endpoints/users_profile.rb +11 -9
- data/lib/slack/web/api/endpoints/views.rb +86 -0
- data/lib/slack/web/api/endpoints/workflows.rb +63 -0
- data/lib/slack/web/api/endpoints/workflows_triggers_permissions.rb +87 -0
- data/lib/slack/web/api/endpoints.rb +136 -12
- 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 +1396 -0
- data/lib/slack/web/api/helpers/files.rb +97 -0
- data/lib/slack/web/api/helpers.rb +13 -0
- data/lib/slack/web/api/mixins/conversations.id.rb +47 -0
- data/lib/slack/web/api/mixins/ids.id.rb +4 -3
- data/lib/slack/web/api/mixins/users.id.rb +18 -4
- data/lib/slack/web/api/mixins/users.search.rb +3 -1
- data/lib/slack/web/api/mixins.rb +2 -2
- data/lib/slack/web/api/options.rb +26 -0
- data/lib/slack/web/api/patches/.gitkeep +0 -0
- data/lib/slack/web/api/templates/command.erb +19 -12
- 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 +23 -3
- data/lib/slack/web/api/templates/method_spec.erb +40 -3
- data/lib/slack/web/client.rb +4 -1
- data/lib/slack/web/config.rb +9 -2
- data/lib/slack/web/faraday/connection.rb +11 -20
- data/lib/slack/web/faraday/options.rb +24 -0
- data/lib/slack/web/faraday/request.rb +6 -1
- data/lib/slack/web/faraday/response/raise_error.rb +14 -8
- 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 +18 -6
- 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 +51 -21
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +43 -17
- data/slack-ruby-client.gemspec +10 -14
- metadata +191 -307
- data/.travis.yml +0 -30
- data/bin/commands/apps_permissions.rb +0 -22
- data/bin/commands/channels.rb +0 -175
- data/bin/commands/groups.rb +0 -172
- data/bin/commands/im.rb +0 -67
- data/bin/commands/mpim.rb +0 -63
- data/bin/commands.rb +0 -33
- 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/hi.rb +0 -36
- data/examples/hi_real_time_async_eventmachine/Procfile +0 -2
- data/lib/slack/real_time/concurrency/celluloid.rb +0 -117
- data/lib/slack/real_time/concurrency/eventmachine.rb +0 -60
- data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -35
- data/lib/slack/web/api/endpoints/channels.rb +0 -265
- data/lib/slack/web/api/endpoints/groups.rb +0 -255
- data/lib/slack/web/api/endpoints/im.rb +0 -113
- data/lib/slack/web/api/endpoints/mpim.rb +0 -98
- data/lib/slack/web/api/endpoints/presence.rb +0 -23
- data/lib/slack/web/api/mixins/channels.id.json +0 -20
- data/lib/slack/web/api/mixins/channels.id.rb +0 -26
- 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/dialog.1.open-json-support.patch +0 -17
- data/lib/slack/web/api/templates/commands.erb +0 -5
- data/screenshots/register-bot.png +0 -0
- data/spec/fixtures/slack/web/429_error.yml +0 -85
- data/spec/fixtures/slack/web/auth_test_error.yml +0 -48
- data/spec/fixtures/slack/web/auth_test_success.yml +0 -57
- data/spec/fixtures/slack/web/channels_info.yml +0 -46
- data/spec/fixtures/slack/web/groups_info.yml +0 -43
- data/spec/fixtures/slack/web/paginated_users_list.yml +0 -181
- data/spec/fixtures/slack/web/rtm_connect.yml +0 -70
- data/spec/fixtures/slack/web/rtm_start.yml +0 -104
- data/spec/fixtures/slack/web/users_info.yml +0 -130
- data/spec/fixtures/slack/web/users_list.yml +0 -72
- data/spec/integration/integration_spec.rb +0 -139
- data/spec/slack/config_spec.rb +0 -14
- data/spec/slack/messages/formatting_spec.rb +0 -43
- data/spec/slack/real_time/api/message_spec.rb +0 -15
- data/spec/slack/real_time/api/ping_spec.rb +0 -15
- data/spec/slack/real_time/api/typing_spec.rb +0 -15
- data/spec/slack/real_time/client_spec.rb +0 -425
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +0 -62
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +0 -47
- data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -19
- data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -44
- data/spec/slack/real_time/event_handlers/channel_spec.rb +0 -116
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -15
- data/spec/slack/real_time/event_handlers/group_spec.rb +0 -90
- data/spec/slack/real_time/event_handlers/im_spec.rb +0 -47
- data/spec/slack/real_time/event_handlers/team_spec.rb +0 -62
- data/spec/slack/real_time/event_handlers/user_spec.rb +0 -63
- data/spec/slack/real_time/rtm_connect_spec.rb +0 -13
- data/spec/slack/real_time/rtm_start_spec.rb +0 -13
- data/spec/slack/real_time/store_spec.rb +0 -11
- data/spec/slack/slack_spec.rb +0 -58
- data/spec/slack/version_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/api_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +0 -15
- data/spec/slack/web/api/endpoints/bots_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -100
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -25
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -105
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -28
- data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +0 -11
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -33
- data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -12
- data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -34
- data/spec/slack/web/api/endpoints/files_spec.rb +0 -43
- data/spec/slack/web/api/endpoints/im_spec.rb +0 -38
- data/spec/slack/web/api/endpoints/migration_spec.rb +0 -12
- data/spec/slack/web/api/endpoints/mpim_spec.rb +0 -38
- data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -29
- data/spec/slack/web/api/endpoints/pins_spec.rb +0 -22
- data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -17
- data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -30
- data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/search_spec.rb +0 -22
- data/spec/slack/web/api/endpoints/stars_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/team_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -27
- data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -20
- data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -17
- data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -7
- data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -7
- data/spec/slack/web/api/error_spec.rb +0 -14
- data/spec/slack/web/api/errors/slack_error_spec.rb +0 -14
- data/spec/slack/web/api/mixins/channels_spec.rb +0 -31
- data/spec/slack/web/api/mixins/groups_spec.rb +0 -31
- data/spec/slack/web/api/mixins/users_spec.rb +0 -39
- data/spec/slack/web/api/pagination/cursor_spec.rb +0 -70
- data/spec/slack/web/client_spec.rb +0 -174
- data/spec/spec_helper.rb +0 -14
- data/spec/support/queue_with_timeout.rb +0 -34
- data/spec/support/real_time/concurrency/mock.rb +0 -30
- data/spec/support/real_time/connected_client.rb +0 -21
- data/spec/support/real_time/event.rb +0 -11
- data/spec/support/token.rb +0 -10
- data/spec/support/vcr.rb +0 -9
- /data/examples/{hi_real_time_async_celluloid → hi_real_time_async_async}/Procfile +0 -0
@@ -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,4 +1,8 @@
|
|
1
1
|
# <%= desc %>
|
2
2
|
# @see https://api.slack.com/events/<%= name %>
|
3
3
|
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/events/<%= name %>.json
|
4
|
-
|
4
|
+
<% if hook %>
|
5
|
+
<%= hook %>
|
6
|
+
<% else %>
|
7
|
+
# on :<%= name %> do |data|
|
8
|
+
<% end %>
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module RealTime
|
3
4
|
module Api
|
@@ -6,9 +7,11 @@ 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
|
+
raise ArgumentError, 'Required arguments :channel missing' if options[:channel].nil?
|
14
|
+
|
12
15
|
send_json({ type: 'typing', id: next_id }.merge(options))
|
13
16
|
end
|
14
17
|
end
|
@@ -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
|
@@ -9,19 +11,9 @@ module Slack
|
|
9
11
|
include Api::Message
|
10
12
|
include Api::Typing
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
class << self
|
15
|
-
attr_accessor :events
|
16
|
-
end
|
14
|
+
attr_accessor :web_client, :store, :url, *Config::ATTRIBUTES
|
17
15
|
|
18
|
-
|
19
|
-
attr_accessor :store
|
20
|
-
attr_accessor :url
|
21
|
-
attr_accessor(*Config::ATTRIBUTES)
|
22
|
-
|
23
|
-
protected :logger, :logger=
|
24
|
-
protected :store_class, :store_class=
|
16
|
+
protected :store_class, :store_class=, :store_options, :store_options=
|
25
17
|
|
26
18
|
def initialize(options = {})
|
27
19
|
@callbacks = Hash.new { |h, k| h[k] = [] }
|
@@ -33,9 +25,9 @@ module Slack
|
|
33
25
|
@web_client = Slack::Web::Client.new(token: token, logger: logger)
|
34
26
|
end
|
35
27
|
|
36
|
-
|
28
|
+
[:self, :team, *Stores::Base::CACHES].each do |store_method|
|
37
29
|
define_method store_method do
|
38
|
-
store
|
30
|
+
store&.send(store_method)
|
39
31
|
end
|
40
32
|
end
|
41
33
|
|
@@ -46,26 +38,27 @@ module Slack
|
|
46
38
|
|
47
39
|
# Start RealTime client and block until it disconnects.
|
48
40
|
def start!(&block)
|
49
|
-
@callback = block if
|
50
|
-
|
41
|
+
@callback = block if block
|
42
|
+
build_socket
|
51
43
|
@socket.start_sync(self)
|
52
44
|
end
|
53
45
|
|
54
46
|
# Start RealTime client and return immediately.
|
55
47
|
# The RealTime::Client will run in the background.
|
56
48
|
def start_async(&block)
|
57
|
-
@callback = block if
|
58
|
-
|
49
|
+
@callback = block if block
|
50
|
+
build_socket
|
59
51
|
@socket.start_async(self)
|
60
52
|
end
|
61
53
|
|
62
54
|
def stop!
|
63
55
|
raise ClientNotStartedError unless started?
|
64
|
-
|
56
|
+
|
57
|
+
@socket&.disconnect!
|
65
58
|
end
|
66
59
|
|
67
60
|
def started?
|
68
|
-
@socket
|
61
|
+
@socket&.connected?
|
69
62
|
end
|
70
63
|
|
71
64
|
class << self
|
@@ -80,48 +73,105 @@ module Slack
|
|
80
73
|
|
81
74
|
def run_loop
|
82
75
|
@socket.connect! do |driver|
|
83
|
-
@callback.call(driver) if @callback
|
84
|
-
|
85
76
|
driver.on :open do |event|
|
86
|
-
logger.debug("#{self
|
87
|
-
|
77
|
+
logger.debug("#{self}##{__method__}") { event.class.name }
|
78
|
+
open_event(event)
|
88
79
|
callback(event, :open)
|
89
80
|
end
|
90
81
|
|
91
82
|
driver.on :message do |event|
|
92
|
-
logger.debug("#{self
|
83
|
+
logger.debug("#{self}##{__method__}") { "#{event.class}, #{event.data}" }
|
93
84
|
dispatch(event)
|
94
85
|
end
|
95
86
|
|
96
87
|
driver.on :close do |event|
|
97
|
-
logger.debug("#{self
|
88
|
+
logger.debug("#{self}##{__method__}") { event.class.name }
|
98
89
|
callback(event, :close)
|
99
90
|
close(event)
|
100
91
|
callback(event, :closed)
|
101
92
|
end
|
93
|
+
|
94
|
+
# This must be called last to ensure any events are registered before invoking user code.
|
95
|
+
@callback&.call(driver)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Ensure the server is running, and ping the remote server if no other messages were sent.
|
100
|
+
def keep_alive?
|
101
|
+
# We can't ping the remote server if we aren't connected.
|
102
|
+
return false if @socket.nil? || !@socket.connected?
|
103
|
+
|
104
|
+
time_since_last_message = @socket.time_since_last_message
|
105
|
+
|
106
|
+
# If the server responded within the specified time, we are okay:
|
107
|
+
return true if time_since_last_message < websocket_ping
|
108
|
+
|
109
|
+
# If the server has not responded for a while:
|
110
|
+
return false if time_since_last_message > (websocket_ping * 2)
|
111
|
+
|
112
|
+
# Kick off the next ping message:
|
113
|
+
ping
|
114
|
+
|
115
|
+
true
|
116
|
+
end
|
117
|
+
|
118
|
+
# Check if the remote server is responsive, and if not, restart the connection.
|
119
|
+
def run_ping!
|
120
|
+
return if keep_alive?
|
121
|
+
|
122
|
+
logger.warn(to_s) { 'is offline' }
|
123
|
+
|
124
|
+
restart_async
|
125
|
+
rescue Slack::Web::Api::Errors::SlackError => e
|
126
|
+
# stop pinging if bot was uninstalled
|
127
|
+
case e.message
|
128
|
+
when 'account_inactive', 'invalid_auth'
|
129
|
+
logger.warn(to_s) { e.message }
|
130
|
+
raise e
|
131
|
+
end
|
132
|
+
logger.debug("#{self}##{__method__}") { e }
|
133
|
+
rescue StandardError => e
|
134
|
+
# disregard all ping worker failures, keep pinging
|
135
|
+
logger.debug("#{self}##{__method__}") { e }
|
136
|
+
end
|
137
|
+
|
138
|
+
def run_ping?
|
139
|
+
!websocket_ping.nil? && websocket_ping.positive?
|
140
|
+
end
|
141
|
+
|
142
|
+
def websocket_ping_timer
|
143
|
+
websocket_ping / 2
|
144
|
+
end
|
145
|
+
|
146
|
+
def to_s
|
147
|
+
if store&.team
|
148
|
+
"id=#{store.team.id}, name=#{store.team.name}, domain=#{store.team.domain}"
|
149
|
+
else
|
150
|
+
super
|
102
151
|
end
|
103
152
|
end
|
104
153
|
|
105
154
|
protected
|
106
155
|
|
156
|
+
def restart_async
|
157
|
+
logger.debug("#{self}##{__method__}")
|
158
|
+
@socket.close
|
159
|
+
start = web_client.rtm_connect(start_options)
|
160
|
+
data = Slack::Messages::Message.new(start)
|
161
|
+
@url = data.url
|
162
|
+
@store = store_class.new(data, store_options.to_h) if store_class
|
163
|
+
@socket.restart_async(self, @url)
|
164
|
+
end
|
165
|
+
|
107
166
|
# @return [Slack::RealTime::Socket]
|
108
167
|
def build_socket
|
109
168
|
raise ClientAlreadyStartedError if started?
|
110
|
-
|
169
|
+
|
170
|
+
start = web_client.rtm_connect(start_options)
|
111
171
|
data = Slack::Messages::Message.new(start)
|
112
172
|
@url = data.url
|
113
|
-
@store =
|
114
|
-
socket_class.new(@url, socket_options)
|
115
|
-
end
|
116
|
-
|
117
|
-
def rtm_start_method
|
118
|
-
if start_method
|
119
|
-
start_method
|
120
|
-
elsif @store_class && @store_class <= Slack::RealTime::Stores::Store
|
121
|
-
:rtm_start
|
122
|
-
else
|
123
|
-
:rtm_connect
|
124
|
-
end
|
173
|
+
@store = store_class.new(data, store_options.to_h) if store_class
|
174
|
+
@socket = socket_class.new(@url, socket_options)
|
125
175
|
end
|
126
176
|
|
127
177
|
def socket_options
|
@@ -133,23 +183,22 @@ module Slack
|
|
133
183
|
end
|
134
184
|
|
135
185
|
attr_reader :callbacks
|
186
|
+
|
136
187
|
def socket_class
|
137
188
|
concurrency::Socket
|
138
189
|
end
|
139
190
|
|
140
191
|
def send_json(data)
|
141
192
|
raise ClientNotStartedError unless started?
|
142
|
-
|
193
|
+
|
194
|
+
logger.debug("#{self}##{__method__}") { data }
|
143
195
|
@socket.send_data(data.to_json)
|
144
196
|
end
|
145
197
|
|
146
|
-
def
|
198
|
+
def open_event(_event); end
|
147
199
|
|
148
200
|
def close(_event)
|
149
|
-
socket
|
150
|
-
@socket = nil
|
151
|
-
|
152
|
-
[socket, socket_class].each do |s|
|
201
|
+
[@socket, socket_class].each do |s|
|
153
202
|
s.close if s.respond_to?(:close)
|
154
203
|
end
|
155
204
|
end
|
@@ -157,50 +206,64 @@ module Slack
|
|
157
206
|
def callback(event, type)
|
158
207
|
callbacks = self.callbacks[type.to_s]
|
159
208
|
return false unless callbacks
|
209
|
+
|
160
210
|
callbacks.each do |c|
|
161
211
|
c.call(event)
|
162
212
|
end
|
163
213
|
true
|
164
214
|
rescue StandardError => e
|
165
|
-
logger.error e
|
215
|
+
logger.error("#{self}##{__method__}") { e }
|
166
216
|
false
|
167
217
|
end
|
168
218
|
|
169
219
|
def dispatch(event)
|
170
220
|
return false unless event.data
|
221
|
+
|
171
222
|
data = Slack::Messages::Message.new(JSON.parse(event.data))
|
172
223
|
type = data.type
|
173
224
|
return false unless type
|
225
|
+
|
174
226
|
type = type.to_s
|
175
|
-
logger.debug("#{self
|
227
|
+
logger.debug("#{self}##{__method__}") { data.to_s }
|
176
228
|
run_handlers(type, data) if @store
|
177
229
|
run_callbacks(type, data)
|
178
230
|
rescue StandardError => e
|
179
|
-
logger.error e
|
231
|
+
logger.error("#{self}##{__method__}") { e }
|
180
232
|
false
|
181
233
|
end
|
182
234
|
|
183
235
|
def run_handlers(type, data)
|
184
236
|
handlers = store.class.events[type.to_s]
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
237
|
+
case async_handlers
|
238
|
+
when :all
|
239
|
+
@socket.run_async { handlers_loop(handlers, data) }
|
240
|
+
when :none
|
241
|
+
handlers_loop(handlers, data)
|
242
|
+
else
|
243
|
+
raise Config::InvalidAsyncHandlersError,
|
244
|
+
"Invalid value '#{async_handlers.inspect}' for config#async_handlers, must be :all or :none."
|
189
245
|
end
|
190
246
|
rescue StandardError => e
|
191
|
-
logger.error e
|
247
|
+
logger.error("#{self}##{__method__}") { e }
|
192
248
|
false
|
193
249
|
end
|
194
250
|
|
251
|
+
def handlers_loop(handlers, data)
|
252
|
+
handlers.each do |handler|
|
253
|
+
store.instance_exec(data, self, &handler)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
195
257
|
def run_callbacks(type, data)
|
196
258
|
callbacks = self.callbacks[type]
|
197
259
|
return false unless callbacks
|
260
|
+
|
198
261
|
callbacks.each do |c|
|
199
262
|
c.call(data)
|
200
263
|
end
|
201
264
|
true
|
202
265
|
rescue StandardError => e
|
203
|
-
logger.error e
|
266
|
+
logger.error("#{self}##{__method__}") { e }
|
204
267
|
false
|
205
268
|
end
|
206
269
|
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'async/websocket'
|
3
|
+
require 'async/notification'
|
4
|
+
require 'async/clock'
|
5
|
+
|
6
|
+
module Slack
|
7
|
+
module RealTime
|
8
|
+
module Concurrency
|
9
|
+
module Async
|
10
|
+
class Client < ::Async::WebSocket::Client
|
11
|
+
extend ::Forwardable
|
12
|
+
def_delegators :@driver, :on, :text, :binary, :emit
|
13
|
+
end
|
14
|
+
|
15
|
+
class Socket < Slack::RealTime::Socket
|
16
|
+
attr_reader :client
|
17
|
+
|
18
|
+
def start_sync(client)
|
19
|
+
start_reactor(client).wait
|
20
|
+
end
|
21
|
+
|
22
|
+
def start_async(client)
|
23
|
+
Thread.new do
|
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
|
57
|
+
end
|
58
|
+
|
59
|
+
@ping_task&.stop
|
60
|
+
end
|
61
|
+
end
|
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 run_async(&block)
|
71
|
+
::Async.run(&block)
|
72
|
+
end
|
73
|
+
|
74
|
+
def current_time
|
75
|
+
::Async::Clock.now
|
76
|
+
end
|
77
|
+
|
78
|
+
def connect!
|
79
|
+
super
|
80
|
+
run_loop
|
81
|
+
end
|
82
|
+
|
83
|
+
# Kill the restart/ping loop.
|
84
|
+
def disconnect!
|
85
|
+
super
|
86
|
+
ensure
|
87
|
+
if (restart = @restart)
|
88
|
+
@restart = nil
|
89
|
+
restart.signal
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Close the socket.
|
94
|
+
def close
|
95
|
+
super
|
96
|
+
ensure
|
97
|
+
if @socket
|
98
|
+
@socket.close
|
99
|
+
@socket = nil
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def run_loop
|
104
|
+
while @driver&.next_event
|
105
|
+
# $stderr.puts event.inspect
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
protected
|
110
|
+
|
111
|
+
def build_ssl_context
|
112
|
+
OpenSSL::SSL::SSLContext.new(:TLSv1_2_client).tap do |ctx|
|
113
|
+
ctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_PEER)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def build_endpoint
|
118
|
+
endpoint = ::Async::IO::Endpoint.tcp(addr, port)
|
119
|
+
endpoint = ::Async::IO::SSLEndpoint.new(endpoint, ssl_context: build_ssl_context) if secure?
|
120
|
+
endpoint
|
121
|
+
end
|
122
|
+
|
123
|
+
def connect_socket
|
124
|
+
build_endpoint.connect
|
125
|
+
end
|
126
|
+
|
127
|
+
def connect
|
128
|
+
@socket = connect_socket
|
129
|
+
@driver = Client.new(@socket, url)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
if Gem::Version.new(Async::WebSocket::VERSION) >= Gem::Version.new('0.9.0')
|
138
|
+
raise(
|
139
|
+
"Incompatible version of async-websocket, #{Async::WebSocket::VERSION}, " \
|
140
|
+
"use \"gem 'async-websocket', '~> 0.8.0'\"."
|
141
|
+
)
|
142
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module RealTime
|
3
4
|
module Concurrency
|
4
|
-
autoload :
|
5
|
-
autoload :Celluloid, 'slack/real_time/concurrency/celluloid'
|
5
|
+
autoload :Async, 'slack/real_time/concurrency/async'
|
6
6
|
end
|
7
7
|
end
|
8
8
|
end
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Slack
|
2
3
|
module RealTime
|
3
4
|
module Config
|
4
5
|
class NoConcurrencyError < StandardError; end
|
6
|
+
class InvalidAsyncHandlersError < StandardError; end
|
5
7
|
|
6
8
|
extend self
|
7
9
|
|
@@ -10,23 +12,26 @@ module Slack
|
|
10
12
|
websocket_ping
|
11
13
|
websocket_proxy
|
12
14
|
concurrency
|
13
|
-
start_method
|
14
15
|
start_options
|
15
16
|
store_class
|
17
|
+
store_options
|
16
18
|
logger
|
19
|
+
async_handlers
|
17
20
|
].freeze
|
18
21
|
|
19
|
-
attr_accessor(*Config::ATTRIBUTES)
|
22
|
+
attr_accessor(*Config::ATTRIBUTES - [:concurrency])
|
23
|
+
attr_writer :concurrency
|
20
24
|
|
21
25
|
def reset
|
22
26
|
self.websocket_ping = 30
|
23
27
|
self.websocket_proxy = nil
|
24
28
|
self.token = nil
|
25
29
|
self.concurrency = method(:detect_concurrency)
|
26
|
-
self.start_method = nil
|
27
30
|
self.start_options = { request: { timeout: 180 } }
|
28
|
-
self.store_class = Slack::RealTime::
|
31
|
+
self.store_class = Slack::RealTime::Stores::Starter
|
32
|
+
self.store_options = {}
|
29
33
|
self.logger = nil
|
34
|
+
self.async_handlers = :none
|
30
35
|
end
|
31
36
|
|
32
37
|
def concurrency
|
@@ -36,15 +41,9 @@ module Slack
|
|
36
41
|
private
|
37
42
|
|
38
43
|
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 faye-websocket or celluloid-io to your Gemfile.'
|
44
|
+
Slack::RealTime::Concurrency.const_get(:Async)
|
45
|
+
rescue LoadError, NameError
|
46
|
+
raise NoConcurrencyError, 'Missing concurrency. Add async-websocket to your Gemfile.'
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'models/base'
|
2
4
|
require_relative 'models/user'
|
3
5
|
require_relative 'models/bot'
|
4
6
|
require_relative 'models/channel'
|
5
|
-
require_relative 'models/group'
|
6
7
|
require_relative 'models/team'
|
7
8
|
require_relative 'models/im'
|
9
|
+
require_relative 'models/mpim'
|