class MessengerClient::MessageParser

Attributes

payload[R]

Public Class Methods

new(payload) click to toggle source

Takes in JSON parsed Hash from facebook

# File lib/messenger_client/message_parser.rb, line 5
def initialize(payload)
  @payload = payload
end

Public Instance Methods

parse() click to toggle source

Parses Hash messages in payload into list of appropriate Message type

# File lib/messenger_client/message_parser.rb, line 10
def parse
  e = payload["entry"].first
  e["messaging"].map { |message|
    parse_message(message)
  }.compact
end
parse_message(message) click to toggle source
# File lib/messenger_client/message_parser.rb, line 17
def parse_message(message)
  sender = MessengerClient::Message::Sender.new(message["sender"]["id"])
  timestamp = message["timestamp"]
  m = message["message"]
  if m.nil?
    return parse_non_message(message, timestamp, sender)
  end
  if attchs = m["attachments"]
    attch = attchs.first
    pl    = attch["payload"]
    url   = pl["url"]
    case attch["type"]
    when "image"
      if sid = pl["sticker_id"]
        MessengerClient::Message::Sticker.new(m["mid"], timestamp, sender, url, sid)
      else
        MessengerClient::Message::Image.new(m["mid"], timestamp, sender, url)
      end
    when "video"
      MessengerClient::Message::Video.new(m["mid"], timestamp, sender, url)
    when "audio"
      MessengerClient::Message::Audio.new(m["mid"], timestamp, sender, url)
    when "file"
      MessengerClient::Message::File.new(m["mid"], timestamp, sender, url)
    when "location"
      url = attch["url"]
      lat, lng = pl["coordinates"]["lat"], pl["coordinates"]["long"]
      MessengerClient::Message::Location.new(m["mid"], timestamp, sender, url, lat, lng)
    else
    end
  else
    parse_non_media(m, timestamp, sender)
  end
end
parse_non_media(message, timestamp, sender) click to toggle source
# File lib/messenger_client/message_parser.rb, line 52
def parse_non_media(message, timestamp, sender)
  if qr = message["quick_reply"]
    payload = qr["payload"].to_sym
    return MessengerClient::Message::QuickReply.new(message["mid"], timestamp, sender, payload, message["text"])
  end
  if txt = message["text"]
    return MessengerClient::Message::Text.new(message["mid"], timestamp, sender, txt)
  end
  return nil
end
parse_non_message(message, timestamp, sender) click to toggle source
# File lib/messenger_client/message_parser.rb, line 63
def parse_non_message(message, timestamp, sender)
  if pb = message["postback"]
    payload = pb["payload"].to_sym
    return MessengerClient::Message::Postback.new(timestamp, sender, payload)
  end
  if optin = message["optin"]
    ref = optin["ref"]
    return MessengerClient::Message::Optin.new(timestamp, sender, ref)
  end
  return nil
end