From 22217c793cdd0c3a89c986b3451bd70d91f80402 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Thu, 9 Jan 2020 14:09:17 +0100 Subject: [PATCH] Split User into User/UserData --- fbchat/__init__.py | 2 +- fbchat/_client.py | 13 ++++++----- fbchat/_user.py | 55 +++++++++++++++++++++++++++------------------- tests/test_user.py | 14 ++++++------ 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/fbchat/__init__.py b/fbchat/__init__.py index b6a6548..7ce2133 100644 --- a/fbchat/__init__.py +++ b/fbchat/__init__.py @@ -15,7 +15,7 @@ from ._core import Image from ._exception import FBchatException, FBchatFacebookError from ._session import Session from ._thread import ThreadLocation, ThreadColor, ThreadABC, Thread -from ._user import TypingStatus, User, ActiveStatus +from ._user import TypingStatus, User, UserData, ActiveStatus from ._group import Group from ._page import Page from ._message import EmojiSize, MessageReaction, Mention, Message diff --git a/fbchat/_client.py b/fbchat/_client.py index 2003083..06aa971 100644 --- a/fbchat/_client.py +++ b/fbchat/_client.py @@ -8,7 +8,7 @@ from . import _util, _graphql, _session from ._exception import FBchatException, FBchatFacebookError from ._thread import ThreadLocation, ThreadColor -from ._user import TypingStatus, User, ActiveStatus +from ._user import TypingStatus, User, UserData, ActiveStatus from ._group import Group from ._page import Page from ._message import EmojiSize, MessageReaction, Mention, Message @@ -204,7 +204,7 @@ class Client: if data["id"] in ["0", 0]: # Skip invalid users continue - users.append(User._from_all_fetch(self.session, data)) + users.append(UserData._from_all_fetch(self.session, data)) return users def search_for_users(self, name, limit=10): @@ -224,7 +224,8 @@ class Client: (j,) = self.graphql_requests(_graphql.from_query(_graphql.SEARCH_USER, params)) return [ - User._from_graphql(self.session, node) for node in j[name]["users"]["nodes"] + UserData._from_graphql(self.session, node) + for node in j[name]["users"]["nodes"] ] def search_for_pages(self, name, limit=10): @@ -288,7 +289,7 @@ class Client: rtn = [] for node in j[name]["threads"]["nodes"]: if node["__typename"] == "User": - rtn.append(User._from_graphql(self.session, node)) + rtn.append(UserData._from_graphql(self.session, node)) elif node["__typename"] == "MessageThread": # MessageThread => Group thread rtn.append(Group._from_graphql(self.session, node)) @@ -500,7 +501,7 @@ class Client: raise FBchatException("Could not fetch thread {}".format(_id)) entry.update(pages_and_users[_id]) if "first_name" in entry["type"]: - rtn[_id] = User._from_graphql(self.session, entry) + rtn[_id] = UserData._from_graphql(self.session, entry) else: rtn[_id] = Page._from_graphql(self.session, entry) else: @@ -549,7 +550,7 @@ class Client: if _type == "GROUP": rtn.append(Group._from_graphql(self.session, node)) elif _type == "ONE_TO_ONE": - rtn.append(User._from_thread_fetch(self.session, node)) + rtn.append(UserData._from_thread_fetch(self.session, node)) else: raise FBchatException( "Unknown thread type: {}, with data: {}".format(_type, node) diff --git a/fbchat/_user.py b/fbchat/_user.py index 2f691b8..8e60873 100644 --- a/fbchat/_user.py +++ b/fbchat/_user.py @@ -48,6 +48,38 @@ class User(_thread.ThreadABC): session = attr.ib(type=_session.Session) #: The user's unique identifier. id = attr.ib(converter=str) + + def _to_send_data(self): + return {"other_user_fbid": self.id} + + def confirm_friend_request(self): + """Confirm a friend request, adding the user to your friend list.""" + data = {"to_friend": self.id, "action": "confirm"} + j = self.session._payload_post("/ajax/add_friend/action.php?dpr=1", data) + + def remove_friend(self): + """Remove the user from the client's friend list.""" + data = {"uid": self.id} + j = self.session._payload_post("/ajax/profile/removefriendconfirm.php", data) + + def block(self): + """Block messages from the user.""" + data = {"fbid": self.id} + j = self.session._payload_post("/messaging/block_messages/?dpr=1", data) + + def unblock(self): + """Unblock a previously blocked user.""" + data = {"fbid": self.id} + j = self.session._payload_post("/messaging/unblock_messages/?dpr=1", data) + + +@attrs_default +class UserData(User): + """Represents data about a Facebook user. + + Inherits `User`, and implements `ThreadABC`. + """ + #: The user's picture photo = attr.ib(None) #: The name of the user @@ -79,29 +111,6 @@ class User(_thread.ThreadABC): #: The default emoji emoji = attr.ib(None) - def _to_send_data(self): - return {"other_user_fbid": self.id} - - def confirm_friend_request(self): - """Confirm a friend request, adding the user to your friend list.""" - data = {"to_friend": self.id, "action": "confirm"} - j = self.session._payload_post("/ajax/add_friend/action.php?dpr=1", data) - - def remove_friend(self): - """Remove the user from the client's friend list.""" - data = {"uid": self.id} - j = self.session._payload_post("/ajax/profile/removefriendconfirm.php", data) - - def block(self): - """Block messages from the user.""" - data = {"fbid": self.id} - j = self.session._payload_post("/messaging/block_messages/?dpr=1", data) - - def unblock(self): - """Unblock a previously blocked user.""" - data = {"fbid": self.id} - j = self.session._payload_post("/messaging/unblock_messages/?dpr=1", data) - @classmethod def _from_graphql(cls, session, data): if data.get("profile_picture") is None: diff --git a/tests/test_user.py b/tests/test_user.py index 6895937..3685c24 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,7 +1,7 @@ import pytest import datetime import fbchat -from fbchat._user import User, ActiveStatus +from fbchat._user import UserData, ActiveStatus def test_user_from_graphql(session): @@ -16,7 +16,7 @@ def test_user_from_graphql(session): "gender": "FEMALE", "viewer_affinity": 0.4560002, } - assert User( + assert UserData( session=session, id="1234", photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), @@ -27,7 +27,7 @@ def test_user_from_graphql(session): is_friend=True, gender="female_singular", affinity=0.4560002, - ) == User._from_graphql(session, data) + ) == UserData._from_graphql(session, data) def test_user_from_thread_fetch(session): @@ -138,7 +138,7 @@ def test_user_from_thread_fetch(session): "read_receipts": ..., "delivery_receipts": ..., } - assert User( + assert UserData( session=session, id="1234", photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), @@ -154,7 +154,7 @@ def test_user_from_thread_fetch(session): own_nickname="B", color=None, emoji=None, - ) == User._from_thread_fetch(session, data) + ) == UserData._from_thread_fetch(session, data) def test_user_from_all_fetch(session): @@ -177,7 +177,7 @@ def test_user_from_all_fetch(session): "is_nonfriend_messenger_contact": False, "is_blocked": False, } - assert User( + assert UserData( session=session, id="1234", photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), @@ -186,7 +186,7 @@ def test_user_from_all_fetch(session): first_name="Abc", is_friend=True, gender="female_singular", - ) == User._from_all_fetch(session, data) + ) == UserData._from_all_fetch(session, data) @pytest.mark.skip(reason="can't gather test data, the pulling is broken")