Rename .uid -> .id everywhere

This commit is contained in:
Mads Marquart
2020-01-08 23:09:51 +01:00
parent 45c0a4772d
commit a5abb05ab3
35 changed files with 171 additions and 180 deletions

View File

@@ -53,7 +53,7 @@ This is required for many of ``fbchat``'s functions, since Facebook differentiat
Searching for group chats and finding their ID can be done via. `Client.search_for_groups`, Searching for group chats and finding their ID can be done via. `Client.search_for_groups`,
and searching for users is possible via. `Client.search_for_users`. See :ref:`intro_fetching` and searching for users is possible via. `Client.search_for_users`. See :ref:`intro_fetching`
You can get your own user ID by using `Client.uid` You can get your own user ID by using `Session.user_id`
Getting the ID of a group chat is fairly trivial otherwise, since you only need to navigate to `<https://www.facebook.com/messages/>`_, Getting the ID of a group chat is fairly trivial otherwise, since you only need to navigate to `<https://www.facebook.com/messages/>`_,
click on the group you want to find the ID of, and then read the id from the address bar. click on the group you want to find the ID of, and then read the id from the address bar.
@@ -106,7 +106,7 @@ like adding users to and removing users from a group chat, logically only works
The simplest way of using ``fbchat`` is to send a message. The simplest way of using ``fbchat`` is to send a message.
The following snippet will, as you've probably already figured out, send the message ``test message`` to your account:: The following snippet will, as you've probably already figured out, send the message ``test message`` to your account::
message_id = client.send(Message(text='test message'), thread_id=client.uid, thread_type=ThreadType.USER) message_id = client.send(Message(text='test message'), thread_id=session.user_id, thread_type=ThreadType.USER)
You can see a full example showing all the possible thread interactions with ``fbchat`` by going to :ref:`examples` You can see a full example showing all the possible thread interactions with ``fbchat`` by going to :ref:`examples`
@@ -123,7 +123,7 @@ The following snippet will search for users by their name, take the first (and m
users = client.search_for_users('<name of user>') users = client.search_for_users('<name of user>')
user = users[0] user = users[0]
print("User's ID: {}".format(user.uid)) print("User's ID: {}".format(user.id))
print("User's name: {}".format(user.name)) print("User's name: {}".format(user.name))
print("User's profile picture URL: {}".format(user.photo)) print("User's profile picture URL: {}".format(user.photo))
print("User's main URL: {}".format(user.url)) print("User's main URL: {}".format(user.url))

View File

@@ -3,13 +3,13 @@ import fbchat
# Subclass fbchat.Client and override required methods # Subclass fbchat.Client and override required methods
class EchoBot(fbchat.Client): class EchoBot(fbchat.Client):
def on_message(self, author_id, message_object, thread_id, thread_type, **kwargs): def on_message(self, author_id, message_object, thread_id, thread_type, **kwargs):
self.mark_as_delivered(thread_id, message_object.uid) self.mark_as_delivered(thread_id, message_object.id)
self.mark_as_read(thread_id) self.mark_as_read(thread_id)
print("{} from {} in {}".format(message_object, thread_id, thread_type.name)) print("{} from {} in {}".format(message_object, thread_id, thread_type.name))
# If you're not the author, echo # If you're not the author, echo
if author_id != self.uid: if author_id != session.user_id:
self.send(message_object, thread_id=thread_id, thread_type=thread_type) self.send(message_object, thread_id=thread_id, thread_type=thread_type)

View File

@@ -8,7 +8,7 @@ client = fbchat.Client(session)
# Fetches a list of all users you're currently chatting with, as `User` objects # Fetches a list of all users you're currently chatting with, as `User` objects
users = client.fetch_all_users() users = client.fetch_all_users()
print("users' IDs: {}".format([user.uid for user in users])) print("users' IDs: {}".format([user.id for user in users]))
print("users' names: {}".format([user.name for user in users])) print("users' names: {}".format([user.name for user in users]))
@@ -25,7 +25,7 @@ print("users' names: {}".format([users[k].name for k in users]))
# and then we just take the first one, aka. the most likely one: # and then we just take the first one, aka. the most likely one:
user = client.search_for_users("<name of user>")[0] user = client.search_for_users("<name of user>")[0]
print("user ID: {}".format(user.uid)) print("user ID: {}".format(user.id))
print("user's name: {}".format(user.name)) print("user's name: {}".format(user.name))
print("user's photo: {}".format(user.photo)) print("user's photo: {}".format(user.photo))
print("Is user client's friend: {}".format(user.is_friend)) print("Is user client's friend: {}".format(user.is_friend))

View File

@@ -31,7 +31,7 @@ class KeepBot(fbchat.Client):
self.change_thread_emoji(old_emoji, thread_id=thread_id) self.change_thread_emoji(old_emoji, thread_id=thread_id)
def on_people_added(self, added_ids, author_id, thread_id, **kwargs): def on_people_added(self, added_ids, author_id, thread_id, **kwargs):
if old_thread_id == thread_id and author_id != self.uid: if old_thread_id == thread_id and author_id != session.user_id:
print("{} got added. They will be removed".format(added_ids)) print("{} got added. They will be removed".format(added_ids))
for added_id in added_ids: for added_id in added_ids:
self.remove_user_from_group(added_id, thread_id=thread_id) self.remove_user_from_group(added_id, thread_id=thread_id)
@@ -40,8 +40,8 @@ class KeepBot(fbchat.Client):
# No point in trying to add ourself # No point in trying to add ourself
if ( if (
old_thread_id == thread_id old_thread_id == thread_id
and removed_id != self.uid and removed_id != session.user_id
and author_id != self.uid and author_id != session.user_id
): ):
print("{} got removed. They will be re-added".format(removed_id)) print("{} got removed. They will be re-added".format(removed_id))
self.add_users_to_group(removed_id, thread_id=thread_id) self.add_users_to_group(removed_id, thread_id=thread_id)

View File

@@ -8,7 +8,7 @@ class Attachment:
"""Represents a Facebook attachment.""" """Represents a Facebook attachment."""
#: The attachment ID #: The attachment ID
uid = attr.ib(None) id = attr.ib(None)
@attrs_default @attrs_default
@@ -56,7 +56,7 @@ class ShareAttachment(Attachment):
url = data.get("url") url = data.get("url")
return cls( return cls(
uid=data.get("deduplication_key"), id=data.get("deduplication_key"),
author=data["target"]["actors"][0]["id"] author=data["target"]["actors"][0]["id"]
if data["target"].get("actors") if data["target"].get("actors")
else None, else None,

View File

@@ -43,14 +43,6 @@ class Client:
useful while listening). useful while listening).
""" """
@property
def uid(self):
"""The ID of the client.
Can be used as ``thread_id``. See :ref:`intro_threads` for more info.
"""
return self._uid
def __init__(self, session): def __init__(self, session):
"""Initialize and log in the client. """Initialize and log in the client.
@@ -68,7 +60,6 @@ class Client:
self._mark_alive = True self._mark_alive = True
self._buddylist = dict() self._buddylist = dict()
self._session = session self._session = session
self._uid = session.user_id
""" """
INTERNAL REQUEST METHODS INTERNAL REQUEST METHODS
@@ -192,12 +183,12 @@ class Client:
users_to_fetch = [] # It's more efficient to fetch all users in one request users_to_fetch = [] # It's more efficient to fetch all users in one request
for thread in threads: for thread in threads:
if thread.type == ThreadType.USER: if thread.type == ThreadType.USER:
if thread.uid not in [user.uid for user in users]: if thread.id not in [user.id for user in users]:
users.append(thread) users.append(thread)
elif thread.type == ThreadType.GROUP: elif thread.type == ThreadType.GROUP:
for user_id in thread.participants: for user_id in thread.participants:
if ( if (
user_id not in [user.uid for user in users] user_id not in [user.id for user in users]
and user_id not in users_to_fetch and user_id not in users_to_fetch
): ):
users_to_fetch.append(user_id) users_to_fetch.append(user_id)
@@ -214,7 +205,7 @@ class Client:
Raises: Raises:
FBchatException: If request failed FBchatException: If request failed
""" """
data = {"viewer": self._uid} data = {"viewer": self._session.user_id}
j = self._payload_post("/chat/user_info_all", data) j = self._payload_post("/chat/user_info_all", data)
users = [] users = []
@@ -837,7 +828,7 @@ class Client:
elif i["node"].get("__typename") == "MessageVideo": elif i["node"].get("__typename") == "MessageVideo":
yield VideoAttachment._from_list(i) yield VideoAttachment._from_list(i)
else: else:
yield Attachment(uid=i["node"].get("legacy_attachment_id")) yield Attachment(id=i["node"].get("legacy_attachment_id"))
del j[thread_id]["message_shared_media"]["edges"][0] del j[thread_id]["message_shared_media"]["edges"][0]
""" """
@@ -873,7 +864,7 @@ class Client:
Raises: Raises:
FBchatException: If request failed FBchatException: If request failed
""" """
thread = thread_type._to_class()(uid=thread_id) thread = thread_type._to_class()(id=thread_id)
data = thread._to_send_data() data = thread._to_send_data()
data.update(message._to_send_data()) data.update(message._to_send_data())
return self._do_send_request(data) return self._do_send_request(data)
@@ -892,7 +883,7 @@ class Client:
Raises: Raises:
FBchatException: If request failed FBchatException: If request failed
""" """
thread = thread_type._to_class()(uid=thread_id) thread = thread_type._to_class()(id=thread_id)
data = thread._to_send_data() data = thread._to_send_data()
data["action_type"] = "ma-type:user-generated-message" data["action_type"] = "ma-type:user-generated-message"
data["lightweight_action_attachment[lwa_state]"] = ( data["lightweight_action_attachment[lwa_state]"] = (
@@ -965,7 +956,7 @@ class Client:
def _send_location( def _send_location(
self, location, current=True, message=None, thread_id=None, thread_type=None self, location, current=True, message=None, thread_id=None, thread_type=None
): ):
thread = thread_type._to_class()(uid=thread_id) thread = thread_type._to_class()(id=thread_id)
data = thread._to_send_data() data = thread._to_send_data()
if message is not None: if message is not None:
data.update(message._to_send_data()) data.update(message._to_send_data())
@@ -1033,7 +1024,7 @@ class Client:
`files` should be a list of tuples, with a file's ID and mimetype. `files` should be a list of tuples, with a file's ID and mimetype.
""" """
thread = thread_type._to_class()(uid=thread_id) thread = thread_type._to_class()(id=thread_id)
data = thread._to_send_data() data = thread._to_send_data()
data.update(self._old_message(message)._to_send_data()) data.update(self._old_message(message)._to_send_data())
data["action_type"] = "ma-type:user-generated-message" data["action_type"] = "ma-type:user-generated-message"
@@ -1179,7 +1170,7 @@ class Client:
if len(user_ids) < 2: if len(user_ids) < 2:
raise ValueError("Error when creating group: Not enough participants") raise ValueError("Error when creating group: Not enough participants")
for i, user_id in enumerate(user_ids + [self._uid]): for i, user_id in enumerate(user_ids + [self._session.user_id]):
data["specific_to_list[{}]".format(i)] = "fbid:{}".format(user_id) data["specific_to_list[{}]".format(i)] = "fbid:{}".format(user_id)
message_id, thread_id = self._do_send_request(data, get_thread_id=True) message_id, thread_id = self._do_send_request(data, get_thread_id=True)
@@ -1199,7 +1190,7 @@ class Client:
Raises: Raises:
FBchatException: If request failed FBchatException: If request failed
""" """
data = Group(uid=thread_id)._to_send_data() data = Group(id=thread_id)._to_send_data()
data["action_type"] = "ma-type:log-message" data["action_type"] = "ma-type:log-message"
data["log_message_type"] = "log:subscribe" data["log_message_type"] = "log:subscribe"
@@ -1207,7 +1198,7 @@ class Client:
user_ids = _util.require_list(user_ids) user_ids = _util.require_list(user_ids)
for i, user_id in enumerate(user_ids): for i, user_id in enumerate(user_ids):
if user_id == self._uid: if user_id == self._session.user_id:
raise ValueError( raise ValueError(
"Error when adding users: Cannot add self to group thread" "Error when adding users: Cannot add self to group thread"
) )
@@ -1283,7 +1274,7 @@ class Client:
data = { data = {
"client_mutation_id": "0", "client_mutation_id": "0",
"actor_id": self._uid, "actor_id": self._session.user_id,
"thread_fbid": thread_id, "thread_fbid": thread_id,
"user_ids": user_ids, "user_ids": user_ids,
"response": "ACCEPT" if approve else "DENY", "response": "ACCEPT" if approve else "DENY",
@@ -1456,7 +1447,7 @@ class Client:
data = { data = {
"action": "ADD_REACTION" if reaction else "REMOVE_REACTION", "action": "ADD_REACTION" if reaction else "REMOVE_REACTION",
"client_mutation_id": "1", "client_mutation_id": "1",
"actor_id": self._uid, "actor_id": self._session.user_id,
"message_id": str(message_id), "message_id": str(message_id),
"reaction": reaction.value if reaction else None, "reaction": reaction.value if reaction else None,
} }
@@ -1501,7 +1492,7 @@ class Client:
FBchatException: If request failed FBchatException: If request failed
""" """
data = { data = {
"event_reminder_id": plan.uid, "event_reminder_id": plan.id,
"delete": "false", "delete": "false",
"date": _util.datetime_to_seconds(new_plan.time), "date": _util.datetime_to_seconds(new_plan.time),
"location_name": new_plan.location or "", "location_name": new_plan.location or "",
@@ -1520,7 +1511,7 @@ class Client:
Raises: Raises:
FBchatException: If request failed FBchatException: If request failed
""" """
data = {"event_reminder_id": plan.uid, "delete": "true", "acontext": ACONTEXT} data = {"event_reminder_id": plan.id, "delete": "true", "acontext": ACONTEXT}
j = self._payload_post("/ajax/eventreminder/submit", data) j = self._payload_post("/ajax/eventreminder/submit", data)
def change_plan_participation(self, plan, take_part=True): def change_plan_participation(self, plan, take_part=True):
@@ -1534,7 +1525,7 @@ class Client:
FBchatException: If request failed FBchatException: If request failed
""" """
data = { data = {
"event_reminder_id": plan.uid, "event_reminder_id": plan.id,
"guest_state": "GOING" if take_part else "DECLINED", "guest_state": "GOING" if take_part else "DECLINED",
"acontext": ACONTEXT, "acontext": ACONTEXT,
} }
@@ -1913,14 +1904,14 @@ class Client:
def _ping(self): def _ping(self):
data = { data = {
"seq": self._seq, "seq": self._seq,
"channel": "p_" + self._uid, "channel": "p_" + self._session.user_id,
"clientid": self._session._client_id, "clientid": self._session._client_id,
"partition": -2, "partition": -2,
"cap": 0, "cap": 0,
"uid": self._uid, "uid": self._session.user_id,
"sticky_token": self._sticky, "sticky_token": self._sticky,
"sticky_pool": self._pool, "sticky_pool": self._pool,
"viewer_uid": self._uid, "viewer_uid": self._session.user_id,
"state": "active", "state": "active",
} }
j = self._get( j = self._get(
@@ -2461,7 +2452,7 @@ class Client:
replied_to = Message._from_reply(i["repliedToMessage"]) replied_to = Message._from_reply(i["repliedToMessage"])
message = Message._from_reply(i["message"], replied_to) message = Message._from_reply(i["message"], replied_to)
self.on_message( self.on_message(
mid=message.uid, mid=message.id,
author_id=message.author, author_id=message.author,
message_object=message, message_object=message,
thread_id=thread_id, thread_id=thread_id,
@@ -2537,7 +2528,7 @@ class Client:
thread_id = str(thread_id) thread_id = str(thread_id)
else: else:
thread_type = ThreadType.USER thread_type = ThreadType.USER
if author_id == self._uid: if author_id == self._session.user_id:
thread_id = m.get("to") thread_id = m.get("to")
else: else:
thread_id = author_id thread_id = author_id

View File

@@ -24,7 +24,7 @@ class FileAttachment(Attachment):
size=size, size=size,
name=data.get("filename"), name=data.get("filename"),
is_malicious=data.get("is_malicious"), is_malicious=data.get("is_malicious"),
uid=data.get("message_file_fbid"), id=data.get("message_file_fbid"),
) )
@@ -86,7 +86,7 @@ class ImageAttachment(Attachment):
height=data.get("original_dimensions", {}).get("height"), height=data.get("original_dimensions", {}).get("height"),
is_animated=data["__typename"] == "MessageAnimatedImage", is_animated=data["__typename"] == "MessageAnimatedImage",
previews={p for p in previews if p}, previews={p for p in previews if p},
uid=data.get("legacy_attachment_id"), id=data.get("legacy_attachment_id"),
) )
@classmethod @classmethod
@@ -103,7 +103,7 @@ class ImageAttachment(Attachment):
width=data["original_dimensions"].get("x"), width=data["original_dimensions"].get("x"),
height=data["original_dimensions"].get("y"), height=data["original_dimensions"].get("y"),
previews={p for p in previews if p}, previews={p for p in previews if p},
uid=data["legacy_attachment_id"], id=data["legacy_attachment_id"],
) )
@@ -139,7 +139,7 @@ class VideoAttachment(Attachment):
duration=_util.millis_to_timedelta(data.get("playable_duration_in_ms")), duration=_util.millis_to_timedelta(data.get("playable_duration_in_ms")),
preview_url=data.get("playable_url"), preview_url=data.get("playable_url"),
previews={p for p in previews if p}, previews={p for p in previews if p},
uid=data.get("legacy_attachment_id"), id=data.get("legacy_attachment_id"),
) )
@classmethod @classmethod
@@ -151,7 +151,7 @@ class VideoAttachment(Attachment):
duration=_util.millis_to_timedelta(media.get("playable_duration_in_ms")), duration=_util.millis_to_timedelta(media.get("playable_duration_in_ms")),
preview_url=media.get("playable_url"), preview_url=media.get("playable_url"),
previews={image} if image else {}, previews={image} if image else {},
uid=data["target"].get("video_id"), id=data["target"].get("video_id"),
) )
@classmethod @classmethod
@@ -167,7 +167,7 @@ class VideoAttachment(Attachment):
width=data["original_dimensions"].get("x"), width=data["original_dimensions"].get("x"),
height=data["original_dimensions"].get("y"), height=data["original_dimensions"].get("y"),
previews=previews, previews=previews,
uid=data["legacy_attachment_id"], id=data["legacy_attachment_id"],
) )
@@ -182,7 +182,7 @@ def graphql_to_attachment(data, size=None):
elif _type == "MessageFile": elif _type == "MessageFile":
return FileAttachment._from_graphql(data, size=size) return FileAttachment._from_graphql(data, size=size)
return Attachment(uid=data.get("legacy_attachment_id")) return Attachment(id=data.get("legacy_attachment_id"))
def graphql_to_subattachment(data): def graphql_to_subattachment(data):

View File

@@ -52,7 +52,7 @@ class Group(Thread):
plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0]) plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0])
return cls( return cls(
uid=data["thread_key"]["thread_fbid"], id=data["thread_key"]["thread_fbid"],
participants=set( participants=set(
[ [
node["messaging_actor"]["id"] node["messaging_actor"]["id"]
@@ -81,4 +81,4 @@ class Group(Thread):
) )
def _to_send_data(self): def _to_send_data(self):
return {"thread_fbid": self.uid} return {"thread_fbid": self.id}

View File

@@ -33,7 +33,7 @@ class LocationAttachment(Attachment):
latitude, longitude = None, None latitude, longitude = None, None
return cls( return cls(
uid=int(data["deduplication_key"]), id=int(data["deduplication_key"]),
latitude=latitude, latitude=latitude,
longitude=longitude, longitude=longitude,
image=Image._from_uri_or_none(data["media"].get("image")) image=Image._from_uri_or_none(data["media"].get("image"))
@@ -58,7 +58,7 @@ class LiveLocationAttachment(LocationAttachment):
@classmethod @classmethod
def _from_pull(cls, data): def _from_pull(cls, data):
return cls( return cls(
uid=data["id"], id=data["id"],
latitude=data["coordinate"]["latitude"] / (10 ** 8) latitude=data["coordinate"]["latitude"] / (10 ** 8)
if not data.get("stopReason") if not data.get("stopReason")
else None, else None,
@@ -80,7 +80,7 @@ class LiveLocationAttachment(LocationAttachment):
image = Image._from_uri(media["image"]) image = Image._from_uri(media["image"])
return cls( return cls(
uid=int(target["live_location_id"]), id=int(target["live_location_id"]),
latitude=target["coordinate"]["latitude"] latitude=target["coordinate"]["latitude"]
if target.get("coordinate") if target.get("coordinate")
else None, else None,

View File

@@ -85,7 +85,7 @@ class Message:
#: A `EmojiSize`. Size of a sent emoji #: A `EmojiSize`. Size of a sent emoji
emoji_size = attr.ib(None) emoji_size = attr.ib(None)
#: The message ID #: The message ID
uid = attr.ib(None) id = attr.ib(None)
#: ID of the sender #: ID of the sender
author = attr.ib(None) author = attr.ib(None)
#: Datetime of when the message was sent #: Datetime of when the message was sent
@@ -186,7 +186,7 @@ class Message:
data["sticker_id"] = self.emoji_size.value data["sticker_id"] = self.emoji_size.value
if self.sticker: if self.sticker:
data["sticker_id"] = self.sticker.uid data["sticker_id"] = self.sticker.id
if self.quick_replies: if self.quick_replies:
xmd = {"quick_replies": []} xmd = {"quick_replies": []}
@@ -255,7 +255,7 @@ class Message:
Mention._from_range(m) for m in data["message"].get("ranges") or () Mention._from_range(m) for m in data["message"].get("ranges") or ()
], ],
emoji_size=EmojiSize._from_tags(tags), emoji_size=EmojiSize._from_tags(tags),
uid=str(data["message_id"]), id=str(data["message_id"]),
author=str(data["message_sender"]["id"]), author=str(data["message_sender"]["id"]),
created_at=created_at, created_at=created_at,
is_read=not data["unread"] if data.get("unread") is not None else None, is_read=not data["unread"] if data.get("unread") is not None else None,
@@ -272,7 +272,7 @@ class Message:
attachments=attachments, attachments=attachments,
quick_replies=cls._parse_quick_replies(data.get("platform_xmd_encoded")), quick_replies=cls._parse_quick_replies(data.get("platform_xmd_encoded")),
unsent=unsent, unsent=unsent,
reply_to_id=replied_to.uid if replied_to else None, reply_to_id=replied_to.id if replied_to else None,
replied_to=replied_to, replied_to=replied_to,
forwarded=cls._get_forwarded_from_tags(tags), forwarded=cls._get_forwarded_from_tags(tags),
) )
@@ -311,14 +311,14 @@ class Message:
for m in _util.parse_json(data.get("data", {}).get("prng", "[]")) for m in _util.parse_json(data.get("data", {}).get("prng", "[]"))
], ],
emoji_size=EmojiSize._from_tags(tags), emoji_size=EmojiSize._from_tags(tags),
uid=metadata.get("messageId"), id=metadata.get("messageId"),
author=str(metadata.get("actorFbId")), author=str(metadata.get("actorFbId")),
created_at=_util.millis_to_datetime(metadata.get("timestamp")), created_at=_util.millis_to_datetime(metadata.get("timestamp")),
sticker=sticker, sticker=sticker,
attachments=attachments, attachments=attachments,
quick_replies=cls._parse_quick_replies(data.get("platform_xmd_encoded")), quick_replies=cls._parse_quick_replies(data.get("platform_xmd_encoded")),
unsent=unsent, unsent=unsent,
reply_to_id=replied_to.uid if replied_to else None, reply_to_id=replied_to.id if replied_to else None,
replied_to=replied_to, replied_to=replied_to,
forwarded=cls._get_forwarded_from_tags(tags), forwarded=cls._get_forwarded_from_tags(tags),
) )
@@ -374,7 +374,7 @@ class Message:
text=data.get("body"), text=data.get("body"),
mentions=mentions, mentions=mentions,
emoji_size=EmojiSize._from_tags(tags), emoji_size=EmojiSize._from_tags(tags),
uid=mid, id=mid,
author=author, author=author,
created_at=created_at, created_at=created_at,
sticker=sticker, sticker=sticker,
@@ -391,7 +391,7 @@ def graphql_to_extensible_attachment(data):
target = story.get("target") target = story.get("target")
if not target: if not target:
return _attachment.UnsentMessage(uid=data.get("legacy_attachment_id")) return _attachment.UnsentMessage(id=data.get("legacy_attachment_id"))
_type = target["__typename"] _type = target["__typename"]
if _type == "MessageLocation": if _type == "MessageLocation":

View File

@@ -42,7 +42,7 @@ class Page(Thread):
plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0]) plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0])
return cls( return cls(
uid=data["id"], id=data["id"],
url=data.get("url"), url=data.get("url"),
city=data.get("city").get("name"), city=data.get("city").get("name"),
category=data.get("category_type"), category=data.get("category_type"),

View File

@@ -19,7 +19,7 @@ class Plan:
#: Plan title #: Plan title
title = attr.ib() title = attr.ib()
#: ID of the plan #: ID of the plan
uid = attr.ib(None) id = attr.ib(None)
#: Plan location name #: Plan location name
location = attr.ib(None, converter=lambda x: x or "") location = attr.ib(None, converter=lambda x: x or "")
#: Plan location ID #: Plan location ID
@@ -59,7 +59,7 @@ class Plan:
@classmethod @classmethod
def _from_pull(cls, data): def _from_pull(cls, data):
return cls( return cls(
uid=data.get("event_id"), id=data.get("event_id"),
time=_util.seconds_to_datetime(int(data.get("event_time"))), time=_util.seconds_to_datetime(int(data.get("event_time"))),
title=data.get("event_title"), title=data.get("event_title"),
location=data.get("event_location_name"), location=data.get("event_location_name"),
@@ -74,7 +74,7 @@ class Plan:
@classmethod @classmethod
def _from_fetch(cls, data): def _from_fetch(cls, data):
return cls( return cls(
uid=data.get("oid"), id=data.get("oid"),
time=_util.seconds_to_datetime(data.get("event_time")), time=_util.seconds_to_datetime(data.get("event_time")),
title=data.get("title"), title=data.get("title"),
location=data.get("location_name"), location=data.get("location_name"),
@@ -86,7 +86,7 @@ class Plan:
@classmethod @classmethod
def _from_graphql(cls, data): def _from_graphql(cls, data):
return cls( return cls(
uid=data.get("id"), id=data.get("id"),
time=_util.seconds_to_datetime(data.get("time")), time=_util.seconds_to_datetime(data.get("time")),
title=data.get("event_title"), title=data.get("event_title"),
location=data.get("location_name"), location=data.get("location_name"),

View File

@@ -13,12 +13,12 @@ class Poll:
#: Options count #: Options count
options_count = attr.ib(None) options_count = attr.ib(None)
#: ID of the poll #: ID of the poll
uid = attr.ib(None) id = attr.ib(None)
@classmethod @classmethod
def _from_graphql(cls, data): def _from_graphql(cls, data):
return cls( return cls(
uid=int(data["id"]), id=int(data["id"]),
title=data.get("title") if data.get("title") else data.get("text"), title=data.get("title") if data.get("title") else data.get("text"),
options=[PollOption._from_graphql(m) for m in data.get("options")], options=[PollOption._from_graphql(m) for m in data.get("options")],
options_count=data.get("total_count"), options_count=data.get("total_count"),
@@ -38,7 +38,7 @@ class PollOption:
#: Votes count #: Votes count
votes_count = attr.ib(None) votes_count = attr.ib(None)
#: ID of the poll option #: ID of the poll option
uid = attr.ib(None) id = attr.ib(None)
@classmethod @classmethod
def _from_graphql(cls, data): def _from_graphql(cls, data):
@@ -49,7 +49,7 @@ class PollOption:
else: else:
vote = data["viewer_has_voted"] == "true" vote = data["viewer_has_voted"] == "true"
return cls( return cls(
uid=int(data["id"]), id=int(data["id"]),
text=data.get("text"), text=data.get("text"),
vote=vote, vote=vote,
voters=( voters=(

View File

@@ -35,7 +35,7 @@ class Sticker(Attachment):
return None return None
return cls( return cls(
uid=data["id"], id=data["id"],
pack=data["pack"].get("id") if data.get("pack") else None, pack=data["pack"].get("id") if data.get("pack") else None,
is_animated=bool(data.get("sprite_image")), is_animated=bool(data.get("sprite_image")),
medium_sprite_image=data["sprite_image"].get("uri") medium_sprite_image=data["sprite_image"].get("uri")

View File

@@ -71,8 +71,8 @@ class ThreadColor(Enum):
class Thread: class Thread:
"""Represents a Facebook thread.""" """Represents a Facebook thread."""
#: The unique identifier of the thread. Can be used a ``thread_id``. See :ref:`intro_threads` for more info #: The unique identifier of the thread.
uid = attr.ib(converter=str) id = attr.ib(converter=str)
#: Specifies the type of thread. Can be used a ``thread_type``. See :ref:`intro_threads` for more info #: Specifies the type of thread. Can be used a ``thread_type``. See :ref:`intro_threads` for more info
type = None type = None
@@ -95,15 +95,15 @@ class Thread:
for k in info.get("participant_customizations", []): for k in info.get("participant_customizations", []):
rtn["nicknames"][k["participant_id"]] = k.get("nickname") rtn["nicknames"][k["participant_id"]] = k.get("nickname")
elif info.get("participant_customizations"): elif info.get("participant_customizations"):
uid = data.get("thread_key", {}).get("other_user_id") or data.get("id") user_id = data.get("thread_key", {}).get("other_user_id") or data.get("id")
pc = info["participant_customizations"] pc = info["participant_customizations"]
if len(pc) > 0: if len(pc) > 0:
if pc[0].get("participant_id") == uid: if pc[0].get("participant_id") == user_id:
rtn["nickname"] = pc[0].get("nickname") rtn["nickname"] = pc[0].get("nickname")
else: else:
rtn["own_nickname"] = pc[0].get("nickname") rtn["own_nickname"] = pc[0].get("nickname")
if len(pc) > 1: if len(pc) > 1:
if pc[1].get("participant_id") == uid: if pc[1].get("participant_id") == user_id:
rtn["nickname"] = pc[1].get("nickname") rtn["nickname"] = pc[1].get("nickname")
else: else:
rtn["own_nickname"] = pc[1].get("nickname") rtn["own_nickname"] = pc[1].get("nickname")
@@ -111,4 +111,4 @@ class Thread:
def _to_send_data(self): def _to_send_data(self):
# TODO: Only implement this in subclasses # TODO: Only implement this in subclasses
return {"other_user_fbid": self.uid} return {"other_user_fbid": self.id}

View File

@@ -88,7 +88,7 @@ class User(Thread):
plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0]) plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0])
return cls( return cls(
uid=data["id"], id=data["id"],
url=data.get("url"), url=data.get("url"),
first_name=data.get("first_name"), first_name=data.get("first_name"),
last_name=data.get("last_name"), last_name=data.get("last_name"),
@@ -133,7 +133,7 @@ class User(Thread):
plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0]) plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0])
return cls( return cls(
uid=user["id"], id=user["id"],
url=user.get("url"), url=user.get("url"),
name=user.get("name"), name=user.get("name"),
first_name=first_name, first_name=first_name,
@@ -154,7 +154,7 @@ class User(Thread):
@classmethod @classmethod
def _from_all_fetch(cls, data): def _from_all_fetch(cls, data):
return cls( return cls(
uid=data["id"], id=data["id"],
first_name=data.get("firstName"), first_name=data.get("firstName"),
url=data.get("uri"), url=data.get("uri"),
photo=Image(url=data.get("thumbSrc")), photo=Image(url=data.get("thumbSrc")),

View File

@@ -8,7 +8,7 @@ from fbchat import ThreadType, Message, Mention
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def user(client2): def user(client2):
return {"id": client2.uid, "type": ThreadType.USER} return {"id": client2.id, "type": ThreadType.USER}
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
@@ -88,7 +88,7 @@ def catch_event(client2):
try: try:
# Make the client send a messages to itself, so the blocking pull request will return # Make the client send a messages to itself, so the blocking pull request will return
# This is probably not safe, since the client is making two requests simultaneously # This is probably not safe, since the client is making two requests simultaneously
client2.send(Message(text=random_hex()), client2.uid) client2.send(Message(text=random_hex()), client2.id)
finally: finally:
t.join() t.join()
@@ -97,8 +97,8 @@ def catch_event(client2):
def compare(client, thread): def compare(client, thread):
def inner(caught_event, **kwargs): def inner(caught_event, **kwargs):
d = { d = {
"author_id": client.uid, "author_id": client.id,
"thread_id": client.uid "thread_id": client.id
if thread["type"] == ThreadType.USER if thread["type"] == ThreadType.USER
else thread["id"], else thread["id"],
"thread_type": thread["type"], "thread_type": thread["type"],
@@ -114,10 +114,10 @@ def message_with_mentions(request, client, client2, group):
text = "Hi there [" text = "Hi there ["
mentions = [] mentions = []
if "me" in request.param: if "me" in request.param:
mentions.append(Mention(thread_id=client.uid, offset=len(text), length=2)) mentions.append(Mention(thread_id=client.id, offset=len(text), length=2))
text += "me, " text += "me, "
if "other" in request.param: if "other" in request.param:
mentions.append(Mention(thread_id=client2.uid, offset=len(text), length=5)) mentions.append(Mention(thread_id=client2.id, offset=len(text), length=5))
text += "other, " text += "other, "
# Unused, because Facebook don't properly support sending mentions with groups as targets # Unused, because Facebook don't properly support sending mentions with groups as targets
if "group" in request.param: if "group" in request.param:

View File

@@ -26,7 +26,7 @@ def test_parse_unsent_message():
"genie_attachment": {"genie_message": None}, "genie_attachment": {"genie_message": None},
} }
assert UnsentMessage( assert UnsentMessage(
uid="ee.mid.$xyz" id="ee.mid.$xyz"
) == fbchat._message.graphql_to_extensible_attachment(data) ) == fbchat._message.graphql_to_extensible_attachment(data)
@@ -75,7 +75,7 @@ def test_share_from_graphql_link():
image=None, image=None,
original_image_url=None, original_image_url=None,
attachments=[], attachments=[],
uid="ee.mid.$xyz", id="ee.mid.$xyz",
) == ShareAttachment._from_graphql(data) ) == ShareAttachment._from_graphql(data)
@@ -128,7 +128,7 @@ def test_share_from_graphql_link_with_image():
), ),
original_image_url="https://www.facebook.com/rsrc.php/v3/x.png", original_image_url="https://www.facebook.com/rsrc.php/v3/x.png",
attachments=[], attachments=[],
uid="deadbeef123", id="deadbeef123",
) == ShareAttachment._from_graphql(data) ) == ShareAttachment._from_graphql(data)
@@ -194,7 +194,7 @@ def test_share_from_graphql_video():
), ),
original_image_url="https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg", original_image_url="https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg",
attachments=[], attachments=[],
uid="ee.mid.$gAAT4Sw1WSGhzQ9uRWVtEpZHZ8ZPV", id="ee.mid.$gAAT4Sw1WSGhzQ9uRWVtEpZHZ8ZPV",
) == ShareAttachment._from_graphql(data) ) == ShareAttachment._from_graphql(data)
@@ -315,7 +315,7 @@ def test_share_with_image_subattachment():
), ),
original_image_url="https://scontent-arn2-1.xx.fbcdn.net/v/t1.0-9/1.jpg", original_image_url="https://scontent-arn2-1.xx.fbcdn.net/v/t1.0-9/1.jpg",
attachments=[None], attachments=[None],
uid="deadbeef123", id="deadbeef123",
) == ShareAttachment._from_graphql(data) ) == ShareAttachment._from_graphql(data)
@@ -444,7 +444,7 @@ def test_share_with_video_subattachment():
original_image_url="https://scontent-arn2-1.xx.fbcdn.net/v/t15.5256-10/p180x540/1.jpg", original_image_url="https://scontent-arn2-1.xx.fbcdn.net/v/t15.5256-10/p180x540/1.jpg",
attachments=[ attachments=[
fbchat.VideoAttachment( fbchat.VideoAttachment(
uid="2222", id="2222",
duration=datetime.timedelta(seconds=24, microseconds=469000), duration=datetime.timedelta(seconds=24, microseconds=469000),
preview_url="https://video-arn2-1.xx.fbcdn.net/v/t42.9040-2/vid.mp4", preview_url="https://video-arn2-1.xx.fbcdn.net/v/t42.9040-2/vid.mp4",
previews={ previews={
@@ -456,5 +456,5 @@ def test_share_with_video_subattachment():
}, },
) )
], ],
uid="deadbeef123", id="deadbeef123",
) == ShareAttachment._from_graphql(data) ) == ShareAttachment._from_graphql(data)

View File

@@ -28,7 +28,7 @@ def test_fetch_message_emoji(client, emoji, emoji_size):
(message,) = client.fetch_thread_messages(limit=1) (message,) = client.fetch_thread_messages(limit=1)
assert subset( assert subset(
vars(message), uid=mid, author=client.uid, text=emoji, emoji_size=emoji_size vars(message), id=mid, author=client.id, text=emoji, emoji_size=emoji_size
) )
@@ -38,7 +38,7 @@ def test_fetch_message_info_emoji(client, thread, emoji, emoji_size):
message = client.fetch_message_info(mid, thread_id=thread["id"]) message = client.fetch_message_info(mid, thread_id=thread["id"])
assert subset( assert subset(
vars(message), uid=mid, author=client.uid, text=emoji, emoji_size=emoji_size vars(message), id=mid, author=client.id, text=emoji, emoji_size=emoji_size
) )
@@ -47,7 +47,7 @@ def test_fetch_message_mentions(client, thread, message_with_mentions):
(message,) = client.fetch_thread_messages(limit=1) (message,) = client.fetch_thread_messages(limit=1)
assert subset( assert subset(
vars(message), uid=mid, author=client.uid, text=message_with_mentions.text vars(message), id=mid, author=client.id, text=message_with_mentions.text
) )
# The mentions are not ordered by offset # The mentions are not ordered by offset
for m in message.mentions: for m in message.mentions:
@@ -59,7 +59,7 @@ def test_fetch_message_info_mentions(client, thread, message_with_mentions):
message = client.fetch_message_info(mid, thread_id=thread["id"]) message = client.fetch_message_info(mid, thread_id=thread["id"])
assert subset( assert subset(
vars(message), uid=mid, author=client.uid, text=message_with_mentions.text vars(message), id=mid, author=client.id, text=message_with_mentions.text
) )
# The mentions are not ordered by offset # The mentions are not ordered by offset
for m in message.mentions: for m in message.mentions:
@@ -71,8 +71,8 @@ def test_fetch_message_sticker(client, sticker):
mid = client.send(Message(sticker=sticker)) mid = client.send(Message(sticker=sticker))
(message,) = client.fetch_thread_messages(limit=1) (message,) = client.fetch_thread_messages(limit=1)
assert subset(vars(message), uid=mid, author=client.uid) assert subset(vars(message), id=mid, author=client.id)
assert subset(vars(message.sticker), uid=sticker.uid) assert subset(vars(message.sticker), id=sticker.id)
@pytest.mark.parametrize("sticker", STICKER_LIST) @pytest.mark.parametrize("sticker", STICKER_LIST)
@@ -80,8 +80,8 @@ def test_fetch_message_info_sticker(client, thread, sticker):
mid = client.send(Message(sticker=sticker)) mid = client.send(Message(sticker=sticker))
message = client.fetch_message_info(mid, thread_id=thread["id"]) message = client.fetch_message_info(mid, thread_id=thread["id"])
assert subset(vars(message), uid=mid, author=client.uid) assert subset(vars(message), id=mid, author=client.id)
assert subset(vars(message.sticker), uid=sticker.uid) assert subset(vars(message.sticker), id=sticker.id)
def test_fetch_info(client1, group): def test_fetch_info(client1, group):
@@ -98,4 +98,4 @@ def test_fetch_image_url(client):
) )
(message,) = client.fetch_thread_messages(limit=1) (message,) = client.fetch_thread_messages(limit=1)
assert client.fetch_image_url(message.attachments[0].uid) assert client.fetch_image_url(message.attachments[0].id)

View File

@@ -30,7 +30,7 @@ def test_imageattachment_from_list():
"photo_encodings": [], "photo_encodings": [],
} }
assert ImageAttachment( assert ImageAttachment(
uid="1234", id="1234",
width=2833, width=2833,
height=1367, height=1367,
previews={ previews={
@@ -70,7 +70,7 @@ def test_videoattachment_from_list():
"original_dimensions": {"x": 640, "y": 368}, "original_dimensions": {"x": 640, "y": 368},
} }
assert VideoAttachment( assert VideoAttachment(
uid="1234", id="1234",
width=640, width=640,
height=368, height=368,
previews={ previews={
@@ -97,7 +97,7 @@ def test_graphql_to_attachment_empty():
def test_graphql_to_attachment_simple(): def test_graphql_to_attachment_simple():
data = {"__typename": "Unknown", "legacy_attachment_id": "1234"} data = {"__typename": "Unknown", "legacy_attachment_id": "1234"}
assert fbchat.Attachment(uid="1234") == graphql_to_attachment(data) assert fbchat.Attachment(id="1234") == graphql_to_attachment(data)
def test_graphql_to_attachment_file(): def test_graphql_to_attachment_file():
@@ -114,7 +114,7 @@ def test_graphql_to_attachment_file():
"url_skipshim": True, "url_skipshim": True,
} }
assert FileAttachment( assert FileAttachment(
uid="1234", id="1234",
url="https://l.facebook.com/l.php?u=https%3A%2F%2Fcdn.fbsbx.com%2Fv%2Ffile.txt&h=AT1...&s=1", url="https://l.facebook.com/l.php?u=https%3A%2F%2Fcdn.fbsbx.com%2Fv%2Ffile.txt&h=AT1...&s=1",
size=None, size=None,
name="file.txt", name="file.txt",
@@ -136,7 +136,7 @@ def test_graphql_to_attachment_audio():
"url_skipshim": True, "url_skipshim": True,
} }
assert AudioAttachment( assert AudioAttachment(
uid=None, id=None,
filename="audio.mp3", filename="audio.mp3",
url="https://cdn.fbsbx.com/v/audio.mp3?dl=1", url="https://cdn.fbsbx.com/v/audio.mp3?dl=1",
duration=datetime.timedelta(seconds=27, microseconds=745000), duration=datetime.timedelta(seconds=27, microseconds=745000),
@@ -169,7 +169,7 @@ def test_graphql_to_attachment_image1():
"blurred_image_uri": None, "blurred_image_uri": None,
} }
assert ImageAttachment( assert ImageAttachment(
uid="1234", id="1234",
original_extension="png", original_extension="png",
width=None, width=None,
height=None, height=None,
@@ -205,7 +205,7 @@ def test_graphql_to_attachment_image2():
"original_dimensions": {"x": 128, "y": 128}, "original_dimensions": {"x": 128, "y": 128},
} }
assert ImageAttachment( assert ImageAttachment(
uid="1234", id="1234",
original_extension="gif", original_extension="gif",
width=None, width=None,
height=None, height=None,
@@ -244,7 +244,7 @@ def test_graphql_to_attachment_video():
}, },
} }
assert VideoAttachment( assert VideoAttachment(
uid="1234", id="1234",
width=None, width=None,
height=None, height=None,
duration=datetime.timedelta(seconds=6), duration=datetime.timedelta(seconds=6),
@@ -347,7 +347,7 @@ def test_graphql_to_subattachment_video():
}, },
} }
assert VideoAttachment( assert VideoAttachment(
uid="1234", id="1234",
duration=datetime.timedelta(seconds=24, microseconds=469000), duration=datetime.timedelta(seconds=24, microseconds=469000),
preview_url="https://video-arn2-1.xx.fbcdn.net/v/t42.9040-2/vid.mp4", preview_url="https://video-arn2-1.xx.fbcdn.net/v/t42.9040-2/vid.mp4",
previews={ previews={

View File

@@ -26,7 +26,7 @@ def test_group_from_graphql():
"event_reminders": {"nodes": []}, "event_reminders": {"nodes": []},
} }
assert Group( assert Group(
uid="11223344", id="11223344",
photo=None, photo=None,
name="Group ABC", name="Group ABC",
last_active=None, last_active=None,

View File

@@ -35,7 +35,7 @@ def test_location_attachment_from_graphql():
"subattachments": [], "subattachments": [],
} }
assert LocationAttachment( assert LocationAttachment(
uid=400828513928715, id=400828513928715,
latitude=55.4, latitude=55.4,
longitude=12.4322, longitude=12.4322,
image=fbchat.Image( image=fbchat.Image(
@@ -80,7 +80,7 @@ def test_live_location_from_graphql_expired():
"subattachments": [], "subattachments": [],
} }
assert LiveLocationAttachment( assert LiveLocationAttachment(
uid=2254535444791641, id=2254535444791641,
name="Location-sharing ended", name="Location-sharing ended",
expires_at=datetime.datetime( expires_at=datetime.datetime(
2019, 1, 4, 18, 25, 45, tzinfo=datetime.timezone.utc 2019, 1, 4, 18, 25, 45, tzinfo=datetime.timezone.utc

View File

@@ -99,7 +99,7 @@ def test_message_to_send_data_mentions():
def test_message_to_send_data_sticker(): def test_message_to_send_data_sticker():
msg = Message(sticker=fbchat.Sticker(uid="123")) msg = Message(sticker=fbchat.Sticker(id="123"))
assert { assert {
"action_type": "ma-type:user-generated-message", "action_type": "ma-type:user-generated-message",
"sticker_id": "123", "sticker_id": "123",

View File

@@ -18,4 +18,4 @@ def test_delete_messages(client):
mid2 = client.send(Message(text=text2)) mid2 = client.send(Message(text=text2))
client.delete_messages(mid2) client.delete_messages(mid2)
(message,) = client.fetch_thread_messages(limit=1) (message,) = client.fetch_thread_messages(limit=1)
assert subset(vars(message), uid=mid1, author=client.uid, text=text1) assert subset(vars(message), id=mid1, author=client.id, text=text1)

View File

@@ -12,7 +12,7 @@ def test_page_from_graphql():
"city": None, "city": None,
} }
assert Page( assert Page(
uid="123456", id="123456",
photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."),
name="Some school", name="Some school",
url="https://www.facebook.com/some-school/", url="https://www.facebook.com/some-school/",

View File

@@ -36,7 +36,7 @@ def test_plan_from_pull():
), ),
} }
assert Plan( assert Plan(
uid="1111", id="1111",
time=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc), time=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
title="abc", title="abc",
author_id="1234", author_id="1234",
@@ -93,7 +93,7 @@ def test_plan_from_fetch():
}, },
} }
assert Plan( assert Plan(
uid=1111, id=1111,
time=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc), time=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
title="abc", title="abc",
location="", location="",
@@ -139,7 +139,7 @@ def test_plan_from_graphql():
title="abc", title="abc",
location="", location="",
location_id="", location_id="",
uid="1111", id="1111",
author_id="1234", author_id="1234",
guests={ guests={
"1234": GuestStatus.INVITED, "1234": GuestStatus.INVITED,

View File

@@ -26,13 +26,13 @@ def plan_data(request, client, user, thread, catch_event, compare):
vars(x.res["plan"]), vars(x.res["plan"]),
time=request.param.time, time=request.param.time,
title=request.param.title, title=request.param.title,
author_id=client.uid, author_id=client.id,
going=[client.uid], going=[client.id],
declined=[], declined=[],
) )
plan_id = x.res["plan"] plan_id = x.res["plan"]
assert user["id"] in x.res["plan"].invited assert user["id"] in x.res["plan"].invited
request.param.uid = x.res["plan"].uid request.param.id = x.res["plan"].id
yield x.res, request.param yield x.res, request.param
with catch_event("on_plan_deleted") as x: with catch_event("on_plan_deleted") as x:
client.delete_plan(plan_id) client.delete_plan(plan_id)
@@ -46,9 +46,9 @@ def test_create_delete_plan(plan_data):
def test_fetch_plan_info(client, catch_event, plan_data): def test_fetch_plan_info(client, catch_event, plan_data):
event, plan = plan_data event, plan = plan_data
fetched_plan = client.fetch_plan_info(plan.uid) fetched_plan = client.fetch_plan_info(plan.id)
assert subset( assert subset(
vars(fetched_plan), time=plan.time, title=plan.title, author_id=int(client.uid) vars(fetched_plan), time=plan.time, title=plan.title, author_id=int(client.id)
) )
@@ -64,9 +64,9 @@ def test_change_plan_participation(
vars(x.res["plan"]), vars(x.res["plan"]),
time=plan.time, time=plan.time,
title=plan.title, title=plan.title,
author_id=client.uid, author_id=client.id,
going=[client.uid] if take_part else [], going=[client.id] if take_part else [],
declined=[client.uid] if not take_part else [], declined=[client.id] if not take_part else [],
) )
@@ -81,7 +81,7 @@ def test_edit_plan(client, thread, catch_event, compare, plan_data):
vars(x.res["plan"]), vars(x.res["plan"]),
time=new_plan.time, time=new_plan.time,
title=new_plan.title, title=new_plan.title,
author_id=client.uid, author_id=client.id,
) )
@@ -93,7 +93,7 @@ def test_on_plan_ended(client, thread, catch_event, compare):
x.wait(180) x.wait(180)
assert subset( assert subset(
x.res, x.res,
thread_id=client.uid if thread["type"] == ThreadType.USER else thread["id"], thread_id=client.id if thread["type"] == ThreadType.USER else thread["id"],
thread_type=thread["type"], thread_type=thread["type"],
) )

View File

@@ -10,7 +10,7 @@ def test_poll_option_from_graphql_unvoted():
"voters": [], "voters": [],
} }
assert PollOption( assert PollOption(
text="abc", vote=False, voters=[], votes_count=0, uid=123456789 text="abc", vote=False, voters=[], votes_count=0, id=123456789
) == PollOption._from_graphql(data) ) == PollOption._from_graphql(data)
@@ -23,7 +23,7 @@ def test_poll_option_from_graphql_voted():
"voters": ["1234", "2345"], "voters": ["1234", "2345"],
} }
assert PollOption( assert PollOption(
text="abc", vote=True, voters=["1234", "2345"], votes_count=2, uid=123456789 text="abc", vote=True, voters=["1234", "2345"], votes_count=2, id=123456789
) == PollOption._from_graphql(data) ) == PollOption._from_graphql(data)
@@ -39,7 +39,7 @@ def test_poll_option_from_graphql_alternate_format():
}, },
} }
assert PollOption( assert PollOption(
text="abc", vote=True, voters=["1234", "2345"], votes_count=2, uid=123456789 text="abc", vote=True, voters=["1234", "2345"], votes_count=2, id=123456789
) == PollOption._from_graphql(data) ) == PollOption._from_graphql(data)
@@ -76,12 +76,12 @@ def test_poll_from_graphql():
assert Poll( assert Poll(
title="Some poll", title="Some poll",
options=[ options=[
PollOption(text="Abc", vote=True, voters=["1234"], votes_count=1, uid=1111), PollOption(text="Abc", vote=True, voters=["1234"], votes_count=1, id=1111),
PollOption( PollOption(
text="Def", vote=False, voters=["2345", "3456"], votes_count=2, uid=2222 text="Def", vote=False, voters=["2345", "3456"], votes_count=2, id=2222
), ),
PollOption(text="Ghi", vote=False, voters=[], votes_count=0, uid=3333), PollOption(text="Ghi", vote=False, voters=[], votes_count=0, id=3333),
], ],
options_count=5, options_count=5,
uid=123456789, id=123456789,
) == Poll._from_graphql(data) ) == Poll._from_graphql(data)

View File

@@ -43,7 +43,7 @@ pytestmark = pytest.mark.online
def poll_data(request, client1, group, catch_event): def poll_data(request, client1, group, catch_event):
with catch_event("on_poll_created") as x: with catch_event("on_poll_created") as x:
client1.create_poll(request.param, thread_id=group["id"]) client1.create_poll(request.param, thread_id=group["id"])
options = client1.fetch_poll_options(x.res["poll"].uid) options = client1.fetch_poll_options(x.res["poll"].id)
return x.res, request.param, options return x.res, request.param, options
@@ -51,7 +51,7 @@ def test_create_poll(client1, group, catch_event, poll_data):
event, poll, _ = poll_data event, poll, _ = poll_data
assert subset( assert subset(
event, event,
author_id=client1.uid, author_id=client1.id,
thread_id=group["id"], thread_id=group["id"],
thread_type=ThreadType.GROUP, thread_type=ThreadType.GROUP,
) )
@@ -62,7 +62,7 @@ def test_create_poll(client1, group, catch_event, poll_data):
"poll" "poll"
].options: # The recieved options may not be the full list ].options: # The recieved options may not be the full list
(old_option,) = list(filter(lambda o: o.text == recv_option.text, poll.options)) (old_option,) = list(filter(lambda o: o.text == recv_option.text, poll.options))
voters = [client1.uid] if old_option.vote else [] voters = [client1.id] if old_option.vote else []
assert subset( assert subset(
vars(recv_option), voters=voters, votes_count=len(voters), vote=False vars(recv_option), voters=voters, votes_count=len(voters), vote=False
) )
@@ -78,19 +78,19 @@ def test_fetch_poll_options(client1, group, catch_event, poll_data):
@pytest.mark.trylast @pytest.mark.trylast
def test_update_poll_vote(client1, group, catch_event, poll_data): def test_update_poll_vote(client1, group, catch_event, poll_data):
event, poll, options = poll_data event, poll, options = poll_data
new_vote_ids = [o.uid for o in options[0 : len(options) : 2] if not o.vote] new_vote_ids = [o.id for o in options[0 : len(options) : 2] if not o.vote]
re_vote_ids = [o.uid for o in options[0 : len(options) : 2] if o.vote] re_vote_ids = [o.id for o in options[0 : len(options) : 2] if o.vote]
new_options = [random_hex(), random_hex()] new_options = [random_hex(), random_hex()]
with catch_event("on_poll_voted") as x: with catch_event("on_poll_voted") as x:
client1.update_poll_vote( client1.update_poll_vote(
event["poll"].uid, event["poll"].id,
option_ids=new_vote_ids + re_vote_ids, option_ids=new_vote_ids + re_vote_ids,
new_options=new_options, new_options=new_options,
) )
assert subset( assert subset(
x.res, x.res,
author_id=client1.uid, author_id=client1.id,
thread_id=group["id"], thread_id=group["id"],
thread_type=ThreadType.GROUP, thread_type=ThreadType.GROUP,
) )
@@ -101,5 +101,5 @@ def test_update_poll_vote(client1, group, catch_event, poll_data):
assert o in x.res["added_options"] assert o in x.res["added_options"]
assert len(x.res["added_options"]) == len(new_vote_ids) + len(new_options) assert len(x.res["added_options"]) == len(new_vote_ids) + len(new_options)
assert set(x.res["removed_options"]) == set( assert set(x.res["removed_options"]) == set(
o.uid for o in options if o.vote and o.uid not in re_vote_ids o.id for o in options if o.vote and o.id not in re_vote_ids
) )

View File

@@ -10,7 +10,7 @@ def test_search_for(client1):
u = users[0] u = users[0]
assert u.uid == "4" assert u.id == "4"
assert u.type == ThreadType.USER assert u.type == ThreadType.USER
assert u.photo[:4] == "http" assert u.photo[:4] == "http"
assert u.url[:4] == "http" assert u.url[:4] == "http"

View File

@@ -13,7 +13,7 @@ def test_send_text(client, catch_event, compare, text):
mid = client.send(Message(text=text)) mid = client.send(Message(text=text))
assert compare(x, mid=mid, message=text) assert compare(x, mid=mid, message=text)
assert subset(vars(x.res["message_object"]), uid=mid, author=client.uid, text=text) assert subset(vars(x.res["message_object"]), id=mid, author=client.id, text=text)
@pytest.mark.parametrize("emoji, emoji_size", EMOJI_LIST) @pytest.mark.parametrize("emoji, emoji_size", EMOJI_LIST)
@@ -24,8 +24,8 @@ def test_send_emoji(client, catch_event, compare, emoji, emoji_size):
assert compare(x, mid=mid, message=emoji) assert compare(x, mid=mid, message=emoji)
assert subset( assert subset(
vars(x.res["message_object"]), vars(x.res["message_object"]),
uid=mid, id=mid,
author=client.uid, author=client.id,
text=emoji, text=emoji,
emoji_size=emoji_size, emoji_size=emoji_size,
) )
@@ -38,8 +38,8 @@ def test_send_mentions(client, catch_event, compare, message_with_mentions):
assert compare(x, mid=mid, message=message_with_mentions.text) assert compare(x, mid=mid, message=message_with_mentions.text)
assert subset( assert subset(
vars(x.res["message_object"]), vars(x.res["message_object"]),
uid=mid, id=mid,
author=client.uid, author=client.id,
text=message_with_mentions.text, text=message_with_mentions.text,
) )
# The mentions are not ordered by offset # The mentions are not ordered by offset
@@ -53,8 +53,8 @@ def test_send_sticker(client, catch_event, compare, sticker):
mid = client.send(Message(sticker=sticker)) mid = client.send(Message(sticker=sticker))
assert compare(x, mid=mid) assert compare(x, mid=mid)
assert subset(vars(x.res["message_object"]), uid=mid, author=client.uid) assert subset(vars(x.res["message_object"]), id=mid, author=client.id)
assert subset(vars(x.res["message_object"].sticker), uid=sticker.uid) assert subset(vars(x.res["message_object"].sticker), id=sticker.id)
# Kept for backwards compatibility # Kept for backwards compatibility
@@ -74,7 +74,7 @@ def test_send_images(client, catch_event, compare, method_name, url):
mid = getattr(client, method_name)(url, Message(text)) mid = getattr(client, method_name)(url, Message(text))
assert compare(x, mid=mid, message=text) assert compare(x, mid=mid, message=text)
assert subset(vars(x.res["message_object"]), uid=mid, author=client.uid, text=text) assert subset(vars(x.res["message_object"]), id=mid, author=client.id, text=text)
assert x.res["message_object"].attachments[0] assert x.res["message_object"].attachments[0]
@@ -96,7 +96,7 @@ def test_send_local_files(client, catch_event, compare):
) )
assert compare(x, mid=mid, message=text) assert compare(x, mid=mid, message=text)
assert subset(vars(x.res["message_object"]), uid=mid, author=client.uid, text=text) assert subset(vars(x.res["message_object"]), id=mid, author=client.id, text=text)
assert len(x.res["message_object"].attachments) == len(files) assert len(x.res["message_object"].attachments) == len(files)
@@ -114,7 +114,7 @@ def test_send_remote_files(client, catch_event, compare):
) )
assert compare(x, mid=mid, message=text) assert compare(x, mid=mid, message=text)
assert subset(vars(x.res["message_object"]), uid=mid, author=client.uid, text=text) assert subset(vars(x.res["message_object"]), id=mid, author=client.id, text=text)
assert len(x.res["message_object"].attachments) == len(files) assert len(x.res["message_object"].attachments) == len(files)

View File

@@ -8,12 +8,12 @@ def test_from_graphql_none():
def test_from_graphql_minimal(): def test_from_graphql_minimal():
assert Sticker(uid=1) == Sticker._from_graphql({"id": 1}) assert Sticker(id=1) == Sticker._from_graphql({"id": 1})
def test_from_graphql_normal(): def test_from_graphql_normal():
assert Sticker( assert Sticker(
uid="369239383222810", id="369239383222810",
pack="227877430692340", pack="227877430692340",
is_animated=False, is_animated=False,
frames_per_row=1, frames_per_row=1,
@@ -47,7 +47,7 @@ def test_from_graphql_normal():
def test_from_graphql_animated(): def test_from_graphql_animated():
assert Sticker( assert Sticker(
uid="144885035685763", id="144885035685763",
pack="350357561732812", pack="350357561732812",
is_animated=True, is_animated=True,
medium_sprite_image="https://scontent-arn2-1.xx.fbcdn.net/v/redacted2.png", medium_sprite_image="https://scontent-arn2-1.xx.fbcdn.net/v/redacted2.png",

View File

@@ -11,15 +11,15 @@ def test_remove_from_and_add_to_group(client1, client2, group, catch_event):
# Test both methods, while ensuring that the user gets added to the group # Test both methods, while ensuring that the user gets added to the group
try: try:
with catch_event("on_person_removed") as x: with catch_event("on_person_removed") as x:
client1.remove_user_from_group(client2.uid, group["id"]) client1.remove_user_from_group(client2.id, group["id"])
assert subset( assert subset(
x.res, removed_id=client2.uid, author_id=client1.uid, thread_id=group["id"] x.res, removed_id=client2.id, author_id=client1.id, thread_id=group["id"]
) )
finally: finally:
with catch_event("on_people_added") as x: with catch_event("on_people_added") as x:
client1.add_users_to_group(client2.uid, group["id"]) client1.add_users_to_group(client2.id, group["id"])
assert subset( assert subset(
x.res, added_ids=[client2.uid], author_id=client1.uid, thread_id=group["id"] x.res, added_ids=[client2.id], author_id=client1.id, thread_id=group["id"]
) )
@@ -27,15 +27,15 @@ def test_remove_from_and_add_admins_to_group(client1, client2, group, catch_even
# Test both methods, while ensuring that the user gets added as group admin # Test both methods, while ensuring that the user gets added as group admin
try: try:
with catch_event("on_admin_removed") as x: with catch_event("on_admin_removed") as x:
client1.remove_group_admins(client2.uid, group["id"]) client1.remove_group_admins(client2.id, group["id"])
assert subset( assert subset(
x.res, removed_id=client2.uid, author_id=client1.uid, thread_id=group["id"] x.res, removed_id=client2.id, author_id=client1.id, thread_id=group["id"]
) )
finally: finally:
with catch_event("on_admin_added") as x: with catch_event("on_admin_added") as x:
client1.add_group_admins(client2.uid, group["id"]) client1.add_group_admins(client2.id, group["id"])
assert subset( assert subset(
x.res, added_id=client2.uid, author_id=client1.uid, thread_id=group["id"] x.res, added_id=client2.id, author_id=client1.id, thread_id=group["id"]
) )
@@ -45,7 +45,7 @@ def test_change_title(client1, group, catch_event):
client1.change_thread_title(title, group["id"], thread_type=ThreadType.GROUP) client1.change_thread_title(title, group["id"], thread_type=ThreadType.GROUP)
assert subset( assert subset(
x.res, x.res,
author_id=client1.uid, author_id=client1.id,
new_title=title, new_title=title,
thread_id=group["id"], thread_id=group["id"],
thread_type=ThreadType.GROUP, thread_type=ThreadType.GROUP,
@@ -55,8 +55,8 @@ def test_change_title(client1, group, catch_event):
def test_change_nickname(client, client_all, catch_event, compare): def test_change_nickname(client, client_all, catch_event, compare):
nickname = random_hex() nickname = random_hex()
with catch_event("on_nickname_change") as x: with catch_event("on_nickname_change") as x:
client.change_nickname(nickname, client_all.uid) client.change_nickname(nickname, client_all.id)
assert compare(x, changed_for=client_all.uid, new_nickname=nickname) assert compare(x, changed_for=client_all.id, new_nickname=nickname)
@pytest.mark.parametrize( @pytest.mark.parametrize(
@@ -83,7 +83,7 @@ def test_change_image_local(client1, group, catch_event):
with catch_event("on_image_change") as x: with catch_event("on_image_change") as x:
image_id = client1.change_group_image_local(url, group["id"]) image_id = client1.change_group_image_local(url, group["id"])
assert subset( assert subset(
x.res, new_image=image_id, author_id=client1.uid, thread_id=group["id"] x.res, new_image=image_id, author_id=client1.id, thread_id=group["id"]
) )
@@ -93,7 +93,7 @@ def test_change_image_remote(client1, group, catch_event):
with catch_event("on_image_change") as x: with catch_event("on_image_change") as x:
image_id = client1.change_group_image_remote(url, group["id"]) image_id = client1.change_group_image_remote(url, group["id"])
assert subset( assert subset(
x.res, new_image=image_id, author_id=client1.uid, thread_id=group["id"] x.res, new_image=image_id, author_id=client1.id, thread_id=group["id"]
) )
@@ -130,7 +130,7 @@ def test_change_approval_mode(client1, group, catch_event, require_admin_approva
assert subset( assert subset(
x.res, x.res,
approval_mode=require_admin_approval, approval_mode=require_admin_approval,
author_id=client1.uid, author_id=client1.id,
thread_id=group["id"], thread_id=group["id"],
) )

View File

@@ -17,7 +17,7 @@ def test_user_from_graphql():
"viewer_affinity": 0.4560002, "viewer_affinity": 0.4560002,
} }
assert User( assert User(
uid="1234", id="1234",
photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."),
name="Abc Def Ghi", name="Abc Def Ghi",
url="https://www.facebook.com/profile.php?id=1234", url="https://www.facebook.com/profile.php?id=1234",
@@ -137,7 +137,7 @@ def test_user_from_thread_fetch():
"delivery_receipts": ..., "delivery_receipts": ...,
} }
assert User( assert User(
uid="1234", id="1234",
photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."),
name="Abc Def Ghi", name="Abc Def Ghi",
last_active=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc), last_active=datetime.datetime(2017, 7, 14, 2, 40, tzinfo=datetime.timezone.utc),
@@ -175,7 +175,7 @@ def test_user_from_all_fetch():
"is_blocked": False, "is_blocked": False,
} }
assert User( assert User(
uid="1234", id="1234",
photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."), photo=fbchat.Image(url="https://scontent-arn2-1.xx.fbcdn.net/v/..."),
name="Abc Def Ghi", name="Abc Def Ghi",
url="https://www.facebook.com/profile.php?id=1234", url="https://www.facebook.com/profile.php?id=1234",

View File

@@ -22,12 +22,12 @@ EMOJI_LIST = [
] ]
STICKER_LIST = [ STICKER_LIST = [
Sticker(uid="767334476626295"), Sticker(id="767334476626295"),
pytest.param( pytest.param(
Sticker(uid="0"), marks=[pytest.mark.xfail(raises=FBchatFacebookError)] Sticker(id="0"), marks=[pytest.mark.xfail(raises=FBchatFacebookError)]
), ),
pytest.param( pytest.param(
Sticker(uid=None), marks=[pytest.mark.xfail(raises=FBchatFacebookError)] Sticker(id=None), marks=[pytest.mark.xfail(raises=FBchatFacebookError)]
), ),
] ]