# MessengerBot
Facebook Messenger Chatbot client
## Installation
The package can be installed by adding `messenger_bot` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[{:messenger_bot, "~> 0.4.0"}]
end
```
The docs can be found at [https://hexdocs.pm/messenger](https://hexdocs.pm/messenger).
## Usage
### Configuration
Update your `config.exs` file and set processor for each input data type, default is Log.
```elixir
# Configure messenger_bot
config :messenger_bot,
setup_token: {:system, "MESSENGER_SETUP_TOKEN", ""},
app_id: {:system, "MESSENGER_APP_ID", ""},
app_token: {:system, "MESSENGER_APP_TOKEN", ""},
pages: %{
"1334609009956145" => %{
id: "1334609009956145", name: "Support Bot",
token: {:system, "MESSENGER_PAGE_TOKEN_1334609009956145", ""}
}
}
# Register messenger_bot 'event_bus event topics'
config :event_bus,
topics: [:mb_message_sent_failed,
:mb_message_sent_succeeded,
:mb_webhook_received,
:mb_delivery_received,
:mb_read_received,
:mb_message_echo_received,
:mb_message_attachments_received,
:mb_message_quick_reply_received,
:mb_message_received,
:mb_optin_received,
:mb_postback_received,
:mb_referral_received,
:mb_payment_received,
:mb_checkout_update_received,
:mb_pre_checkout_received,
:mb_account_linking_received,
:mb_policy_enforcement_received,
:mb_app_roles_received,
:mb_standby_received,
:mb_pass_thread_control_received,
:mb_take_thread_control_received,
:mb_na_received]
```
### Subscribe to event topics
`messenger_bot` package uses [event_bus library](https://github.com/mustafaturan/event_bus) to sent/process Messenger events. Please refer to `event_bus` docs to learn more. You can subscribe registered events. To subscribe and log all events you can use `EventBus.subscribe({MessengerBot.Processor.Log, [".*"]})`.
Sample log
```elixir
01:22:29.489 [info] Sent 200 in 290µs
01:22:29.492 [info] mb_webhook_received -> %EventBus.Model.Event{data: "{\"object\":\"page\",\"entry\":[{\"id\":\"31513563891XXXX\",\"time\":1504052548757,\"messaging\":[{\"sender\":{\"id\":\"1471306002939594\"},\"recipient\":{\"id\":\"31513563891XXXX\"},\"timestamp\":1504052548363,\"message\":{\"mid\":\"mid.$cAAEenRz66V1kYcnbC1eMISSkp6Ee\",\"seq\":19280,\"text\":\"hello\"}}]}]}", id: "4edd3712-8d19-11e7-8a5c-784f438678d2", topic: :mb_webhook_received, transaction_id: "4edd3712-8d19-11e7-8a5c-784f438678d2"}
01:22:29.492 [info] mb_message_received -> %EventBus.Model.Event{data: %MessengerBot.Payload.Process{data: %MessengerBot.Model.Message{attachments: nil, is_echo: false, mid: "mid.$cAAEenRz66V1kYcnbC1eMISSkp6Ee", quick_reply: nil, seq: 19280, text: "hello"}, page_id: "31513563891XXXX", recipient: %MessengerBot.Model.Recipient{id: "31513563891XXXX"}, sender: %MessengerBot.Model.Sender{id: "1471306002939594"}, time: 1504052548757}, id: "4edd6340-8d19-11e7-82e1-784f438678d2", topic: :mb_message_received, transaction_id: "4edd3712-8d19-11e7-8a5c-784f438678d2"}
```
### Set Get Started Button
```elixir
alias MessengerBot.Payload.MessengerProfileSetRequest
alias MessengerBot.Service.MessagengerProfile
page_id = ""
request = MessengerProfileSetRequest.build_get_started_button()
response = MessagengerProfile.setup_get_started_button(page_id, request)
# %MessengerBot.Payload.MessengerProfileSetResponse{result: "success"}
```
### Set Persistent Menu
```elixir
alias MessengerBot.Payload.MessengerProfileSetRequest
alias MessengerBot.Service.MessagengerProfile
page_id = "123456"
menu_items = [persistent_menu()]
request = MessengerProfileSetRequest.build_persistent_menu(menu_items)
response = MessagengerProfile.setup_get_started_button(page_id, request)
# %MessengerBot.Payload.MessengerProfileSetResponse{result: "success"}
```