class Sinbotra::Messenger::Middleware::ParseMessage

Public Class Methods

new(app) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 3
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 7
def call(env)
  req = Rack::Request.new(env)
  return @app.call(env) unless req.post?
  data = json(req)
  env["facebook.messages"] = parse_messages(data)
  @app.call(env)
end

Private Instance Methods

json(req) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 75
def json(req)
  req.body.rewind
  body = req.body.read
  JSON.load(body)
end
parse_message(message) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 25
def parse_message(message)
  sender = Sinbotra::Messenger::Message::Sender.new(message["sender"]["id"])
  timestamp = message["timestamp"]
  m = message["message"]
  if m.nil?
    return parse_postback(message, timestamp, sender)
  end
  if attchs = m["attachments"]
    attch = attchs.first
    pl    = attch["payload"]
    url   = pl["url"]
    case attch["type"]
    when "image"
      Sinbotra::Messenger::Message::Image.new(m["mid"], timestamp, sender, url, pl["sticker_id"])
    when "video"
      Sinbotra::Messenger::Message::Video.new(m["mid"], timestamp, sender, url)
    when "audio"
      Sinbotra::Messenger::Message::Audio.new(m["mid"], timestamp, sender, url)
    when "file"
      Sinbotra::Messenger::Message::File.new(m["mid"], timestamp, sender, url)
    when "location"
      url = attch["url"]
      lat, lng = pl["coordinates"]["lat"], pl["coordinates"]["long"]
      Sinbotra::Messenger::Message::Location.new(m["mid"], timestamp, sender, url, lat, lng)
    else
    end
  else
    parse_non_media(m, timestamp, sender)
  end
end
parse_messages(data) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 17
def parse_messages(data)
  $logger.debug("Data: #{data}")
  e = data["entry"].first
  e["messaging"].map { |message|
    parse_message(message)
  }.compact
end
parse_non_media(message, timestamp, sender) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 56
def parse_non_media(message, timestamp, sender)
  if qr = message["quick_reply"]
    payload = qr["payload"].to_sym
    return Sinbotra::Messenger::Message::QuickReply.new(message["mid"], timestamp, sender, payload, message["text"])
  end
  if txt = message["text"]
    return Sinbotra::Messenger::Message::Text.new(message["mid"], timestamp, sender, txt)
  end
  return nil
end
parse_postback(message, timestamp, sender) click to toggle source
# File lib/sinbotra/messenger/middleware/parse_message.rb, line 67
def parse_postback(message, timestamp, sender)
  if pb = message["postback"]
    payload = pb["payload"].to_sym
    return Sinbotra::Messenger::Message::Postback.new(timestamp, sender, payload)
  end
  return nil
end