Class: SlackRTMApi::ApiClient
- Inherits:
-
Object
- Object
- SlackRTMApi::ApiClient
- 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
- #bind(type, &block) ⇒ Object
- #check_ws ⇒ Object
- #handle_events_queue ⇒ Object
- #init ⇒ Object
-
#initialize(token, silent = true) ⇒ ApiClient
constructor
A new instance of ApiClient.
- #send(event) ⇒ Object
- #start ⇒ Object
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_ws ⇒ Object
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_queue ⇒ Object
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 |
#init ⇒ Object
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 |
#start ⇒ Object
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 |