class Lita::CommanderMiddleware

Attributes

env[R]
open_sockets[R]

Public Class Methods

build(open_sockets:) click to toggle source

START:initialize

# File lib/lita/commander_middleware.rb, line 3
def self.build(open_sockets:)
  new(open_sockets: open_sockets).build
end
new(open_sockets:) click to toggle source
# File lib/lita/commander_middleware.rb, line 9
def initialize(open_sockets:)
  @open_sockets = open_sockets
end

Public Instance Methods

build() click to toggle source

START:socket_building

# 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) click to toggle source
# 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) click to toggle source
# 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_socket() click to toggle source

START:request_handlers

# 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) click to toggle source
# File lib/lita/commander_middleware.rb, line 40
def handle_message(ws, event)
  ws.send({ message: "ACK: #{event.data}" }.to_json)
end
http_explainer_payload() click to toggle source
# 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) click to toggle source

START:event_handlers

# 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