From 12bbc0058cfbcc6537e84f8f99b7616f814aeb65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Soszy=C5=84ski?= Date: Mon, 20 Jan 2020 09:28:41 +0100 Subject: [PATCH] Add onPendingMessage (#512) --- fbchat/_client.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/fbchat/_client.py b/fbchat/_client.py index e491d196..fc856058 100644 --- a/fbchat/_client.py +++ b/fbchat/_client.py @@ -2271,7 +2271,17 @@ def getThreadIdAndThreadType(msg_metadata): elif delta_class == "ForcedFetch": mid = delta.get("messageId") if mid is None: - self.onUnknownMesssageType(msg=delta) + if delta["threadKey"] is not None: + # Looks like the whole delta is metadata in this case + thread_id, thread_type = getThreadIdAndThreadType(delta) + self.onPendingMessage( + thread_id=thread_id, + thread_type=thread_type, + metadata=delta, + msg=delta, + ) + else: + self.onUnknownMesssageType(msg=delta) else: thread_id = str(delta["threadKey"]["threadFbId"]) fetch_info = self._forcedFetch(thread_id, mid) @@ -2727,6 +2737,14 @@ def getThreadIdAndThreadType(msg_metadata): msg=delta, ) + # New pending message + elif delta_class == "ThreadFolder" and delta.get("folder") == "FOLDER_PENDING": + # Looks like the whole delta is metadata in this case + thread_id, thread_type = getThreadIdAndThreadType(delta) + self.onPendingMessage( + thread_id=thread_id, thread_type=thread_type, metadata=delta, msg=delta + ) + # Unknown message type else: self.onUnknownMesssageType(msg=delta) @@ -2949,6 +2967,21 @@ def onMessage( """ log.info("{} from {} in {}".format(message_object, thread_id, thread_type.name)) + def onPendingMessage( + self, thread_id=None, thread_type=None, metadata=None, msg=None + ): + """Called when the client is listening, and somebody that isn't + connected with you on either Facebook or Messenger sends a message. + After that, you need to use fetchThreadList to actually read the message. + + Args: + thread_id: Thread ID that the message was sent to. See :ref:`intro_threads` + thread_type (ThreadType): Type of thread that the message was sent to. See :ref:`intro_threads` + metadata: Extra metadata about the message + msg: A full set of the data received + """ + log.info("New pending message from {}".format(thread_id)) + def onColorChange( self, mid=None,