Move graphql_to_thread user parsing to User._from_thread_fetch

This commit is contained in:
Mads Marquart
2019-03-10 17:26:47 +01:00
parent 3a5185fcc8
commit 60ebbd87d8
2 changed files with 47 additions and 43 deletions

View File

@@ -150,49 +150,7 @@ def graphql_to_thread(thread):
if thread["thread_type"] == "GROUP": if thread["thread_type"] == "GROUP":
return graphql_to_group(thread) return graphql_to_group(thread)
elif thread["thread_type"] == "ONE_TO_ONE": elif thread["thread_type"] == "ONE_TO_ONE":
if thread.get("big_image_src") is None: return User._from_thread_fetch(thread)
thread["big_image_src"] = {}
c_info = User._parse_customization_info(thread)
participants = [
node["messaging_actor"] for node in thread["all_participants"]["nodes"]
]
user = next(
p for p in participants if p["id"] == thread["thread_key"]["other_user_id"]
)
last_message_timestamp = None
if "last_message" in thread:
last_message_timestamp = thread["last_message"]["nodes"][0][
"timestamp_precise"
]
first_name = user.get("short_name")
if first_name is None:
last_name = None
else:
last_name = user.get("name").split(first_name, 1).pop().strip()
plan = None
if thread.get("event_reminders") and thread["event_reminders"].get("nodes"):
plan = Plan._from_graphql(thread["event_reminders"]["nodes"][0])
return User(
user["id"],
url=user.get("url"),
name=user.get("name"),
first_name=first_name,
last_name=last_name,
is_friend=user.get("is_viewer_friend"),
gender=GENDERS.get(user.get("gender")),
affinity=user.get("affinity"),
nickname=c_info.get("nickname"),
color=c_info.get("color"),
emoji=c_info.get("emoji"),
own_nickname=c_info.get("own_nickname"),
photo=user["big_image_src"].get("uri"),
message_count=thread.get("messages_count"),
last_message_timestamp=last_message_timestamp,
plan=plan,
)
else: else:
raise FBchatException( raise FBchatException(
"Unknown thread type: {}, with data: {}".format( "Unknown thread type: {}, with data: {}".format(

View File

@@ -93,6 +93,52 @@ class User(Thread):
plan=plan, plan=plan,
) )
@classmethod
def _from_thread_fetch(cls, data):
if data.get("big_image_src") is None:
data["big_image_src"] = {}
c_info = cls._parse_customization_info(data)
participants = [
node["messaging_actor"] for node in data["all_participants"]["nodes"]
]
user = next(
p for p in participants if p["id"] == data["thread_key"]["other_user_id"]
)
last_message_timestamp = None
if "last_message" in data:
last_message_timestamp = data["last_message"]["nodes"][0][
"timestamp_precise"
]
first_name = user.get("short_name")
if first_name is None:
last_name = None
else:
last_name = user.get("name").split(first_name, 1).pop().strip()
plan = None
if data.get("event_reminders") and data["event_reminders"].get("nodes"):
plan = _plan.Plan._from_graphql(data["event_reminders"]["nodes"][0])
return cls(
user["id"],
url=user.get("url"),
name=user.get("name"),
first_name=first_name,
last_name=last_name,
is_friend=user.get("is_viewer_friend"),
gender=_util.GENDERS.get(user.get("gender")),
affinity=user.get("affinity"),
nickname=c_info.get("nickname"),
color=c_info.get("color"),
emoji=c_info.get("emoji"),
own_nickname=c_info.get("own_nickname"),
photo=user["big_image_src"].get("uri"),
message_count=data.get("messages_count"),
last_message_timestamp=last_message_timestamp,
plan=plan,
)
@attr.s(cmp=False) @attr.s(cmp=False)
class ActiveStatus(object): class ActiveStatus(object):