slack_bot-events 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5be1bf5ab14cf6022e8a31b32015e328bd5b1939d928415bb06e610dc3e091e
4
- data.tar.gz: e04f3734b913e8514f2ed50eb3f0905906013321f3fa6c26dc3992a7a5136ae4
3
+ metadata.gz: 653594899c76b05d93054ceb20520d84a487a38451ecee7d561ab5b9e6590bf7
4
+ data.tar.gz: 3f722375d06dce4ca2a3f4151ed221948b9e1d5e6d87842cf966ff067c54c31b
5
5
  SHA512:
6
- metadata.gz: 7f59e41eeb158988a8b02ba6b445b1b7ba8009e96c2ec404b313b614e9aa86d5e346518c9ad7e824b49dd29dfc4b04e9f84a827edde5698c07a3d1325b356814
7
- data.tar.gz: 4e200610a557c49256745577bca3811e9830609a29009a6f4b09cc1251f972118d013c92a2a9d933e2df3391592c582112abd6911638115987bcdecf7a07fd15
6
+ metadata.gz: eb0fb66fded40a580f042bd45e9ba139cf3753d2960461265d07394a5c182a35c9f35d33105e7ca5536b6e279c44335baf6b8ba645e531186ffbf3c4d9790dcc
7
+ data.tar.gz: 02f478db61cabfce5f8e66b7303f47f9ed548d08dafded39d364e579f68ebf448f17ddf851e9717bfea0e755ab41e0821d450ab4b4e3353823a3b161e9ad0dea
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- slack_bot-events (0.3.0)
4
+ slack_bot-events (0.4.0)
5
5
  class_composer (~> 1.0)
6
6
  faraday
7
7
  faye-websocket
@@ -17,10 +17,10 @@ module SlackBot
17
17
  end
18
18
 
19
19
  websocket.on :message do |socket_event|
20
- process_message(socket_event: socket_event) do |parsed_data:, schema: nil|
20
+ process_message(socket_event: socket_event) do |listener:, parsed_data:, schema: nil|
21
21
  case parsed_data["type"]
22
22
  when "events_api"
23
- events_api(schema: schema, parsed_data: parsed_data)
23
+ events_api(handler: listener[:handler], schema: schema, parsed_data: parsed_data)
24
24
  end
25
25
  end
26
26
  end
@@ -37,8 +37,11 @@ module SlackBot
37
37
 
38
38
  def process_message(socket_event:)
39
39
  schema_data = Schematize.call(data: socket_event.data)
40
- SlackBot::Events.message_middleware.invoke_message(type: :message, socket_event: socket_event, **schema_data) do
41
- yield(**schema_data) if block_given?
40
+
41
+ listener = find_listener(schema: schema_data[:schema]) # Events.config.listeners[schema_data[:schema]&.type.to_sym]
42
+
43
+ SlackBot::Events.message_middleware.invoke_message(websocket: websocket, listener: listener, type: :message, socket_event: socket_event, **schema_data) do
44
+ yield(listener: listener, **schema_data) if block_given?
42
45
  end
43
46
  end
44
47
 
@@ -48,33 +51,22 @@ module SlackBot
48
51
  end
49
52
  end
50
53
 
51
- def events_api(schema:, parsed_data:)
52
- if Events.config.print_tldr
53
- Events.logger.info { schema.tldr }
54
- end
54
+ def events_api(handler:, schema:, parsed_data:)
55
+ return if listener.nil?
55
56
 
56
- object = Events.config.listeners[schema.type.to_sym]
57
- if object
58
- safe_handler(type: schema.type.to_sym, object: object, schema: schema, parsed_data: parsed_data)
59
- end
57
+ Events.logger.info { schema.tldr } if Events.config.print_tldr
60
58
 
61
- websocket.send("#{{ envelope_id: schema.envelope_id }.to_json}")
59
+ # This gets rescued in the MessageHandler middleware
60
+ # on_success and on_failure happens there as well
61
+ handler.call(schema: schema, raw_data: parsed_data)
62
62
  end
63
63
 
64
64
  private
65
65
 
66
- def safe_handler(type:, object:, schema:, parsed_data:)
67
- Events.logger.info "Received Handler for #{type}"
68
- object[:handler].call(schema: schema, raw_data: parsed_data)
69
- object[:on_success]&.call(schema)
70
- rescue => error
71
- Events.logger.error("#{object[:handler]} returned #{error.class} => #{error.message}. Safely returning to websocket. #{error.backtrace[0...10]}")
72
-
73
- begin
74
- object[:on_failure]&.call(schema, error)
75
- rescue => on_failure_error
76
- Events.logger.error("Failure occured during on_failure block. #{on_failure_error}")
77
- end
66
+ def find_listener(schema:)
67
+ return nil if schema.nil?
68
+
69
+ Events.config.listeners[schema.type.to_sym]
78
70
  end
79
71
 
80
72
  def websocket
@@ -93,9 +85,7 @@ module SlackBot
93
85
  end
94
86
 
95
87
  def faraday_headers
96
- {
97
- 'Authorization' => "Bearer #{SlackBot::Events.config.client_socket_token}"
98
- }
88
+ { 'Authorization' => "Bearer #{SlackBot::Events.config.client_socket_token}" }
99
89
  end
100
90
  end
101
91
  end
@@ -26,6 +26,12 @@ module SlackBot
26
26
  add_composer :close_middleware, allowed: Middleware::Chain, default: Middleware::Chain.new(type: :close)
27
27
  add_composer :envelope_acknowledge, allowed: Symbol, default: DEFAULT_ACKNOWLEDGE, validator: ->(val) { ALLOWED_ACKNOWLEDGE.include?(val) }, invalid_message: ->(_) { "Must by a Symbol in #{ALLOWED_ACKNOWLEDGE}" }
28
28
 
29
+ ALLOWED_ACKNOWLEDGE.each do |ack|
30
+ define_method :"acknowledge_#{ack}?" do
31
+ envelope_acknowledge == ack
32
+ end
33
+ end
34
+
29
35
  def register_listener(name:, handler:, on_success: nil, on_failure: nil)
30
36
  if event_handler = listeners[name.to_sym]
31
37
  logger.warn "`#{name}` already exists as listener event. Reseting with new input"
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "slack_bot/events/middleware/event_tracer"
4
+ require "slack_bot/events/middleware/message_handler"
4
5
 
5
6
  ####################
6
7
  #
@@ -18,7 +19,7 @@ module SlackBot
18
19
  attr_reader :type
19
20
 
20
21
  DEFAULT_ENTRIES = {
21
- message: [Middleware::EventTracer],
22
+ message: [Middleware::EventTracer, Middleware::MessageHandler],
22
23
  open: [Middleware::EventTracer],
23
24
  close: [Middleware::EventTracer],
24
25
  }
@@ -85,19 +86,21 @@ module SlackBot
85
86
  @entries = nil
86
87
  end
87
88
 
88
- def invoke_message(type:, socket_event:, parsed_data:, schema: nil)
89
+ def invoke_message(type:, socket_event:, parsed_data:, websocket:, listener:, schema: nil)
89
90
  return yield if empty?
90
91
 
91
92
  chain = retrieve
92
93
  traverse_chain = proc do
93
94
  if chain.empty?
94
- yield(yield: schema, parsed_data: parsed_data)
95
+ yield
95
96
  else
96
97
  params = {
97
98
  parsed_data: parsed_data,
98
99
  schema: schema,
99
100
  socket_event: socket_event,
101
+ listener: listener,
100
102
  type: type,
103
+ websocket: websocket,
101
104
  }
102
105
  chain.shift.call(**params, &traverse_chain)
103
106
  end
@@ -4,14 +4,18 @@ module SlackBot
4
4
  module Events
5
5
  module Middleware
6
6
  class EventTracer
7
- def call(type:, socket_event:, schema: nil, parsed_data: nil)
7
+ def call(type:, socket_event:, schema: nil, parsed_data: nil, **params)
8
8
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
9
9
  temp_type = type.dup.to_s
10
10
  case type
11
11
  when :close
12
12
  additional_info = "code: #{socket_event.code} reason:#{socket_event.reason}"
13
13
  when :message
14
- p_type = parsed_data.dig("type")
14
+ accurate_type = parsed_data.dig("payload","event","subtype") || parsed_data.dig("payload","event","type")
15
+ p_type = [
16
+ parsed_data.dig("type"),
17
+ accurate_type
18
+ ].compact.join(":")
15
19
  case p_type
16
20
  when "app_rate_limited"
17
21
  # https://api.slack.com/apis/rate-limits#events
@@ -32,7 +36,7 @@ module SlackBot
32
36
  yield
33
37
 
34
38
  elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
35
- Events.logger.info { "[Event Finished] [#{(elapsed_time * 1000).round(2)}ms] #{temp_type}" }
39
+ Events.logger.info { "[Event Finished] #{temp_type} [#{(elapsed_time * 1000).round(2)}ms]" }
36
40
  end
37
41
  end
38
42
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SlackBot
4
+ module Events
5
+ module Middleware
6
+ class MessageHandler
7
+ def call(schema:, websocket:, listener:, **params)
8
+ if SlackBot::Events.config.acknowledge_on_receive?
9
+ acknowledge!(websocket: websocket, schema: schema)
10
+ end
11
+
12
+ yield
13
+
14
+ listener[:on_success]&.call(schema) if listener
15
+
16
+ if SlackBot::Events.config.acknowledge_on_success? || SlackBot::Events.config.acknowledge_on_complete?
17
+ acknowledge!(websocket: websocket, schema: schema)
18
+ end
19
+ rescue StandardError => error
20
+ puts error.message
21
+ puts error.backtrace
22
+ Events.logger.error do
23
+ "#{listener[:handler]} returned #{error.class} => #{error.message}. #{error.backtrace[0...10]}"
24
+ end
25
+
26
+ begin
27
+ listener[:on_failure]&.call(schema, error) if listener
28
+ rescue StandardError => on_failure_error
29
+ Events.logger.error("Failure occured during on_failure block. #{on_failure_error}")
30
+ end
31
+
32
+ if SlackBot::Events.config.acknowledge_on_complete?
33
+ acknowledge!(websocket: websocket, schema: schema)
34
+ elsif SlackBot::Events.config.acknowledge_on_success?
35
+ Events.logger.debug do
36
+ "Envelope acknowledgment skipped. Ackowledgment on success only. Slack may send a duplicate message"
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def acknowledge!(websocket:, schema:)
44
+ return if schema.nil?
45
+
46
+ websocket.send("#{{ envelope_id: schema.envelope_id }.to_json}")
47
+ Events.logger.debug { "Envelope acknowledgment completed [#{SlackBot::Events.config.envelope_acknowledge}]" }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SlackBot
4
4
  module Events
5
- VERSION = "0.3.0"
5
+ VERSION = "0.4.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack_bot-events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Taylor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-20 00:00:00.000000000 Z
11
+ date: 2024-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -136,6 +136,7 @@ files:
136
136
  - lib/slack_bot/events/configuration.rb
137
137
  - lib/slack_bot/events/middleware/chain.rb
138
138
  - lib/slack_bot/events/middleware/event_tracer.rb
139
+ - lib/slack_bot/events/middleware/message_handler.rb
139
140
  - lib/slack_bot/events/schemas/authorization.rb
140
141
  - lib/slack_bot/events/schemas/data_payload.rb
141
142
  - lib/slack_bot/events/schemas/socket_payload.rb