Split User into User/UserData
This commit is contained in:
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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:
|
||||
|
@@ -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")
|
||||
|
Reference in New Issue
Block a user