Packages
messenger_bot
1.1.0
1.3.0
1.2.0
retired
1.1.0
retired
1.0.0
retired
1.0.0-rc.8
retired
1.0.0-rc.7
retired
1.0.0-rc.6
retired
1.0.0-rc.5
retired
1.0.0-rc.4
retired
1.0.0-rc.3
retired
1.0.0-rc.2
retired
1.0.0-rc.1
retired
1.0.0-beta9
retired
1.0.0-beta8
retired
1.0.0-beta7
retired
1.0.0-beta6
retired
1.0.0-beta5
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
1.0.0-beta10
retired
1.0.0-beta1
retired
0.9.2
retired
0.9.1
retired
0.9.0
retired
0.8.2
retired
0.8.1
retired
0.8.0
retired
0.7.3
retired
0.7.2
retired
0.7.1
retired
0.7.0
retired
0.6.0
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.0
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.0
retired
Unofficial Facebook Messenger Platform chatbot client and webhook handler
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/messenger_bot/web/services/setup.ex
defmodule MessengerBot.Web.Service.Setup do
@moduledoc """
MessengerBot webhook setup handler
"""
use EventBus.EventSource
alias MessengerBot.Util.String, as: StringUtil
@type messenger_webhook_setup_params :: Map.t()
@type app :: Map.t()
@type status :: :ok | :unprocessable_entity | :unauthorized
@type res :: {status(), Map.t()}
@topic :mb_app_setup_received
@required_params ~w(hub.challenge hub.mode hub.verify_token)
@doc """
Process setup webhooks coming from Facebook Messenger Platform
"""
@spec run(app(), messenger_webhook_setup_params()) :: no_return()
def run(%{id: app_id, setup_token: setup_token}, params) do
transaction_id = unique_id()
event_params = %{transaction_id: transaction_id, topic: @topic}
{status, params} =
EventSource.notify event_params do
verified_params = verify_params(params)
verify_token(verified_params, setup_token)
end
{status, Map.put(params, :app_id, app_id)}
end
defp verify_params(%{"hub.challenge" => _, "hub.mode" => _, "hub.verify_token" => _} = params) do
{:ok, params}
end
defp verify_params(params) do
missing_params = @required_params -- Map.keys(params)
{:unprocessable_entity, %{missing_params: missing_params}}
end
defp verify_token({:ok, %{"hub.verify_token" => token} = params}, setup_token) do
if setup_token == token do
{:ok, params}
else
{:unauthorized, %{"hub.verify_token": "Token(#{token}) is not valid!"}}
end
end
defp verify_token(bypass_data, _) do
bypass_data
end
defp unique_id do
StringUtil.unique_id()
end
end