143 lines
4.1 KiB
Python
143 lines
4.1 KiB
Python
import attr
|
|
from ._core import Enum
|
|
|
|
|
|
class ThreadType(Enum):
|
|
"""Used to specify what type of Facebook thread is being used.
|
|
|
|
See :ref:`intro_threads` for more info.
|
|
"""
|
|
|
|
USER = 1
|
|
GROUP = 2
|
|
PAGE = 3
|
|
|
|
def _to_class(self):
|
|
"""Convert this enum value to the corresponding class."""
|
|
from . import _user, _group, _page
|
|
|
|
return {
|
|
ThreadType.USER: _user.User,
|
|
ThreadType.GROUP: _group.Group,
|
|
ThreadType.PAGE: _page.Page,
|
|
}[self]
|
|
|
|
|
|
class ThreadLocation(Enum):
|
|
"""Used to specify where a thread is located (inbox, pending, archived, other)."""
|
|
|
|
INBOX = "INBOX"
|
|
PENDING = "PENDING"
|
|
ARCHIVED = "ARCHIVED"
|
|
OTHER = "OTHER"
|
|
|
|
|
|
class ThreadColor(Enum):
|
|
"""Used to specify a thread colors."""
|
|
|
|
MESSENGER_BLUE = "#0084ff"
|
|
VIKING = "#44bec7"
|
|
GOLDEN_POPPY = "#ffc300"
|
|
RADICAL_RED = "#fa3c4c"
|
|
SHOCKING = "#d696bb"
|
|
PICTON_BLUE = "#6699cc"
|
|
FREE_SPEECH_GREEN = "#13cf13"
|
|
PUMPKIN = "#ff7e29"
|
|
LIGHT_CORAL = "#e68585"
|
|
MEDIUM_SLATE_BLUE = "#7646ff"
|
|
DEEP_SKY_BLUE = "#20cef5"
|
|
FERN = "#67b868"
|
|
CAMEO = "#d4a88c"
|
|
BRILLIANT_ROSE = "#ff5ca1"
|
|
BILOBA_FLOWER = "#a695c7"
|
|
TICKLE_ME_PINK = "#ff7ca8"
|
|
MALACHITE = "#1adb5b"
|
|
RUBY = "#f01d6a"
|
|
DARK_TANGERINE = "#ff9c19"
|
|
BRIGHT_TURQUOISE = "#0edcde"
|
|
|
|
@classmethod
|
|
def _from_graphql(cls, color):
|
|
if color is None:
|
|
return None
|
|
if not color:
|
|
return cls.MESSENGER_BLUE
|
|
color = color[2:] # Strip the alpha value
|
|
value = "#{}".format(color.lower())
|
|
return cls._extend_if_invalid(value)
|
|
|
|
|
|
@attr.s(cmp=False, init=False)
|
|
class Thread:
|
|
"""Represents a Facebook thread."""
|
|
|
|
#: The unique identifier of the thread. Can be used a ``thread_id``. See :ref:`intro_threads` for more info
|
|
uid = attr.ib(converter=str)
|
|
#: Specifies the type of thread. Can be used a ``thread_type``. See :ref:`intro_threads` for more info
|
|
type = attr.ib()
|
|
#: A URL to the thread's picture
|
|
photo = attr.ib(None)
|
|
#: The name of the thread
|
|
name = attr.ib(None)
|
|
#: Datetime when the thread was last active / when the last message was sent
|
|
last_active = attr.ib(None)
|
|
#: Number of messages in the thread
|
|
message_count = attr.ib(None)
|
|
#: Set :class:`Plan`
|
|
plan = attr.ib(None)
|
|
|
|
def __init__(
|
|
self,
|
|
_type,
|
|
uid,
|
|
photo=None,
|
|
name=None,
|
|
last_active=None,
|
|
message_count=None,
|
|
plan=None,
|
|
):
|
|
self.uid = str(uid)
|
|
self.type = _type
|
|
self.photo = photo
|
|
self.name = name
|
|
self.last_active = last_active
|
|
self.message_count = message_count
|
|
self.plan = plan
|
|
|
|
@staticmethod
|
|
def _parse_customization_info(data):
|
|
if data is None or data.get("customization_info") is None:
|
|
return {}
|
|
info = data["customization_info"]
|
|
|
|
rtn = {
|
|
"emoji": info.get("emoji"),
|
|
"color": ThreadColor._from_graphql(info.get("outgoing_bubble_color")),
|
|
}
|
|
if (
|
|
data.get("thread_type") == "GROUP"
|
|
or data.get("is_group_thread")
|
|
or data.get("thread_key", {}).get("thread_fbid")
|
|
):
|
|
rtn["nicknames"] = {}
|
|
for k in info.get("participant_customizations", []):
|
|
rtn["nicknames"][k["participant_id"]] = k.get("nickname")
|
|
elif info.get("participant_customizations"):
|
|
uid = data.get("thread_key", {}).get("other_user_id") or data.get("id")
|
|
pc = info["participant_customizations"]
|
|
if len(pc) > 0:
|
|
if pc[0].get("participant_id") == uid:
|
|
rtn["nickname"] = pc[0].get("nickname")
|
|
else:
|
|
rtn["own_nickname"] = pc[0].get("nickname")
|
|
if len(pc) > 1:
|
|
if pc[1].get("participant_id") == uid:
|
|
rtn["nickname"] = pc[1].get("nickname")
|
|
else:
|
|
rtn["own_nickname"] = pc[1].get("nickname")
|
|
return rtn
|
|
|
|
def _to_send_data(self):
|
|
# TODO: Only implement this in subclasses
|
|
return {"other_user_fbid": self.uid}
|