slack-ruby-client 0.14.4 → 0.14.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +19 -11
- data/.rubocop_todo.yml +66 -47
- data/CHANGELOG.md +8 -0
- data/Dangerfile +1 -0
- data/Gemfile +1 -0
- data/README.md +16 -9
- data/Rakefile +1 -0
- data/bin/commands.rb +6 -0
- data/bin/commands/admin_apps.rb +27 -0
- data/bin/commands/admin_apps_requests.rb +16 -0
- data/bin/commands/admin_users_session.rb +3 -2
- 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/channels.rb +31 -30
- data/bin/commands/chat.rb +19 -18
- data/bin/commands/chat_scheduledMessages.rb +3 -2
- data/bin/commands/conversations.rb +35 -34
- 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 +13 -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 +5 -4
- 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 +9 -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 +3 -2
- 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 -0
- 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 +19 -12
- data/lib/slack/real_time/concurrency.rb +1 -0
- data/lib/slack/real_time/concurrency/async.rb +15 -7
- data/lib/slack/real_time/concurrency/celluloid.rb +9 -3
- data/lib/slack/real_time/concurrency/eventmachine.rb +7 -4
- 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 -0
- 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 +14 -11
- data/lib/slack/real_time/stores.rb +1 -0
- data/lib/slack/real_time/stores/base.rb +1 -0
- data/lib/slack/real_time/stores/starter.rb +1 -0
- data/lib/slack/real_time/stores/store.rb +16 -25
- data/lib/slack/version.rb +2 -1
- data/lib/slack/web/api/endpoints.rb +11 -0
- data/lib/slack/web/api/endpoints/admin_apps.rb +42 -0
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +33 -0
- data/lib/slack/web/api/endpoints/admin_users_session.rb +2 -1
- 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/channels.rb +16 -16
- data/lib/slack/web/api/endpoints/chat.rb +10 -9
- data/lib/slack/web/api/endpoints/chat_scheduledMessages.rb +2 -1
- data/lib/slack/web/api/endpoints/conversations.rb +18 -17
- data/lib/slack/web/api/endpoints/dialog.rb +2 -1
- data/lib/slack/web/api/endpoints/dnd.rb +5 -4
- data/lib/slack/web/api/endpoints/emoji.rb +2 -1
- data/lib/slack/web/api/endpoints/files.rb +7 -6
- 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 +17 -22
- data/lib/slack/web/api/endpoints/im.rb +7 -8
- data/lib/slack/web/api/endpoints/migration.rb +2 -1
- data/lib/slack/web/api/endpoints/mpim.rb +6 -7
- data/lib/slack/web/api/endpoints/oauth.rb +3 -2
- data/lib/slack/web/api/endpoints/oauth_v2.rb +30 -0
- data/lib/slack/web/api/endpoints/pins.rb +5 -9
- data/lib/slack/web/api/endpoints/reactions.rb +9 -12
- 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 +4 -5
- data/lib/slack/web/api/endpoints/team.rb +5 -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 -16
- 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/slack_error.rb +2 -1
- data/lib/slack/web/api/errors/too_many_requests_error.rb +1 -0
- data/lib/slack/web/api/mixins.rb +1 -0
- data/lib/slack/web/api/mixins/channels.id.rb +1 -0
- data/lib/slack/web/api/mixins/groups.id.rb +1 -0
- data/lib/slack/web/api/mixins/ids.id.rb +4 -1
- 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/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/method.erb +1 -0
- data/lib/slack/web/api/templates/method_spec.erb +1 -0
- data/lib/slack/web/client.rb +1 -0
- data/lib/slack/web/config.rb +1 -0
- data/lib/slack/web/faraday/connection.rb +1 -0
- data/lib/slack/web/faraday/request.rb +1 -0
- data/lib/slack/web/faraday/response/raise_error.rb +7 -6
- data/lib/slack/web/pagination/cursor.rb +1 -0
- data/lib/slack_ruby_client.rb +1 -0
- data/lib/tasks/git.rake +1 -0
- data/lib/tasks/real_time.rake +12 -4
- data/lib/tasks/update.rake +1 -0
- data/lib/tasks/web.rake +17 -6
- data/screenshots/create-app.png +0 -0
- data/slack-ruby-client.gemspec +4 -1
- data/spec/integration/integration_spec.rb +16 -17
- 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 +137 -39
- 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_requests_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_apps_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +1 -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 +1 -0
- data/spec/slack/web/api/endpoints/apps_permissions_users_spec.rb +1 -0
- 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/chat_scheduledMessages_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/conversations_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +5 -1
- data/spec/slack/web/api/endpoints/custom_specs/channels_spec.rb +2 -0
- 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 +1 -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 -0
- 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 +6 -3
- data/spec/slack/web/api/errors/slack_error_spec.rb +4 -2
- data/spec/slack/web/api/mixins/channels_spec.rb +17 -7
- 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 +45 -18
- data/spec/slack/web/faraday/response/raise_error_spec.rb +16 -5
- 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 +59 -7
- data/screenshots/register-bot.png +0 -0
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
|
|
@@ -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
|
|
@@ -83,7 +84,7 @@ module Slack
|
|
|
83
84
|
@socket.connect! do |driver|
|
|
84
85
|
driver.on :open do |event|
|
|
85
86
|
logger.debug("#{self}##{__method__}") { event.class.name }
|
|
86
|
-
|
|
87
|
+
open_event(event)
|
|
87
88
|
callback(event, :open)
|
|
88
89
|
end
|
|
89
90
|
|
|
@@ -100,7 +101,7 @@ module Slack
|
|
|
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
|
|
|
@@ -130,13 +131,21 @@ module Slack
|
|
|
130
131
|
logger.warn(to_s) { 'is offline' }
|
|
131
132
|
|
|
132
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 }
|
|
133
142
|
rescue StandardError => e
|
|
134
143
|
# disregard all ping worker failures, keep pinging
|
|
135
144
|
logger.debug("#{self}##{__method__}") { e }
|
|
136
145
|
end
|
|
137
146
|
|
|
138
147
|
def run_ping?
|
|
139
|
-
!websocket_ping.nil? && websocket_ping
|
|
148
|
+
!websocket_ping.nil? && websocket_ping.positive?
|
|
140
149
|
end
|
|
141
150
|
|
|
142
151
|
def websocket_ping_timer
|
|
@@ -144,7 +153,7 @@ module Slack
|
|
|
144
153
|
end
|
|
145
154
|
|
|
146
155
|
def to_s
|
|
147
|
-
if store
|
|
156
|
+
if store&.team
|
|
148
157
|
"id=#{store.team.id}, name=#{store.team.name}, domain=#{store.team.domain}"
|
|
149
158
|
else
|
|
150
159
|
super
|
|
@@ -204,7 +213,7 @@ module Slack
|
|
|
204
213
|
@socket.send_data(data.to_json)
|
|
205
214
|
end
|
|
206
215
|
|
|
207
|
-
def
|
|
216
|
+
def open_event(_event); end
|
|
208
217
|
|
|
209
218
|
def close(_event)
|
|
210
219
|
[@socket, socket_class].each do |s|
|
|
@@ -243,10 +252,8 @@ module Slack
|
|
|
243
252
|
|
|
244
253
|
def run_handlers(type, data)
|
|
245
254
|
handlers = store.class.events[type.to_s]
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
store.instance_exec(data, &handler)
|
|
249
|
-
end
|
|
255
|
+
handlers&.each do |handler|
|
|
256
|
+
store.instance_exec(data, &handler)
|
|
250
257
|
end
|
|
251
258
|
rescue StandardError => e
|
|
252
259
|
logger.error("#{self}##{__method__}") { e }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'async/websocket'
|
|
2
3
|
require 'async/notification'
|
|
3
4
|
require 'async/clock'
|
|
@@ -41,7 +42,7 @@ module Slack
|
|
|
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
|
|
@@ -57,7 +58,7 @@ module Slack
|
|
|
57
58
|
@restart.wait
|
|
58
59
|
end
|
|
59
60
|
|
|
60
|
-
@ping_task
|
|
61
|
+
@ping_task&.stop
|
|
61
62
|
end
|
|
62
63
|
end
|
|
63
64
|
|
|
@@ -65,7 +66,7 @@ module Slack
|
|
|
65
66
|
@url = new_url
|
|
66
67
|
@last_message_at = current_time
|
|
67
68
|
|
|
68
|
-
@restart
|
|
69
|
+
@restart&.signal
|
|
69
70
|
end
|
|
70
71
|
|
|
71
72
|
def current_time
|
|
@@ -81,7 +82,7 @@ module Slack
|
|
|
81
82
|
def disconnect!
|
|
82
83
|
super
|
|
83
84
|
ensure
|
|
84
|
-
if restart = @restart
|
|
85
|
+
if (restart = @restart)
|
|
85
86
|
@restart = nil
|
|
86
87
|
restart.signal
|
|
87
88
|
end
|
|
@@ -98,7 +99,7 @@ module Slack
|
|
|
98
99
|
end
|
|
99
100
|
|
|
100
101
|
def run_loop
|
|
101
|
-
while @driver
|
|
102
|
+
while @driver&.next_event
|
|
102
103
|
# $stderr.puts event.inspect
|
|
103
104
|
end
|
|
104
105
|
end
|
|
@@ -113,7 +114,9 @@ module Slack
|
|
|
113
114
|
|
|
114
115
|
def build_endpoint
|
|
115
116
|
endpoint = ::Async::IO::Endpoint.tcp(addr, port)
|
|
116
|
-
|
|
117
|
+
if secure?
|
|
118
|
+
endpoint = ::Async::IO::SSLEndpoint.new(endpoint, ssl_context: build_ssl_context)
|
|
119
|
+
end
|
|
117
120
|
endpoint
|
|
118
121
|
end
|
|
119
122
|
|
|
@@ -131,4 +134,9 @@ module Slack
|
|
|
131
134
|
end
|
|
132
135
|
end
|
|
133
136
|
|
|
134
|
-
|
|
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,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)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'faye/websocket'
|
|
2
3
|
require 'eventmachine'
|
|
3
4
|
|
|
@@ -6,11 +7,9 @@ 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
|
-
@logger =
|
|
11
|
+
@logger =
|
|
12
|
+
options.fetch(:logger) || Slack::RealTime::Config.logger || Slack::Config.logger
|
|
14
13
|
super url, protocols, options.except(:logger)
|
|
15
14
|
end
|
|
16
15
|
|
|
@@ -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
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
module Config
|
|
@@ -44,7 +45,11 @@ module Slack
|
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
|
|
47
|
-
raise
|
|
48
|
+
raise(
|
|
49
|
+
NoConcurrencyError,
|
|
50
|
+
'Missing concurrency. Add async-websocket, faye-websocket ' \
|
|
51
|
+
'or celluloid-io to your Gemfile.'
|
|
52
|
+
)
|
|
48
53
|
end
|
|
49
54
|
end
|
|
50
55
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Slack
|
|
2
3
|
module RealTime
|
|
3
4
|
class Socket
|
|
4
5
|
attr_accessor :url
|
|
5
6
|
attr_accessor :options
|
|
6
7
|
attr_reader :driver
|
|
7
|
-
attr_reader :logger
|
|
8
|
-
protected :logger
|
|
9
8
|
|
|
10
9
|
def initialize(url, options = {})
|
|
11
10
|
@url = url
|
|
@@ -51,9 +50,9 @@ module Slack
|
|
|
51
50
|
|
|
52
51
|
def start_sync(client)
|
|
53
52
|
thread = start_async(client)
|
|
54
|
-
thread
|
|
53
|
+
thread&.join
|
|
55
54
|
rescue Interrupt
|
|
56
|
-
thread
|
|
55
|
+
thread&.exit
|
|
57
56
|
end
|
|
58
57
|
|
|
59
58
|
# @return [#join]
|
|
@@ -76,15 +75,19 @@ module Slack
|
|
|
76
75
|
end
|
|
77
76
|
|
|
78
77
|
def close
|
|
79
|
-
# When you call `driver.emit(:close)`, it will typically end up calling `client.close`
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
78
|
+
# When you call `driver.emit(:close)`, it will typically end up calling `client.close`
|
|
79
|
+
# which will call `@socket.close` and end up back here. In order to break this infinite
|
|
80
|
+
# recursion, we check and set `@driver = nil` before invoking `client.close`.
|
|
81
|
+
return unless (driver = @driver)
|
|
82
|
+
|
|
83
|
+
@driver = nil
|
|
84
|
+
driver.emit(:close)
|
|
84
85
|
end
|
|
85
86
|
|
|
86
87
|
protected
|
|
87
88
|
|
|
89
|
+
attr_reader :logger
|
|
90
|
+
|
|
88
91
|
def addr
|
|
89
92
|
URI(url).host
|
|
90
93
|
end
|
|
@@ -95,9 +98,9 @@ module Slack
|
|
|
95
98
|
|
|
96
99
|
def port
|
|
97
100
|
case (uri = URI(url)).scheme
|
|
98
|
-
when 'wss'
|
|
101
|
+
when 'wss', 'https'
|
|
99
102
|
URI::HTTPS::DEFAULT_PORT
|
|
100
|
-
when 'ws', 'http'
|
|
103
|
+
when 'ws', 'http'
|
|
101
104
|
URI::HTTP::DEFAULT_PORT
|
|
102
105
|
else
|
|
103
106
|
uri.port
|