Class: SlackRTMApi::ApiClient

Inherits:
Object
  • Object
show all
Defined in:
lib/slack-rtm-api/api_client.rb

Constant Summary collapse

VALID_DRIVER_EVENTS =
[:open, :message, :error]
BASE_URL =
'https://slack.com/api'
RTM_START_PATH =
'/rtm.start'

Instance Method Summary collapse

Constructor Details

#initialize(token, silent = true) ⇒ ApiClient

Returns a new instance of ApiClient.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/slack-rtm-api/api_client.rb', line 13

def initialize(token, silent = true)
  @logger     = logger = Logger.new(STDOUT) unless silent
  @token      = token
  @silent     = silent
  @ready      = false
  @connected  = false

  if token.nil?
    raise ArgumentError.new "You should pass a valid RTM Websocket url"
  else
    @url = get_ws_url
  end

  @event_handlers = {}
  @events_queue   = []
end

Instance Method Details

#bind(type, &block) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/slack-rtm-api/api_client.rb', line 30

def bind(type, &block)
  unless VALID_DRIVER_EVENTS.include? type
    raise ArgumentError.new "The event `#{type}` doesn't exist, available events are: #{VALID_DRIVER_EVENTS}"
  end

  @event_handlers[type] = block
end

#check_wsObject



74
75
76
77
78
79
80
81
82
# File 'lib/slack-rtm-api/api_client.rb', line 74

def check_ws
  data = @socket.readpartial 4096

  return if data.nil? or data.empty?

  @driver.parse data

  handle_events_queue
end

#handle_events_queueObject



84
85
86
87
88
89
90
91
# File 'lib/slack-rtm-api/api_client.rb', line 84

def handle_events_queue
  @events_queue.each do |event|
    send_log "WebSocket::Driver send #{event}"
    @driver.text event
  end

  @events_queue.clear
end

#initObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/slack-rtm-api/api_client.rb', line 43

def init
  return if @ready

  @socket = OpenSSL::SSL::SSLSocket.new TCPSocket.new(@url.host, 443)
  @socket.connect

  @driver = WebSocket::Driver.client SlackRTMApi::ClientWrapper.new(@url.to_s, @socket)

  @driver.on :open do
    @connected = true
    send_log "WebSocket::Driver is now connected"
    @event_handlers[:open].call unless @event_handlers[:open].nil?
  end

  @driver.on :error do |event|
    @connected = false
    send_log "WebSocket::Driver recieved an error"
    @event_handlers[:error].call unless @event_handlers[:error].nil?
  end

  @driver.on :message do |event|
    data = JSON.parse event.data
    send_log "WebSocket::Driver recieved an event with data: #{data}"
    @event_handlers[:message].call data unless @event_handlers[:message].nil?
  end

  @driver.start

  @ready = true
end

#send(event) ⇒ Object



38
39
40
41
# File 'lib/slack-rtm-api/api_client.rb', line 38

def send(event)
  event[:id] = random_id
  @events_queue << event.to_json
end

#startObject



93
94
95
96
97
98
99
100
101
102
# File 'lib/slack-rtm-api/api_client.rb', line 93

def start
  t = Thread.new do
    init
    loop do
      check_ws
    end
  end

  t.abort_on_exception = true
end