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