Move group-related functions to Group model

This commit is contained in:
Mads Marquart
2020-01-08 23:32:45 +01:00
parent a26554b4d6
commit 64f55a572e
2 changed files with 113 additions and 171 deletions

View File

@@ -1191,177 +1191,6 @@ class Client:
)
return thread_id
def add_users_to_group(self, user_ids, thread_id=None):
"""Add users to a group.
Args:
user_ids (list): One or more user IDs to add
thread_id: Group ID to add people to. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
data = Group(id=thread_id)._to_send_data()
data["action_type"] = "ma-type:log-message"
data["log_message_type"] = "log:subscribe"
user_ids = _util.require_list(user_ids)
for i, user_id in enumerate(user_ids):
if user_id == self._session.user_id:
raise ValueError(
"Error when adding users: Cannot add self to group thread"
)
else:
data[
"log_message_data[added_participants][{}]".format(i)
] = "fbid:{}".format(user_id)
return self._do_send_request(data)
def remove_user_from_group(self, user_id, thread_id=None):
"""Remove user from a group.
Args:
user_id: User ID to remove
thread_id: Group ID to remove people from. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
data = {"uid": user_id, "tid": thread_id}
j = self._payload_post("/chat/remove_participants/", data)
def _admin_status(self, admin_ids, admin, thread_id=None):
data = {"add": admin, "thread_fbid": thread_id}
admin_ids = _util.require_list(admin_ids)
for i, admin_id in enumerate(admin_ids):
data["admin_ids[{}]".format(i)] = str(admin_id)
j = self._payload_post("/messaging/save_admins/?dpr=1", data)
def add_group_admins(self, admin_ids, thread_id=None):
"""Set specified users as group admins.
Args:
admin_ids: One or more user IDs to set admin
thread_id: Group ID to remove people from. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
self._admin_status(admin_ids, True, thread_id)
def remove_group_admins(self, admin_ids, thread_id=None):
"""Remove admin status from specified users.
Args:
admin_ids: One or more user IDs to remove admin
thread_id: Group ID to remove people from. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
self._admin_status(admin_ids, False, thread_id)
def change_group_approval_mode(self, require_admin_approval, thread_id=None):
"""Change group's approval mode.
Args:
require_admin_approval: True or False
thread_id: Group ID to remove people from. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
data = {"set_mode": int(require_admin_approval), "thread_fbid": thread_id}
j = self._payload_post("/messaging/set_approval_mode/?dpr=1", data)
def _users_approval(self, user_ids, approve, thread_id=None):
user_ids = _util.require_list(user_ids)
data = {
"client_mutation_id": "0",
"actor_id": self._session.user_id,
"thread_fbid": thread_id,
"user_ids": user_ids,
"response": "ACCEPT" if approve else "DENY",
"surface": "ADMIN_MODEL_APPROVAL_CENTER",
}
(j,) = self.graphql_requests(
_graphql.from_doc_id("1574519202665847", {"data": data})
)
def accept_users_to_group(self, user_ids, thread_id=None):
"""Accept users to the group from the group's approval.
Args:
user_ids: One or more user IDs to accept
thread_id: Group ID to accept users to. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
self._users_approval(user_ids, True, thread_id)
def deny_users_from_group(self, user_ids, thread_id=None):
"""Deny users from joining the group.
Args:
user_ids: One or more user IDs to deny
thread_id: Group ID to deny users from. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
self._users_approval(user_ids, False, thread_id)
def _change_group_image(self, image_id, thread_id=None):
"""Change a thread image from an image id.
Args:
image_id: ID of uploaded image
thread_id: User/Group ID to change image. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
data = {"thread_image_id": image_id, "thread_id": thread_id}
j = self._payload_post("/messaging/set_thread_image/?dpr=1", data)
return image_id
def change_group_image_remote(self, image_url, thread_id=None):
"""Change a thread image from a URL.
Args:
image_url: URL of an image to upload and change
thread_id: User/Group ID to change image. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
((image_id, mimetype),) = self._upload(_util.get_files_from_urls([image_url]))
return self._change_group_image(image_id, thread_id)
def change_group_image_local(self, image_path, thread_id=None):
"""Change a thread image from a local path.
Args:
image_path: Path of an image to upload and change
thread_id: User/Group ID to change image. See :ref:`intro_threads`
Raises:
FBchatException: If request failed
"""
with _util.get_files_from_paths([image_path]) as files:
((image_id, mimetype),) = self._upload(files)
return self._change_group_image(image_id, thread_id)
def change_thread_title(self, title, thread_id=None, thread_type=ThreadType.USER):
"""Change title of a thread.

View File

@@ -2,6 +2,7 @@ import attr
from ._core import attrs_default, Image
from . import _util, _session, _plan
from ._thread import ThreadType, Thread
from typing import Iterable
@attrs_default
@@ -41,6 +42,118 @@ class Group(Thread):
# Link for joining group
join_link = attr.ib(None)
def add_participants(self, user_ids: Iterable[str]):
"""Add users to the group.
Args:
user_ids: One or more user IDs to add
"""
data = self._to_send_data()
data["action_type"] = "ma-type:log-message"
data["log_message_type"] = "log:subscribe"
for i, user_id in enumerate(user_ids):
if user_id == self.session.user_id:
raise ValueError(
"Error when adding users: Cannot add self to group thread"
)
else:
data[
"log_message_data[added_participants][{}]".format(i)
] = "fbid:{}".format(user_id)
return self.session._do_send_request(data)
def remove_participant(self, user_id: str):
"""Remove user from the group.
Args:
user_id: User ID to remove
"""
data = {"uid": user_id, "tid": self.id}
j = self._payload_post("/chat/remove_participants/", data)
def _admin_status(self, user_ids: Iterable[str], status: bool):
data = {"add": admin, "thread_fbid": self.id}
for i, user_id in enumerate(user_ids):
data["admin_ids[{}]".format(i)] = str(user_id)
j = self.session._payload_post("/messaging/save_admins/?dpr=1", data)
def add_admins(self, user_ids: Iterable[str]):
"""Set specified users as group admins.
Args:
user_ids: One or more user IDs to set admin
"""
self._admin_status(user_ids, True)
def remove_admins(self, user_ids: Iterable[str]):
"""Remove admin status from specified users.
Args:
user_ids: One or more user IDs to remove admin
"""
self._admin_status(user_ids, False)
def set_title(self, title: str):
"""Change title of the group.
Args:
title: New title
"""
data = {"thread_name": title, "thread_id": self.id}
j = self.session._payload_post("/messaging/set_thread_name/?dpr=1", data)
def set_image(self, image_id: str):
"""Change the group image from an image id.
Args:
image_id: ID of uploaded image
"""
data = {"thread_image_id": image_id, "thread_id": self.id}
j = self.session._payload_post("/messaging/set_thread_image/?dpr=1", data)
def set_approval_mode(self, require_admin_approval: bool):
"""Change the group's approval mode.
Args:
require_admin_approval: True or False
"""
data = {"set_mode": int(require_admin_approval), "thread_fbid": thread_id}
j = self.session._payload_post("/messaging/set_approval_mode/?dpr=1", data)
def _users_approval(self, user_ids: Iterable[str], approve: bool):
data = {
"client_mutation_id": "0",
"actor_id": self.session.user_id,
"thread_fbid": self.id,
"user_ids": list(user_ids),
"response": "ACCEPT" if approve else "DENY",
"surface": "ADMIN_MODEL_APPROVAL_CENTER",
}
(j,) = self.session._graphql_requests(
_graphql.from_doc_id("1574519202665847", {"data": data})
)
def accept_users(self, user_ids: Iterable[str]):
"""Accept users to the group from the group's approval.
Args:
user_ids: One or more user IDs to accept
"""
self._users_approval(user_ids, True)
def deny_users(self, user_ids: Iterable[str]):
"""Deny users from joining the group.
Args:
user_ids: One or more user IDs to deny
"""
self._users_approval(user_ids, False)
@classmethod
def _from_graphql(cls, session, data):
if data.get("image") is None: