Current section

Files

Jump to
messenger_bot_store lib messenger_bot_store handlers message.ex
Raw

lib/messenger_bot_store/handlers/message.ex

defmodule MessengerBotStore.Handler.Message do
@moduledoc """
Messenger Message Handler
"""
use GenServer
def start_link,
do: GenServer.start_link(__MODULE__, nil, name: __MODULE__)
def init(_) do
{:ok, nil}
end
@doc """
Process a request
"""
def process({:mb_message_attachments_received, _} = event_shadow) do
GenServer.cast(__MODULE__, event_shadow)
end
def process({:mb_message_quick_reply_received, _} = event_shadow) do
GenServer.cast(__MODULE__, event_shadow)
end
def process({:mb_message_received, _} = event_shadow) do
GenServer.cast(__MODULE__, event_shadow)
end
def process({topic, id}) do
EventBus.mark_as_skipped({__MODULE__, topic, id})
end
# Callbacks
def handle_cast({topic, id}, state) do
event = EventBus.fetch_event({topic, id})
process_entry(event.data)
EventBus.mark_as_completed({__MODULE__, topic, id})
{:noreply, state}
end
defp process_entry(%{app_id: app_id, messaging: messaging, page_id: page_id,
time: time}) do
time =
time
|> Ecto.DateTime.from_unix!(:millisecond)
|> Ecto.DateTime.to_erl()
|> NaiveDateTime.from_erl!()
process_messaging(app_id, page_id, time, messaging)
end
defp process_messaging(app_id, page_id, time, %{"sender" => %{"id" => id},
"message" => %{"mid" => mid, "attachments" => _attachments}} = messaging) do
conversation = %{mid: mid, app_id: app_id, page_id: page_id, user_id: id,
payload_action: "attachment", payload_content: messaging,
category: "message", received_at: time, delivered_at: time,
read_at: time}
MessengerBotStore.create_conversation(conversation)
end
defp process_messaging(app_id, page_id, time, %{"sender" => %{"id" => id},
"message" => %{"mid" => mid, "quick_reply" =>
%{"payload" => payload}}} = messaging) do
conversation = %{mid: mid, app_id: app_id, page_id: page_id, user_id: id,
payload_action: payload, payload_content: messaging,
category: "quick_reply", received_at: time, delivered_at: time,
read_at: time}
MessengerBotStore.create_conversation(conversation)
end
defp process_messaging(app_id, page_id, time, %{"sender" => %{"id" => id},
"message" => %{"mid" => mid}} = messaging) do
conversation = %{mid: mid, app_id: app_id, page_id: page_id, user_id: id,
payload_action: "text", payload_content: messaging, category: "message",
received_at: time, delivered_at: time, read_at: time}
MessengerBotStore.create_conversation(conversation)
end
defp process_messaging(_, _, _, _),
do: nil
end