slack_bot-events 0.0.4 → 0.1.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: 214337c85ccf72326faf95c1fca9b46bc46293d98e404bb3dc8856bec70534c3
4
- data.tar.gz: 4fa855274d80b70ece04fad550fe949fbda80557b8629d2595f40f9d09c66b7b
3
+ metadata.gz: 88a291f8028f19bacd30f4c7cd8fbcbb56fdfa3463dc916289fbf6f8447df94c
4
+ data.tar.gz: 68aa571fdf8b0b682551621601e1cfc37128823584596aa99a9ef5130d996c6c
5
5
  SHA512:
6
- metadata.gz: be57b63b5ce9a1aeea150b8944a38a764094be0970c9cddff0538877f70ba3723fa9dd869b4b5df916ea2474ab7fd05c56c89c2dc984a760d87039f8dc7dfe95
7
- data.tar.gz: 58ac99258d980088a670194c496248edaad9e4cb2dcd1639278079a9108e983a8981c56419781d9db3ce468f0558f81e6a499b41cd8b0edecfa834bf618d039e
6
+ metadata.gz: 5488211f2ebbbdc4c5960fa03d49d859e41fce30432fb42438951ab90f6f9ccb1b410cae8fcec3dcbe86d4c2c17e5ea520eb2ec7f73eebf95192ef5092572463
7
+ data.tar.gz: 34d761af5cbc44e718dd44cd5ed9612e7270bbbb7f92ea88df68aceab85e23352df83fecd3b8f227155cb3e03127354dcf7bc387a2339b057890f6aab245b2f8
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- slack_bot-events (0.0.1)
4
+ slack_bot-events (0.1.0)
5
5
  class_composer (~> 1.0)
6
6
  faraday
7
7
  faye-websocket
@@ -13,32 +13,70 @@ module SlackBot
13
13
  def start!
14
14
  EM.run do
15
15
  websocket.on :open do |event|
16
- p [:open]
16
+ event_tracer(:open)
17
17
  end
18
18
 
19
19
  websocket.on :message do |event|
20
- parsed_data = JSON.parse(event.data)
21
- if parsed_data["type"] == "events_api"
22
- puts parsed_data.to_json
23
- item = SlackBot::Events::Schemas::SocketPayload.new(parsed_data)
24
- s = {
25
- type: item.payload.event.type,
26
- tldr: item.payload.event.tldr,
27
- }
28
- puts s
29
- websocket.send("#{{ envelope_id: item.envelope_id }.to_json}")
30
- else
31
- puts event.data
20
+ event_tracer(:message) do
21
+ parsed_data = JSON.parse(event.data)
22
+ case parsed_data["type"]
23
+ when "events_api"
24
+ events_api(parsed_data)
25
+ else "hello"
26
+ params = {
27
+ num_connections: parsed_data["num_connections"],
28
+ debug_info_host: parsed_data["debug_info"]["host"],
29
+ debug_info_connect_time: parsed_data["debug_info"]["approximate_connection_time"],
30
+ }
31
+ event_tracer("message:hello", **params)
32
+ end
32
33
  end
33
34
  end
34
35
 
35
36
  websocket.on :close do |event|
36
- p [:close, event.code, event.reason]
37
+ event_tracer(:close, code: event.code, reason: event.reason)
37
38
  @websocket = nil
38
39
  end
39
40
  end
40
41
  end
41
42
 
43
+ def events_api(parsed_data)
44
+ schematized = SlackBot::Events::Schemas::SocketPayload.new(parsed_data)
45
+ Events.logger.info(schematized.tldr) if Events.config.print_tldr
46
+ object = Events.config.listeners[schematized.type.to_sym]
47
+ if object
48
+ safe_handler(type: schematized.type.to_sym, object: object, schema: schematized, parsed_data: parsed_data)
49
+ end
50
+ websocket.send("#{{ envelope_id: schematized.envelope_id }.to_json}")
51
+ end
52
+
53
+ def event_tracer(type, **params)
54
+ stringify = params.map { |k,v| "#{k}:#{v}" }.join("; ")
55
+ Events.logger.info "[Event Received] #{type} #{stringify}"
56
+ if block_given?
57
+ start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
58
+ yield
59
+ elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time
60
+ Events.logger.info "[Event completed] [#{elapsed_time.round(2)}s] #{type} #{stringify}"
61
+ end
62
+ end
63
+
64
+ private
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
78
+ end
79
+
42
80
  def websocket
43
81
  @websocket ||= Faye::WebSocket::Client.new(socket_endpoint)
44
82
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "class_composer"
4
+ require "logger"
4
5
 
5
6
  module SlackBot
6
7
  module Events
@@ -11,22 +12,59 @@ module SlackBot
11
12
  add_composer :client_signing_secret, allowed: String, default: ENV["SLACK_SIGNING_SECRET"]
12
13
  add_composer :client_socket_token, allowed: String, default: ENV["SLACK_SOCKET_TOKEN"]
13
14
  add_composer :client_verification_token, allowed: String, default: ENV["SLACK_VERIFICATION_TOKEN"]
15
+ add_composer :print_tldr, allowed: [true.class, false.class], default: true
14
16
 
15
- def register_listener(name:, handler:)
16
- @listeners ||= {}
17
-
18
- if @listeners.has_key(name.to_sym)
17
+ def register_listener(name:, handler:, on_success: nil, on_failure: nil)
18
+ if event_handler = listeners[name.to_sym]
19
+ logger.warn "`#{name}` already exists as listener event. Reseting with new input"
19
20
  end
20
21
 
21
- @listeners[name] = handler
22
+ validate_listener!(handler: handler, on_success: on_success, on_failure: on_failure)
22
23
 
24
+ listeners[name.to_sym] = { handler: handler, name: name, on_success: on_success, on_failure: on_failure }
23
25
  true
24
26
  end
25
27
 
26
28
  def remove_listener(name:)
29
+ listeners ||= {}
30
+ end
31
+
32
+ def logger
33
+ @logger ||= Logger.new(STDOUT)
34
+ end
35
+
36
+ def logger=(log)
37
+ @logger = log
38
+ end
39
+
40
+ def listeners
27
41
  @listeners ||= {}
42
+ end
43
+
44
+ private
45
+
46
+ def validate_listener!(handler:, on_success:, on_failure:)
47
+ unless retreive_method(object: handler, meth_name: :call)
48
+ raise ArgumentError, "When present, handler argument needs to respond_to :call with schema: and raw_data: kwargs"
49
+ end
28
50
 
51
+ if on_success
52
+ unless retreive_method(object: on_success, meth_name: :call)
53
+ raise ArgumentError, "When present, on_success argument needs to respond_to :call with 1 arguments passed in"
54
+ end
55
+ end
56
+
57
+ if on_failure
58
+ unless retreive_method(object: on_failure, meth_name: :call)
59
+ raise ArgumentError, "When present, on_failure argument needs to respond_to :call with 2 arguments passed in"
60
+ end
61
+ end
62
+ end
29
63
 
64
+ def retreive_method(object:, meth_name:)
65
+ object.method(meth_name.to_sym)
66
+ rescue NameError
67
+ nil
30
68
  end
31
69
  end
32
70
  end
@@ -19,6 +19,17 @@ module SlackBot
19
19
  add_field name: :accepts_response_payload, type: JsonSchematize::Boolean
20
20
  add_field name: :retry_attempt, type: Integer
21
21
  add_field name: :retry_reason, type: String
22
+
23
+
24
+ def type
25
+ payload.event.type
26
+ end
27
+
28
+ def tldr
29
+ retry_language = "#{retry_attempt}"
30
+ retry_language += ":#{retry_reason}" if retry_attempt > 0
31
+ "tldr:#{payload.event.tldr}; retry:#{retry_language}"
32
+ end
22
33
  end
23
34
  end
24
35
  end
@@ -21,6 +21,9 @@ module SlackBot
21
21
 
22
22
  add_field name: :blocks, type: SlackBot::Events::Schemas::Type::Block, array_of_types: true
23
23
 
24
+ add_field name: :thread_ts, type: String, required: false
25
+ add_field name: :parent_user_id, type: String, required: false
26
+
24
27
  add_field name: :channel, type: String
25
28
  add_field name: :event_ts, type: String
26
29
  add_field name: :channel_type, type: String
@@ -28,6 +31,20 @@ module SlackBot
28
31
  def tldr
29
32
  "type: #{type}; channel:#{channel}; raw_text:#{text}"
30
33
  end
34
+
35
+ def thread_ts
36
+ return_nil?(@thread_ts) ? nil : @thread_ts
37
+ end
38
+
39
+ def parent_user_id
40
+ return_nil?(@parent_user_id) ? nil : @parent_user_id
41
+ end
42
+
43
+ private
44
+
45
+ def return_nil?(val)
46
+ JsonSchematize::EmptyValue === val || val.nil?
47
+ end
31
48
  end
32
49
  end
33
50
  end
@@ -23,6 +23,10 @@ module SlackBot
23
23
  item.channel
24
24
  end
25
25
 
26
+ def message_ts
27
+ item.ts
28
+ end
29
+
26
30
  def tldr
27
31
  "type: #{type}; channel:#{channel}; reaction:#{reaction}"
28
32
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SlackBot
4
4
  module Events
5
- VERSION = "0.0.4"
5
+ VERSION = "0.1.0"
6
6
  end
7
7
  end
@@ -29,12 +29,16 @@ module SlackBot
29
29
  raise Error, "Expected configuration to be a SlackBot::Events::Configuration"
30
30
  end
31
31
 
32
- def self.register_listener(name:, handler:)
33
- config.register_listener(name: name, handler: handler)
32
+ def self.register_listener(name:, handler:, on_success: nil, on_failure: nil)
33
+ config.register_listener(name: name, handler: handler, on_success: on_success, on_failure: on_failure)
34
34
  end
35
35
 
36
36
  def self.remove_listener(name:)
37
37
  config.remove_listener(name: name)
38
38
  end
39
+
40
+ def self.logger
41
+ config.logger
42
+ end
39
43
  end
40
44
  end
@@ -0,0 +1 @@
1
+ require "slack_bot/events"
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.0.4
4
+ version: 0.1.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-16 00:00:00.000000000 Z
11
+ date: 2024-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -130,6 +130,7 @@ files:
130
130
  - bin/setup
131
131
  - bin/start
132
132
  - docker-compose.yml
133
+ - lib/slack_bot-events.rb
133
134
  - lib/slack_bot/events.rb
134
135
  - lib/slack_bot/events/client.rb
135
136
  - lib/slack_bot/events/configuration.rb