New methods and few fixes

Added: addGroupAdmin, removeGroupAdmin, changeGroupApprovalMode, blockUser, unblockUser, moveThread, onImageChange, onAdminsAdded, onAdminsRemoved, onApprovalModeChange
I did this all day, because I love this library and I want to be part of it :D
This commit is contained in:
kapi2289
2018-07-19 17:36:54 +02:00
committed by GitHub
parent 41807837b8
commit d934cefa8b

View File

@@ -1081,6 +1081,59 @@ class Client(object):
j = self._post(self.req_url.REMOVE_USER, data, fix_request=True, as_json=True) j = self._post(self.req_url.REMOVE_USER, data, fix_request=True, as_json=True)
def addGroupAdmin(self, user_id, thread_id=None):
"""
Sets specifed user as a group admin.
:param user_id: User ID to set admin
:param thread_id: Group ID to remove people from. See :ref:`intro_threads`
:raises: FBchatException if request failed
"""
thread_id, thread_type = self._getThread(thread_id, None)
data = {
"add": "true",
"admin_ids[0]": user_id,
"thread_fbid": thread_id
}
j = self._post(self.req_url.SAVE_ADMINS, data, fix_request=True, as_json=True)
def removeGroupAdmin(self, user_id, thread_id=None):
"""
Removes group admin from specifed user.
:param user_id: User ID to remove admin
:param thread_id: Group ID to remove people from. See :ref:`intro_threads`
:raises: FBchatException if request failed
"""
thread_id, thread_type = self._getThread(thread_id, None)
data = {
"add": "false",
"admin_ids[0]": user_id,
"thread_fbid": thread_id
}
j = self._post(self.req_url.SAVE_ADMINS, data, fix_request=True, as_json=True)
def changeGroupApprovalMode(self, approval_mode, thread_id=None):
"""
Changes group's approval mode
:param approval_mode: True or False
:param thread_id: Group ID to remove people from. See :ref:`intro_threads`
:raises: FBchatException if request failed
"""
thread_id, thread_type = self._getThread(thread_id, None)
data = {
"set_mode": int(approval_mode),
"thread_fbid": thread_id
}
j = self._post(self.req_url.APPROVAL_MODE, data, fix_request=True, as_json=True)
def changeThreadImage(self, image_id, thread_id=None, thread_type=ThreadType.USER): def changeThreadImage(self, image_id, thread_id=None, thread_type=ThreadType.USER):
""" """
Changes a thread image from an image id Changes a thread image from an image id
@@ -1403,6 +1456,68 @@ class Client(object):
log.warning("Error while removing friend") log.warning("Error while removing friend")
return False return False
def blockUser(self, user_id=None):
"""
Blocks messages from a specifed user
:param user_id: The id of the user that you want to block
:return: Whether the request was successful
:raises: FBchatException if request failed
"""
data = {
'fbid': user_id
}
r = self._post(self.req_url.BLOCK_USER, data)
return r.ok
def unblockUser(self, user_id=None):
"""
Unblocks messages from a blocked user
:param user_id: The id of the user that you want to unblock
:return: Whether the request was successful
:raises: FBchatException if request failed
"""
data = {
'fbid': user_id
}
r = self._post(self.req_url.UNBLOCK_USER, data)
return r.ok
def moveThread(self, location, thread_id=None):
"""
Moves the thread to specifed location
:param location: models.ThreadLocation: INBOX, PENDING, ARCHIVED or OTHER
:param thread_id: User/Group ID to change color of. See :ref:`intro_threads`
:param thread_type: See :ref:`intro_threads`
:type thread_type: models.ThreadType
:return: Whether the request was successful
:raises: FBchatException if request failed
"""
if location == ThreadLocation.PENDING:
location = ThreadLocation.OTHER
if location in ThreadLocation:
loc_str = location.value.lower()
else:
raise FBchatUserError('"location" must be a value of ThreadLocation')
if location == ThreadLocation.ARCHIVED:
data_archive = {
"ids[{}]".format(thread_id): 'true'
}
r_archive = self._post(self.req_url.ARCHIVED_STATUS, data_archive)
data_unpin = {
"ids[{}]".format(thread_id): 'false'
}
r_unpin = self._post(self.req_url.PINNED_STATUS, data_unpin)
return r_archive.ok and r_unpin.ok
else:
data = {
"{}[0]".format(loc_str): thread_id
}
r = self._post(self.req_url.MOVE_THREAD, data)
return r.ok
""" """
LISTEN METHODS LISTEN METHODS
""" """
@@ -1519,6 +1634,12 @@ class Client(object):
self.onTitleChange(mid=mid, author_id=author_id, new_title=new_title, thread_id=thread_id, self.onTitleChange(mid=mid, author_id=author_id, new_title=new_title, thread_id=thread_id,
thread_type=thread_type, ts=ts, metadata=metadata, msg=m) thread_type=thread_type, ts=ts, metadata=metadata, msg=m)
# Thread image change
elif delta.get("class") == "ForcedFetch":
mid = delta.get("messageId")
thread_id = str(delta['threadKey']['threadFbId'])
self.onImageChange(mid=mid, thread_id=thread_id)
# Nickname change # Nickname change
elif delta_type == "change_thread_nickname": elif delta_type == "change_thread_nickname":
changed_for = str(delta["untypedData"]["participant_id"]) changed_for = str(delta["untypedData"]["participant_id"])
@@ -1528,6 +1649,27 @@ class Client(object):
new_nickname=new_nickname, new_nickname=new_nickname,
thread_id=thread_id, thread_type=thread_type, ts=ts, metadata=metadata, msg=m) thread_id=thread_id, thread_type=thread_type, ts=ts, metadata=metadata, msg=m)
# Admin added to group thread
elif delta.get("class") == "AdminAddedToGroupThread":
thread_id = str(metadata['threadKey']['threadFbId'])
added_ids = [str(x['userFbId']) for x in delta['addedAdmins']]
self.onAdminsAdded(mid=mid, added_ids=added_ids, author_id=author_id, thread_id=thread_id,
ts=ts, msg=m)
# Admin removed from group thread
elif delta.get("class") == "AdminRemovedFromGroupThread":
thread_id = str(metadata['threadKey']['threadFbId'])
removed_ids = delta['removedAdminFbIds']
self.onAdminsRemoved(mid=mid, removed_ids=removed_ids, author_id=author_id, thread_id=thread_id,
ts=ts, msg=m)
# Group approval mode change
elif delta_type == "change_thread_approval_mode":
thread_id = str(metadata['threadKey']['threadFbId'])
approval_mode = bool(int(delta['untypedData']['APPROVAL_MODE']))
self.onApprovalModeChange(mid=mid, approval_mode=approval_mode, author_id=author_id, thread_id=thread_id,
ts=ts, msg=m)
# Message delivered # Message delivered
elif delta.get("class") == "DeliveryReceipt": elif delta.get("class") == "DeliveryReceipt":
message_ids = delta["messageIds"] message_ids = delta["messageIds"]
@@ -1840,6 +1982,19 @@ class Client(object):
""" """
log.info("Title change from {} in {} ({}): {}".format(author_id, thread_id, thread_type.name, new_title)) log.info("Title change from {} in {} ({}): {}".format(author_id, thread_id, thread_type.name, new_title))
def onImageChange(self, mid=None, thread_id=None):
"""
.. todo::
Add author_id and image_id
Called when the client is listening, and somebody changes the image of a thread
:param mid: The action ID
:param thread_id: Thread ID that the action was sent to. See :ref:`intro_threads`
"""
log.info("Image change in {}".format(author_id, thread_id))
def onNicknameChange(self, mid=None, author_id=None, changed_for=None, new_nickname=None, thread_id=None, thread_type=ThreadType.USER, ts=None, metadata=None, msg=None): def onNicknameChange(self, mid=None, author_id=None, changed_for=None, new_nickname=None, thread_id=None, thread_type=ThreadType.USER, ts=None, metadata=None, msg=None):
""" """
Called when the client is listening, and somebody changes the nickname of a person Called when the client is listening, and somebody changes the nickname of a person
@@ -1858,6 +2013,50 @@ class Client(object):
log.info("Nickname change from {} in {} ({}) for {}: {}".format(author_id, thread_id, thread_type.name, changed_for, new_nickname)) log.info("Nickname change from {} in {} ({}) for {}: {}".format(author_id, thread_id, thread_type.name, changed_for, new_nickname))
def onAdminsAdded(self, mid=None, added_ids=None, author_id=None, thread_id=None, ts=None, msg=None):
"""
Called when the client is listening, and somebody adds admins to a group thread
:param mid: The action ID
:param added_ids: The IDs of the admins who got added
:param author_id: The ID of the person who added the admins
:param thread_id: Thread ID that the action was sent to. See :ref:`intro_threads`
:param ts: A timestamp of the action
:param msg: A full set of the data recieved
"""
log.info("{} added admins: {} in {}".format(author_id, ', '.join(added_ids), thread_id))
def onAdminsRemoved(self, mid=None, removed_ids=None, author_id=None, thread_id=None, ts=None, msg=None):
"""
Called when the client is listening, and somebody removes admins from a group thread
:param mid: The action ID
:param added_ids: The IDs of the admins who got removed
:param author_id: The ID of the person who removed the admins
:param thread_id: Thread ID that the action was sent to. See :ref:`intro_threads`
:param ts: A timestamp of the action
:param msg: A full set of the data recieved
"""
log.info("{} removed admins: {} in {}".format(author_id, ', '.join(removed_ids), thread_id))
def onApprovalModeChange(self, mid=None, approval_mode=None, author_id=None, thread_id=None, ts=None, msg=None):
"""
Called when the client is listening, and somebody removes admins from a group thread
:param mid: The action ID
:param approval_mode: True if approval mode is activated
:param author_id: The ID of the person who removed the admins
:param thread_id: Thread ID that the action was sent to. See :ref:`intro_threads`
:param ts: A timestamp of the action
:param msg: A full set of the data recieved
"""
if approval_mode:
log.info("{} activated approval mode in {}".format(author_id, thread_id))
else:
log.info("{} disabled approval mode in {}".format(author_id, thread_id))
def onMessageSeen(self, seen_by=None, thread_id=None, thread_type=ThreadType.USER, seen_ts=None, ts=None, metadata=None, msg=None): def onMessageSeen(self, seen_by=None, thread_id=None, thread_type=ThreadType.USER, seen_ts=None, ts=None, metadata=None, msg=None):
""" """
Called when the client is listening, and somebody marks a message as seen Called when the client is listening, and somebody marks a message as seen
@@ -1914,7 +2113,7 @@ class Client(object):
:param ts: A timestamp of the action :param ts: A timestamp of the action
:param msg: A full set of the data recieved :param msg: A full set of the data recieved
""" """
log.info("{} added: {}".format(author_id, ', '.join(added_ids))) log.info("{} added: {} in {}".format(author_id, ', '.join(added_ids), thread_id))
def onPersonRemoved(self, mid=None, removed_id=None, author_id=None, thread_id=None, ts=None, msg=None): def onPersonRemoved(self, mid=None, removed_id=None, author_id=None, thread_id=None, ts=None, msg=None):
""" """
@@ -1927,7 +2126,7 @@ class Client(object):
:param ts: A timestamp of the action :param ts: A timestamp of the action
:param msg: A full set of the data recieved :param msg: A full set of the data recieved
""" """
log.info("{} removed: {}".format(author_id, removed_id)) log.info("{} removed: {} in {}".format(author_id, removed_id, thread_id))
def onFriendRequest(self, from_id=None, msg=None): def onFriendRequest(self, from_id=None, msg=None):
""" """