Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

## Unreleased
- Remove share button support (deprecated by Facebook)
- Add icebreakers support

## 6.0.0
- Switch from message to recipient_id as method input
Expand Down
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -435,3 +435,18 @@ menu = PersistentMenu(menu_items=[menu_item_1, menu_item_2])
messenger_profile = MessengerProfile(persistent_menus=[menu])
messenger.set_messenger_profile(messenger_profile.to_dict())
```

### Ice Breakers

```python
from fbmessenger.thread_settings import IceBreakers, IceBreakersItem, MessengerProfile

ice_breaker_1 = IceBreakersItem(iquestion='<QUESTION1>', payload'PAYLOAD1')
ice_breaker_2 = IceBreakersItem(iquestion='<QUESTION2>', payload'PAYLOAD2')

ice_breakers = IceBreakers(question_items=[ice_breaker_1, ice_breaker_2]

messenger_profile = MessengerProfile(ice_breakers=ice_breakers)
messenger.set_messenger_profile(messenger_profile.to_dict())
```
You can then check for this payload in the `postback` method
13 changes: 13 additions & 0 deletions fbmessenger/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,19 @@ def delete_get_started(self, timeout=None):
)
return r.json()

def delete_ice_breakers(self, timeout=None):
r = self.session.delete(
'{graph_url}/me/messenger_profile'.format(graph_url=self.graph_url),
params=self.auth_args,
json={
'fields': [
'ice_breakers'
],
},
timeout=timeout
)
return r.json()

def delete_persistent_menu(self, timeout=None):
r = self.session.delete(
'{graph_url}/me/messenger_profile'.format(graph_url=self.graph_url),
Expand Down
30 changes: 29 additions & 1 deletion fbmessenger/thread_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,30 @@ def to_dict(self):
}


class IceBreakersItem(object):
def __init__(self, question, payload):
self.question = question
self.payload = payload

def to_dict(self):
return {
'question': self.question,
'payload': self.payload
}


class IceBreakers(object):
def __init__(self, question_items):
if len(question_items) > 6:
raise ValueError('You cannot have more than 6 ice breakers items.')

self.question_items = question_items

def to_dict(self):
if self.question_items:
return [item.to_dict() for item in self.question_items]


class PersistentMenuItem(object):
ITEM_TYPES = [
'nested',
Expand Down Expand Up @@ -131,10 +155,11 @@ def to_dict(self):


class MessengerProfile(object):
def __init__(self, greetings=None, get_started=None, persistent_menus=None):
def __init__(self, greetings=None, get_started=None, persistent_menus=None, ice_breakers=None):
self.greetings = greetings
self.get_started = get_started
self.persistent_menus = persistent_menus
self.ice_breakers = ice_breakers

def to_dict(self):
res = {}
Expand All @@ -150,4 +175,7 @@ def to_dict(self):
res['persistent_menu'] = [
item.to_dict() for item in self.persistent_menus]

if self.ice_breakers:
res['ice_breakers'] = self.ice_breakers.to_dict()

return res
19 changes: 19 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,25 @@ def test_delete_get_started(client, monkeypatch, default_params):
)


def test_delete_ice_breakers(client, monkeypatch, default_params):
mock_delete = mock.Mock()
mock_delete.return_value.status_code = 200
monkeypatch.setattr('requests.Session.delete', mock_delete)
client.delete_ice_breakers()

assert mock_delete.call_count == 1
mock_delete.assert_called_with(
'https://graph.facebook.com/v{api_version}/me/messenger_profile'.format(api_version=client.api_version),
params=default_params,
json={
'fields': [
'ice_breakers',
],
},
timeout=None
)


def test_delete_persistent_menu(client, monkeypatch, default_params):
mock_delete = mock.Mock()
mock_delete.return_value.status_code = 200
Expand Down
30 changes: 30 additions & 0 deletions tests/test_thread_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,36 @@ def test_persistent_menu(self):
}
assert expected == profile.to_dict()

def test_ice_breakers(self):
item = thread_settings.IceBreakersItem(
question="<QUESTION>",
payload="<PAYLOAD>"
)
res = thread_settings.IceBreakers(question_items=[item] * 2)
profile = thread_settings.MessengerProfile(ice_breakers=res)
expected = {
'ice_breakers': [
{
"question": "<QUESTION>",
"payload": "<PAYLOAD>"
}, {
"question": "<QUESTION>",
"payload": "<PAYLOAD>"
},
],
}
assert expected == profile.to_dict()

def test_ice_breakers_too_many_items(self):
item = thread_settings.IceBreakersItem(
question="<QUESTION>",
payload="<PAYLOAD>"
)
item_list = [item] * 7
with pytest.raises(ValueError) as err:
thread_settings.IceBreakers(question_items=item_list)
assert str(err.value) == 'You cannot have more than 6 ice breakers items.'

def test_composer_input_disabled(self):
item = thread_settings.PersistentMenuItem(
item_type='web_url',
Expand Down