slack-ruby-client 0.14.2 → 0.15.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 +23 -7
- data/.rubocop_todo.yml +103 -43
- data/.travis.yml +0 -1
- data/CHANGELOG.md +39 -2
- data/CONTRIBUTING.md +24 -6
- data/Dangerfile +2 -1
- data/Gemfile +10 -3
- data/README.md +90 -30
- data/Rakefile +1 -0
- data/UPGRADING.md +16 -0
- data/bin/commands.rb +24 -0
- data/bin/commands/admin_apps.rb +27 -0
- data/bin/commands/admin_apps_approved.rb +17 -0
- data/bin/commands/admin_apps_requests.rb +16 -0
- data/bin/commands/admin_apps_restricted.rb +17 -0
- data/bin/commands/admin_conversations.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 +97 -0
- data/bin/commands/admin_users_session.rb +16 -0
- data/bin/commands/api.rb +3 -2
- data/bin/commands/apps.rb +3 -2
- data/bin/commands/apps_permissions.rb +5 -4
- data/bin/commands/apps_permissions_resources.rb +3 -2
- data/bin/commands/apps_permissions_scopes.rb +3 -2
- data/bin/commands/apps_permissions_users.rb +5 -4
- data/bin/commands/auth.rb +5 -4
- data/bin/commands/bots.rb +3 -2
- data/bin/commands/calls.rb +52 -0
- data/bin/commands/calls_participants.rb +25 -0
- data/bin/commands/channels.rb +31 -30
- data/bin/commands/chat.rb +36 -32
- data/bin/commands/chat_scheduledMessages.rb +3 -2
- data/bin/commands/conversations.rb +36 -36
- data/bin/commands/dialog.rb +3 -2
- data/bin/commands/dnd.rb +9 -8
- data/bin/commands/emoji.rb +3 -2
- data/bin/commands/files.rb +14 -12
- data/bin/commands/files_comments.rb +3 -2
- data/bin/commands/files_remote.rb +78 -0
- data/bin/commands/groups.rb +33 -32
- data/bin/commands/im.rb +13 -12
- data/bin/commands/migration.rb +3 -2
- data/bin/commands/mpim.rb +11 -10
- data/bin/commands/oauth.rb +6 -5
- data/bin/commands/oauth_v2.rb +17 -0
- data/bin/commands/pins.rb +7 -8
- data/bin/commands/reactions.rb +10 -11
- data/bin/commands/reminders.rb +11 -10
- data/bin/commands/rtm.rb +5 -4
- data/bin/commands/search.rb +7 -6
- data/bin/commands/stars.rb +7 -6
- data/bin/commands/team.rb +10 -8
- data/bin/commands/team_profile.rb +3 -2
- data/bin/commands/usergroups.rb +11 -10
- data/bin/commands/usergroups_users.rb +5 -4
- data/bin/commands/users.rb +21 -20
- data/bin/commands/users_admin.rb +1 -0
- data/bin/commands/users_prefs.rb +1 -0
- data/bin/commands/users_profile.rb +5 -4
- data/bin/commands/views.rb +48 -0
- data/bin/slack +1 -2
- data/examples/hi_real_time/Gemfile +1 -0
- data/examples/hi_real_time/hi.rb +7 -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_real_time_async_celluloid/Gemfile +1 -0
- data/examples/hi_real_time_async_celluloid/hi.rb +7 -3
- data/examples/hi_real_time_async_eventmachine/Gemfile +1 -0
- data/examples/hi_real_time_async_eventmachine/hi.rb +7 -3
- 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-ruby-client.rb +4 -4
- data/lib/slack.rb +1 -0
- data/lib/slack/config.rb +1 -0
- data/lib/slack/events/config.rb +1 -0
- data/lib/slack/events/request.rb +3 -1
- 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 +46 -22
- data/lib/slack/real_time/concurrency.rb +1 -0
- data/lib/slack/real_time/concurrency/async.rb +18 -9
- data/lib/slack/real_time/concurrency/celluloid.rb +10 -4
- data/lib/slack/real_time/concurrency/eventmachine.rb +9 -6
- data/lib/slack/real_time/config.rb +6 -1
- data/lib/slack/real_time/models.rb +1 -0
- 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/socket.rb +16 -13
- data/lib/slack/real_time/stores.rb +1 -0
- data/lib/slack/real_time/stores/base.rb +4 -1
- data/lib/slack/real_time/stores/starter.rb +11 -0
- data/lib/slack/real_time/stores/store.rb +26 -25
- data/lib/slack/version.rb +2 -1
- data/lib/slack/web/api/endpoints.rb +48 -0
- data/lib/slack/web/api/endpoints/admin_apps.rb +42 -0
- data/lib/slack/web/api/endpoints/admin_apps_approved.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_apps_restricted.rb +35 -0
- data/lib/slack/web/api/endpoints/admin_conversations.rb +30 -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 +28 -0
- data/lib/slack/web/api/endpoints/api.rb +2 -1
- data/lib/slack/web/api/endpoints/apps.rb +2 -1
- data/lib/slack/web/api/endpoints/apps_permissions.rb +3 -2
- data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +2 -1
- data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +2 -1
- data/lib/slack/web/api/endpoints/apps_permissions_users.rb +3 -2
- data/lib/slack/web/api/endpoints/auth.rb +3 -2
- data/lib/slack/web/api/endpoints/bots.rb +2 -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 +44 -29
- data/lib/slack/web/api/endpoints/chat.rb +38 -31
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +3 -2
- data/lib/slack/web/api/endpoints/conversations.rb +34 -35
- data/lib/slack/web/api/endpoints/dialog.rb +2 -1
- data/lib/slack/web/api/endpoints/dnd.rb +6 -4
- data/lib/slack/web/api/endpoints/emoji.rb +2 -1
- data/lib/slack/web/api/endpoints/files.rb +11 -8
- data/lib/slack/web/api/endpoints/files_comments.rb +2 -1
- data/lib/slack/web/api/endpoints/files_remote.rb +127 -0
- data/lib/slack/web/api/endpoints/groups.rb +33 -18
- data/lib/slack/web/api/endpoints/im.rb +17 -12
- data/lib/slack/web/api/endpoints/migration.rb +2 -1
- data/lib/slack/web/api/endpoints/mpim.rb +16 -11
- data/lib/slack/web/api/endpoints/oauth.rb +4 -6
- data/lib/slack/web/api/endpoints/oauth_v2.rb +30 -0
- data/lib/slack/web/api/endpoints/pins.rb +8 -12
- data/lib/slack/web/api/endpoints/reactions.rb +12 -15
- data/lib/slack/web/api/endpoints/reminders.rb +6 -5
- data/lib/slack/web/api/endpoints/rtm.rb +3 -2
- data/lib/slack/web/api/endpoints/search.rb +4 -3
- data/lib/slack/web/api/endpoints/stars.rb +6 -7
- data/lib/slack/web/api/endpoints/team.rb +7 -5
- data/lib/slack/web/api/endpoints/team_profile.rb +2 -1
- data/lib/slack/web/api/endpoints/usergroups.rb +6 -5
- data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -2
- data/lib/slack/web/api/endpoints/users.rb +11 -12
- 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 +3 -2
- data/lib/slack/web/api/endpoints/views.rb +97 -0
- data/lib/slack/web/api/error.rb +1 -0
- data/lib/slack/web/api/errors.rb +656 -0
- data/lib/slack/web/api/errors/slack_error.rb +14 -1
- data/lib/slack/web/api/errors/too_many_requests_error.rb +1 -0
- data/lib/slack/web/api/mixins.rb +2 -0
- data/lib/slack/web/api/mixins/channels.id.rb +1 -0
- data/lib/slack/web/api/mixins/conversations.id.rb +27 -0
- data/lib/slack/web/api/mixins/groups.id.rb +1 -0
- data/lib/slack/web/api/mixins/ids.id.rb +1 -0
- data/lib/slack/web/api/mixins/users.id.rb +1 -0
- data/lib/slack/web/api/mixins/users.search.rb +1 -0
- data/lib/slack/web/api/patches/{chat.6.block-kit-support.patch → chat.1.patch} +29 -26
- 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 +1 -0
- 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 +1 -0
- data/lib/slack/web/client.rb +2 -1
- data/lib/slack/web/config.rb +1 -0
- data/lib/slack/web/faraday/connection.rb +24 -20
- data/lib/slack/web/faraday/request.rb +1 -0
- data/lib/slack/web/faraday/response/raise_error.rb +10 -6
- data/lib/slack/web/pagination/cursor.rb +3 -2
- data/lib/slack_ruby_client.rb +1 -0
- data/lib/tasks/git.rake +1 -0
- data/lib/tasks/real_time.rake +13 -5
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +27 -7
- data/screenshots/create-app.png +0 -0
- data/slack-ruby-client.gemspec +6 -3
- data/spec/fixtures/slack/web/channels_info.yml +108 -15
- data/spec/fixtures/slack/web/views_open_error.yml +76 -0
- data/spec/integration/integration_spec.rb +26 -23
- data/spec/slack/config_spec.rb +2 -0
- data/spec/slack/events/config_spec.rb +8 -4
- data/spec/slack/events/request_spec.rb +67 -37
- 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 +178 -32
- data/spec/slack/real_time/concurrency/celluloid_spec.rb +11 -6
- data/spec/slack/real_time/concurrency/eventmachine_spec.rb +9 -1
- data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +2 -0
- data/spec/slack/real_time/event_handlers/bot_spec.rb +2 -1
- data/spec/slack/real_time/event_handlers/channel_spec.rb +9 -6
- 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 +4 -3
- data/spec/slack/real_time/event_handlers/team_spec.rb +3 -1
- data/spec/slack/real_time/event_handlers/user_spec.rb +1 -0
- data/spec/slack/real_time/rtm_connect_spec.rb +1 -0
- data/spec/slack/real_time/rtm_start_spec.rb +1 -0
- data/spec/slack/real_time/store_spec.rb +2 -1
- data/spec/slack/slack_spec.rb +37 -5
- data/spec/slack/version_spec.rb +2 -1
- 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 +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 +13 -0
- data/spec/slack/web/api/endpoints/admin_conversations_whitelist_spec.rb +32 -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 +13 -0
- data/spec/slack/web/api/endpoints/admin_users_spec.rb +75 -0
- data/spec/slack/web/api/endpoints/api_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/apps_permissions_resources_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/apps_permissions_scopes_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/apps_permissions_spec.rb +3 -2
- data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +4 -3
- data/spec/slack/web/api/endpoints/apps_spec.rb +1 -0
- 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 +1 -0
- data/spec/slack/web/api/endpoints/conversations_spec.rb +2 -1
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +5 -1
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +5 -3
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +80 -25
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +12 -4
- data/spec/slack/web/api/endpoints/custom_specs/groups_spec.rb +2 -0
- data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +6 -1
- data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +95 -0
- data/spec/slack/web/api/endpoints/dnd_spec.rb +6 -0
- data/spec/slack/web/api/endpoints/emoji_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/files_comments_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/files_remote_spec.rb +24 -0
- data/spec/slack/web/api/endpoints/files_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/im_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/migration_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/mpim_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/oauth_spec.rb +1 -11
- data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +13 -0
- data/spec/slack/web/api/endpoints/pins_spec.rb +5 -1
- data/spec/slack/web/api/endpoints/reactions_spec.rb +8 -1
- data/spec/slack/web/api/endpoints/reminders_spec.rb +1 -0
- 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/team_profile_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/team_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/usergroups_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +1 -0
- 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/views_spec.rb +29 -0
- data/spec/slack/web/api/error_spec.rb +4 -2
- data/spec/slack/web/api/errors/service_unavailable_spec.rb +8 -5
- data/spec/slack/web/api/errors/slack_error_spec.rb +26 -2
- data/spec/slack/web/api/mixins/channels_spec.rb +17 -7
- data/spec/slack/web/api/mixins/conversations_spec.rb +41 -0
- data/spec/slack/web/api/mixins/groups_spec.rb +17 -7
- data/spec/slack/web/api/mixins/users_spec.rb +17 -8
- data/spec/slack/web/api/pagination/cursor_spec.rb +40 -10
- data/spec/slack/web/client_spec.rb +71 -18
- data/spec/slack/web/faraday/response/raise_error_spec.rb +41 -7
- data/spec/spec_helper.rb +2 -1
- data/spec/support/queue_with_timeout.rb +1 -0
- data/spec/support/real_time/concurrency/mock.rb +1 -0
- data/spec/support/real_time/connected_client.rb +9 -3
- data/spec/support/real_time/event.rb +1 -0
- data/spec/support/token.rb +1 -0
- data/spec/support/vcr.rb +1 -0
- metadata +156 -30
- 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/lib/slack.rb
CHANGED
data/lib/slack/config.rb
CHANGED
data/lib/slack/events/config.rb
CHANGED
data/lib/slack/events/request.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module Events
|
|
3
4
|
class Request
|
|
@@ -12,7 +13,8 @@ module Slack
|
|
|
12
13
|
def initialize(http_request, options = {})
|
|
13
14
|
@http_request = http_request
|
|
14
15
|
@signing_secret = options[:signing_secret] || Slack::Events.config.signing_secret
|
|
15
|
-
@signature_expires_in =
|
|
16
|
+
@signature_expires_in =
|
|
17
|
+
options[:signature_expires_in] || Slack::Events.config.signature_expires_in
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
# Request timestamp.
|
data/lib/slack/logger.rb
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'logger'
|
|
2
3
|
|
|
3
4
|
module Slack
|
|
4
5
|
class Logger < ::Logger
|
|
5
6
|
def self.default
|
|
6
|
-
@
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
return @default if @default
|
|
8
|
+
|
|
9
|
+
logger = new STDOUT
|
|
10
|
+
logger.level = Logger::WARN
|
|
11
|
+
@default = logger
|
|
11
12
|
end
|
|
12
13
|
end
|
|
13
14
|
end
|
|
@@ -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
|
# Sends a message to a channel.
|
|
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
|
# @option options [Object] :text
|
|
11
13
|
# Text of the message to send. See below for an explanation of formatting.
|
|
12
14
|
def message(options = {})
|
|
@@ -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,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
class Client
|
|
@@ -19,8 +20,8 @@ module Slack
|
|
|
19
20
|
attr_accessor :store
|
|
20
21
|
attr_accessor :url
|
|
21
22
|
attr_accessor(*Config::ATTRIBUTES)
|
|
23
|
+
attr_accessor :logger
|
|
22
24
|
|
|
23
|
-
protected :logger, :logger=
|
|
24
25
|
protected :store_class, :store_class=
|
|
25
26
|
|
|
26
27
|
def initialize(options = {})
|
|
@@ -35,7 +36,7 @@ module Slack
|
|
|
35
36
|
|
|
36
37
|
%i[users self channels team teams groups ims bots].each do |store_method|
|
|
37
38
|
define_method store_method do
|
|
38
|
-
store
|
|
39
|
+
store&.send(store_method)
|
|
39
40
|
end
|
|
40
41
|
end
|
|
41
42
|
|
|
@@ -62,11 +63,11 @@ module Slack
|
|
|
62
63
|
def stop!
|
|
63
64
|
raise ClientNotStartedError unless started?
|
|
64
65
|
|
|
65
|
-
@socket
|
|
66
|
+
@socket&.disconnect!
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
def started?
|
|
69
|
-
@socket
|
|
70
|
+
@socket&.connected?
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
class << self
|
|
@@ -82,25 +83,25 @@ module Slack
|
|
|
82
83
|
def run_loop
|
|
83
84
|
@socket.connect! do |driver|
|
|
84
85
|
driver.on :open do |event|
|
|
85
|
-
logger.debug("#{self
|
|
86
|
-
|
|
86
|
+
logger.debug("#{self}##{__method__}") { event.class.name }
|
|
87
|
+
open_event(event)
|
|
87
88
|
callback(event, :open)
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
driver.on :message do |event|
|
|
91
|
-
logger.debug("#{self
|
|
92
|
+
logger.debug("#{self}##{__method__}") { "#{event.class}, #{event.data}" }
|
|
92
93
|
dispatch(event)
|
|
93
94
|
end
|
|
94
95
|
|
|
95
96
|
driver.on :close do |event|
|
|
96
|
-
logger.debug("#{self
|
|
97
|
+
logger.debug("#{self}##{__method__}") { event.class.name }
|
|
97
98
|
callback(event, :close)
|
|
98
99
|
close(event)
|
|
99
100
|
callback(event, :closed)
|
|
100
101
|
end
|
|
101
102
|
|
|
102
103
|
# This must be called last to ensure any events are registered before invoking user code.
|
|
103
|
-
@callback
|
|
104
|
+
@callback&.call(driver)
|
|
104
105
|
end
|
|
105
106
|
end
|
|
106
107
|
|
|
@@ -127,17 +128,42 @@ module Slack
|
|
|
127
128
|
def run_ping!
|
|
128
129
|
return if keep_alive?
|
|
129
130
|
|
|
131
|
+
logger.warn(to_s) { 'is offline' }
|
|
132
|
+
|
|
130
133
|
restart_async
|
|
134
|
+
rescue Slack::Web::Api::Errors::SlackError => e
|
|
135
|
+
# stop pinging if bot was uninstalled
|
|
136
|
+
case e.message
|
|
137
|
+
when 'account_inactive', 'invalid_auth' then
|
|
138
|
+
logger.warn(to_s) { e.message }
|
|
139
|
+
raise e
|
|
140
|
+
end
|
|
141
|
+
logger.debug("#{self}##{__method__}") { e }
|
|
142
|
+
rescue StandardError => e
|
|
143
|
+
# disregard all ping worker failures, keep pinging
|
|
144
|
+
logger.debug("#{self}##{__method__}") { e }
|
|
131
145
|
end
|
|
132
146
|
|
|
133
147
|
def run_ping?
|
|
134
|
-
!websocket_ping.nil? && websocket_ping
|
|
148
|
+
!websocket_ping.nil? && websocket_ping.positive?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def websocket_ping_timer
|
|
152
|
+
websocket_ping / 2
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def to_s
|
|
156
|
+
if store&.team
|
|
157
|
+
"id=#{store.team.id}, name=#{store.team.name}, domain=#{store.team.domain}"
|
|
158
|
+
else
|
|
159
|
+
super
|
|
160
|
+
end
|
|
135
161
|
end
|
|
136
162
|
|
|
137
163
|
protected
|
|
138
164
|
|
|
139
165
|
def restart_async
|
|
140
|
-
logger.debug("#{self
|
|
166
|
+
logger.debug("#{self}##{__method__}")
|
|
141
167
|
@socket.close
|
|
142
168
|
start = web_client.send(rtm_start_method, start_options)
|
|
143
169
|
data = Slack::Messages::Message.new(start)
|
|
@@ -183,11 +209,11 @@ module Slack
|
|
|
183
209
|
def send_json(data)
|
|
184
210
|
raise ClientNotStartedError unless started?
|
|
185
211
|
|
|
186
|
-
logger.debug("#{self
|
|
212
|
+
logger.debug("#{self}##{__method__}") { data }
|
|
187
213
|
@socket.send_data(data.to_json)
|
|
188
214
|
end
|
|
189
215
|
|
|
190
|
-
def
|
|
216
|
+
def open_event(_event); end
|
|
191
217
|
|
|
192
218
|
def close(_event)
|
|
193
219
|
[@socket, socket_class].each do |s|
|
|
@@ -204,7 +230,7 @@ module Slack
|
|
|
204
230
|
end
|
|
205
231
|
true
|
|
206
232
|
rescue StandardError => e
|
|
207
|
-
logger.error e
|
|
233
|
+
logger.error("#{self}##{__method__}") { e }
|
|
208
234
|
false
|
|
209
235
|
end
|
|
210
236
|
|
|
@@ -216,23 +242,21 @@ module Slack
|
|
|
216
242
|
return false unless type
|
|
217
243
|
|
|
218
244
|
type = type.to_s
|
|
219
|
-
logger.debug("#{self
|
|
245
|
+
logger.debug("#{self}##{__method__}") { data.to_s }
|
|
220
246
|
run_handlers(type, data) if @store
|
|
221
247
|
run_callbacks(type, data)
|
|
222
248
|
rescue StandardError => e
|
|
223
|
-
logger.error e
|
|
249
|
+
logger.error("#{self}##{__method__}") { e }
|
|
224
250
|
false
|
|
225
251
|
end
|
|
226
252
|
|
|
227
253
|
def run_handlers(type, data)
|
|
228
254
|
handlers = store.class.events[type.to_s]
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
store.instance_exec(data, &handler)
|
|
232
|
-
end
|
|
255
|
+
handlers&.each do |handler|
|
|
256
|
+
store.instance_exec(data, &handler)
|
|
233
257
|
end
|
|
234
258
|
rescue StandardError => e
|
|
235
|
-
logger.error e
|
|
259
|
+
logger.error("#{self}##{__method__}") { e }
|
|
236
260
|
false
|
|
237
261
|
end
|
|
238
262
|
|
|
@@ -245,7 +269,7 @@ module Slack
|
|
|
245
269
|
end
|
|
246
270
|
true
|
|
247
271
|
rescue StandardError => e
|
|
248
|
-
logger.error e
|
|
272
|
+
logger.error("#{self}##{__method__}") { e }
|
|
249
273
|
false
|
|
250
274
|
end
|
|
251
275
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'async/websocket'
|
|
2
3
|
require 'async/notification'
|
|
3
4
|
require 'async/clock'
|
|
@@ -30,33 +31,34 @@ module Slack
|
|
|
30
31
|
|
|
31
32
|
if client.run_ping?
|
|
32
33
|
@ping_task = task.async do |subtask|
|
|
33
|
-
subtask.annotate
|
|
34
|
+
subtask.annotate "#{client} keep-alive"
|
|
34
35
|
|
|
35
36
|
# The timer task will naturally exit after the driver is set to nil.
|
|
36
37
|
while @restart
|
|
37
|
-
subtask.sleep client.
|
|
38
|
+
subtask.sleep client.websocket_ping_timer
|
|
38
39
|
client.run_ping! if @restart
|
|
39
40
|
end
|
|
40
41
|
end
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
while @restart
|
|
44
|
-
@client_task
|
|
45
|
+
@client_task&.stop
|
|
45
46
|
|
|
46
47
|
@client_task = task.async do |subtask|
|
|
47
48
|
begin
|
|
48
|
-
subtask.annotate
|
|
49
|
+
subtask.annotate "#{client} run-loop"
|
|
49
50
|
client.run_loop
|
|
50
51
|
rescue ::Async::Wrapper::Cancelled => e
|
|
51
52
|
# Will get restarted by ping worker.
|
|
52
|
-
|
|
53
|
+
rescue StandardError => e
|
|
54
|
+
client.logger.error(subtask.to_s) { e.message }
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
@restart.wait
|
|
57
59
|
end
|
|
58
60
|
|
|
59
|
-
@ping_task
|
|
61
|
+
@ping_task&.stop
|
|
60
62
|
end
|
|
61
63
|
end
|
|
62
64
|
|
|
@@ -64,7 +66,7 @@ module Slack
|
|
|
64
66
|
@url = new_url
|
|
65
67
|
@last_message_at = current_time
|
|
66
68
|
|
|
67
|
-
@restart
|
|
69
|
+
@restart&.signal
|
|
68
70
|
end
|
|
69
71
|
|
|
70
72
|
def current_time
|
|
@@ -80,7 +82,7 @@ module Slack
|
|
|
80
82
|
def disconnect!
|
|
81
83
|
super
|
|
82
84
|
ensure
|
|
83
|
-
if restart = @restart
|
|
85
|
+
if (restart = @restart)
|
|
84
86
|
@restart = nil
|
|
85
87
|
restart.signal
|
|
86
88
|
end
|
|
@@ -97,7 +99,7 @@ module Slack
|
|
|
97
99
|
end
|
|
98
100
|
|
|
99
101
|
def run_loop
|
|
100
|
-
while @driver
|
|
102
|
+
while @driver&.next_event
|
|
101
103
|
# $stderr.puts event.inspect
|
|
102
104
|
end
|
|
103
105
|
end
|
|
@@ -129,3 +131,10 @@ module Slack
|
|
|
129
131
|
end
|
|
130
132
|
end
|
|
131
133
|
end
|
|
134
|
+
|
|
135
|
+
if Gem::Version.new(Async::WebSocket::VERSION) >= Gem::Version.new('0.9.0')
|
|
136
|
+
raise(
|
|
137
|
+
"Incompatible version of async-websocket, #{Async::WebSocket::VERSION}, " \
|
|
138
|
+
"use \"gem 'async-websocket', '~> 0.8.0'\"."
|
|
139
|
+
)
|
|
140
|
+
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'websocket/driver'
|
|
2
3
|
require 'socket'
|
|
3
4
|
require 'forwardable'
|
|
@@ -36,12 +37,17 @@ module Slack
|
|
|
36
37
|
loop { read } if socket
|
|
37
38
|
rescue EOFError, Errno::ECONNRESET, Errno::EPIPE => e
|
|
38
39
|
logger.debug("#{self.class}##{__method__}") { e }
|
|
39
|
-
|
|
40
|
+
unless @closing
|
|
41
|
+
driver.emit(
|
|
42
|
+
:close,
|
|
43
|
+
WebSocket::Driver::CloseEvent.new(1001, 'server closed connection')
|
|
44
|
+
)
|
|
45
|
+
end
|
|
40
46
|
end
|
|
41
47
|
|
|
42
48
|
def disconnect!
|
|
43
49
|
super
|
|
44
|
-
@ping_timer
|
|
50
|
+
@ping_timer&.cancel
|
|
45
51
|
end
|
|
46
52
|
|
|
47
53
|
def close
|
|
@@ -58,7 +64,7 @@ module Slack
|
|
|
58
64
|
|
|
59
65
|
def handle_read(buffer)
|
|
60
66
|
logger.debug("#{self.class}##{__method__}") { buffer }
|
|
61
|
-
driver
|
|
67
|
+
driver&.parse buffer
|
|
62
68
|
end
|
|
63
69
|
|
|
64
70
|
def write(data)
|
|
@@ -82,7 +88,7 @@ module Slack
|
|
|
82
88
|
def run_ping_loop
|
|
83
89
|
return unless @client.run_ping?
|
|
84
90
|
|
|
85
|
-
@ping_timer = every @client.
|
|
91
|
+
@ping_timer = every @client.websocket_ping_timer do
|
|
86
92
|
@client.run_ping!
|
|
87
93
|
end
|
|
88
94
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'faye/websocket'
|
|
2
3
|
require 'eventmachine'
|
|
3
4
|
|
|
@@ -6,12 +7,10 @@ module Slack
|
|
|
6
7
|
module Concurrency
|
|
7
8
|
module Eventmachine
|
|
8
9
|
class Client < Faye::WebSocket::Client
|
|
9
|
-
attr_reader :logger
|
|
10
|
-
protected :logger
|
|
11
|
-
|
|
12
10
|
def initialize(url, protocols = nil, options = {})
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
options = options.dup
|
|
12
|
+
@logger = options.delete(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
|
|
13
|
+
super url, protocols, options
|
|
15
14
|
end
|
|
16
15
|
|
|
17
16
|
def parse(data)
|
|
@@ -23,6 +22,10 @@ module Slack
|
|
|
23
22
|
logger.debug("#{self.class}##{__method__}") { data }
|
|
24
23
|
super data
|
|
25
24
|
end
|
|
25
|
+
|
|
26
|
+
protected
|
|
27
|
+
|
|
28
|
+
attr_reader :logger
|
|
26
29
|
end
|
|
27
30
|
|
|
28
31
|
class Socket < Slack::RealTime::Socket
|
|
@@ -30,7 +33,7 @@ module Slack
|
|
|
30
33
|
@thread = ensure_reactor_running
|
|
31
34
|
|
|
32
35
|
if client.run_ping?
|
|
33
|
-
EventMachine.add_periodic_timer
|
|
36
|
+
EventMachine.add_periodic_timer client.websocket_ping_timer do
|
|
34
37
|
client.run_ping!
|
|
35
38
|
end
|
|
36
39
|
end
|