class SardonyxRing::Services::SlackSocketClient

Constants

SLACK_API_ORIGIN

Public Class Methods

new(options = {}) click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 8
def initialize(options = {})
  @app_client = SlackAppClient.new(token: options[:token])
  @logger = options[:logger]
  @handler = nil
  @ws = nil
end

Public Instance Methods

connect!() click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 19
def connect!
  require 'faye/websocket'

  open_resp = @app_client.request('apps.connections.open')
  raise open_resp unless open_resp.ok

  url = "#{open_resp.url}#{debug? ? '&debug_reconnects=true' : ''}"

  @ws = Faye::WebSocket::Client.new(url)
  @ws.on(:open, &method(:on_ws_open))
  @ws.on(:message, &method(:on_ws_message))
  @ws.on(:close, &method(:on_ws_close))
end
on_message(&block) click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 15
def on_message(&block)
  @handler = block
end

Private Instance Methods

debug?() click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 35
def debug?
  ENV['DEBUG'].to_i != 0
end
on_ws_close(event) click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 57
def on_ws_close(event)
  @logger.info "close socket mode (#{event.code}#{event.reason ? " / #{event.reason}" : ''})"
  connect!
end
on_ws_message(event) click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 43
def on_ws_message(event)
  return unless @handler

  data = parse_response(event.data)
  @ws.send({ envelope_id: data.envelope_id }.to_json) if data.envelope_id

  case data.type
  when 'events_api', 'interactive'
    @handler.call(data.payload)
  when 'disconnect'
    @ws.close
  end
end
on_ws_open(_event) click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 39
def on_ws_open(_event)
  @logger.info 'connect socket mode'
end
parse_response(response_body) click to toggle source
# File lib/sardonyx_ring/services/slack_socket_client.rb, line 62
def parse_response(response_body)
  JSON.parse(response_body, object_class: OpenStruct)
end