Class: Lita::CommanderMiddleware

Inherits:
Object
  • Object
show all
Defined in:
lib/lita/commander_middleware.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(open_sockets:) ⇒ CommanderMiddleware

Returns a new instance of CommanderMiddleware.



9
10
11
# File 'lib/lita/commander_middleware.rb', line 9

def initialize(open_sockets:)
  @open_sockets = open_sockets
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



7
8
9
# File 'lib/lita/commander_middleware.rb', line 7

def env
  @env
end

#open_socketsObject (readonly)

Returns the value of attribute open_sockets.



7
8
9
# File 'lib/lita/commander_middleware.rb', line 7

def open_sockets
  @open_sockets
end

Class Method Details

.build(open_sockets:) ⇒ Object

START:initialize



3
4
5
# File 'lib/lita/commander_middleware.rb', line 3

def self.build(open_sockets:)
  new(open_sockets: open_sockets).build
end

Instance Method Details

#buildObject

START:socket_building



15
16
17
18
19
20
21
22
23
24
# File 'lib/lita/commander_middleware.rb', line 15

def build
  lambda do |env|
    if Faye::WebSocket.websocket?(env)
      @env = env
      handle_env_has_socket
    else
      http_explainer_payload
    end
  end
end

#build_socket(env) ⇒ Object



26
27
28
29
30
31
# File 'lib/lita/commander_middleware.rb', line 26

def build_socket(env)
  ws = Faye::WebSocket.new(env)
  open_sockets << ws
  Lita.logger.debug "Sonos client count: #{open_sockets.count}"
  ws
end

#close_socket(ws, event) ⇒ Object



44
45
46
47
48
49
# File 'lib/lita/commander_middleware.rb', line 44

def close_socket(ws, event)
  open_sockets.delete_if { |s| s == ws }
  Lita.logger.debug "Sonos client count: #{open_sockets.count}"
  Lita.logger.debug "Socket close: #{[:close, event.code, event.reason]}"
  ws = nil
end

#handle_env_has_socketObject

START:request_handlers



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/lita/commander_middleware.rb', line 53

def handle_env_has_socket
  ws = build_socket(env)

  send_welcome_message(ws)

  ws.on(:message) { |event| handle_message(ws, event) }
  ws.on(:close) { |event| close_socket(ws, event) }

  # Return async Rack response
  ws.rack_response
end

#handle_message(ws, event) ⇒ Object



40
41
42
# File 'lib/lita/commander_middleware.rb', line 40

def handle_message(ws, event)
  ws.send({ message: "ACK: #{event.data}" }.to_json)
end

#http_explainer_payloadObject



65
66
67
68
69
70
71
# File 'lib/lita/commander_middleware.rb', line 65

def http_explainer_payload
  [
    200,
    { 'Content-Type' => 'text/plain' },
    ['Hello from a Lita chatbot! Feed me a websocket connection!']
  ]
end

#send_welcome_message(ws) ⇒ Object

START:event_handlers



35
36
37
38
# File 'lib/lita/commander_middleware.rb', line 35

def send_welcome_message(ws)
  payload = { message: 'Welcome to Lita Sonos Commander!', command: 'echo' }
  ws.send(payload.to_json)
end