diff --git a/fbchat/_message.py b/fbchat/_message.py index 6cefdc8..58b2534 100644 --- a/fbchat/_message.py +++ b/fbchat/_message.py @@ -43,8 +43,10 @@ class Mention: @classmethod def _from_range(cls, data): + # TODO: Parse data["entity"]["__typename"] return cls( - thread_id=data["entity"]["id"], + # Can be missing + thread_id=data["entity"].get("id"), offset=data["offset"], length=data["length"], ) @@ -234,7 +236,7 @@ class MessageData(Message): attachments = [ _file.graphql_to_attachment(attachment) - for attachment in data["blob_attachments"] or () + for attachment in data.get("blob_attachments") or () ] unsent = False if data.get("extensible_attachment") is not None: @@ -245,8 +247,11 @@ class MessageData(Message): attachments.append(attachment) replied_to = None - if data.get("replied_to_message"): - replied_to = cls._from_graphql(data["replied_to_message"]["message"]) + if data.get("replied_to_message") and data["replied_to_message"]["message"]: + # data["replied_to_message"]["message"] is None if the message is deleted + replied_to = cls._from_graphql( + thread, data["replied_to_message"]["message"] + ) return cls( thread=thread, diff --git a/tests/test_message.py b/tests/test_message.py index cc958fa..0cebf4a 100644 --- a/tests/test_message.py +++ b/tests/test_message.py @@ -47,6 +47,23 @@ def test_graphql_to_extensible_attachment_dispatch(monkeypatch, obj, type_): assert graphql_to_extensible_attachment(data) +def test_mention_from_range(): + data = {"length": 17, "offset": 0, "entity": {"__typename": "User", "id": "1234"}} + assert Mention(thread_id="1234", offset=0, length=17) == Mention._from_range(data) + data = { + "length": 2, + "offset": 10, + "entity": {"__typename": "MessengerViewer1To1Thread"}, + } + assert Mention(thread_id=None, offset=10, length=2) == Mention._from_range(data) + data = { + "length": 5, + "offset": 21, + "entity": {"__typename": "MessengerViewerGroupThread"}, + } + assert Mention(thread_id=None, offset=21, length=5) == Mention._from_range(data) + + def test_mention_to_send_data(): assert { "profile_xmd[0][id]": "1234",