From 77cf7530899e95793b362c25d179e81cd347af03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enes=20Kurbeto=C4=9Flu?= Date: Thu, 9 Jun 2022 08:58:50 +0300 Subject: [PATCH] Add on_raw_thread_member_remove event --- discord/raw_models.py | 28 ++++++++++++++++++++++++++++ discord/state.py | 2 ++ docs/api.rst | 17 +++++++++++++++-- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/discord/raw_models.py b/discord/raw_models.py index 5a5efc577..7f80cbb1f 100644 --- a/discord/raw_models.py +++ b/discord/raw_models.py @@ -39,6 +39,7 @@ if TYPE_CHECKING: MessageUpdateEvent, IntegrationDeleteEvent, ThreadDeleteEvent, + ThreadMembersUpdate, ) from .message import Message from .partial_emoji import PartialEmoji @@ -57,6 +58,7 @@ __all__ = ( 'RawReactionClearEmojiEvent', 'RawIntegrationDeleteEvent', 'RawThreadDeleteEvent', + 'RawThreadMembersUpdate', ) @@ -314,3 +316,29 @@ class RawThreadDeleteEvent(_RawReprMixin): self.guild_id: int = int(data['guild_id']) self.parent_id: int = int(data['parent_id']) self.thread: Optional[Thread] = None + + +class RawThreadMembersUpdate(_RawReprMixin): + """Represents the payload for a :func:`on_raw_thread_member_remove` event. + + .. versionadded:: 2.0 + + Attributes + ---------- + thread_id: :class:`int` + The ID of the thread that was updated. + guild_id: :class:`int` + The ID of the guild the thread is in. + member_count: :class:`int` + The approximate number of members in the thread. This caps at 50. + data: :class:`dict` + The raw data given by the :ddocs:`gateway `. + """ + + __slots__ = ('thread_id', 'guild_id', 'member_count', 'data') + + def __init__(self, data: ThreadMembersUpdate) -> None: + self.thread_id: int = int(data['id']) + self.guild_id: int = int(data['guild_id']) + self.member_count: int = int(data['member_count']) + self.data: ThreadMembersUpdate = data diff --git a/discord/state.py b/discord/state.py index 6cec02477..e70de9178 100644 --- a/discord/state.py +++ b/discord/state.py @@ -1675,6 +1675,7 @@ class ConnectionState: thread_id = int(data['id']) thread: Optional[Thread] = guild.get_thread(thread_id) + raw = RawThreadMembersUpdate(data) if thread is None: _log.debug('THREAD_MEMBERS_UPDATE referencing an unknown thread ID: %s. Discarding.', thread_id) return @@ -1693,6 +1694,7 @@ class ConnectionState: for member_id in removed_member_ids: member = thread._pop_member(member_id) if member_id != self_id: + self.dispatch('raw_thread_member_remove', raw) if member is not None: self.dispatch('thread_member_remove', member) else: diff --git a/docs/api.rst b/docs/api.rst index 80cf83158..0ec7ee83e 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -1323,8 +1323,6 @@ Threads Called whenever a thread is deleted. Unlike :func:`on_thread_delete` this is called regardless of the thread being in the internal thread cache or not. - This requires :attr:`Intents.guilds` to be enabled. - .. versionadded:: 2.0 :param payload: The raw event payload data. @@ -1342,6 +1340,16 @@ Threads :param member: The member who joined or left. :type member: :class:`ThreadMember` +.. function:: on_raw_thread_member_remove(payload) + + Called when a :class:`ThreadMember` leaves a :class:`Thread`. Unlike :func:`on_thread_member_remove` this + is called regardless of the member being in the internal thread's members cache or not. + + .. versionadded:: 2.0 + + :param payload: The raw event payload data. + :type member: :class:`RawThreadMembersUpdate` + Voice ~~~~~~ @@ -6836,6 +6844,11 @@ RawEvent .. autoclass:: RawIntegrationDeleteEvent() :members: +.. attributetable:: RawThreadMembersUpdate + +.. autoclass:: RawThreadMembersUpdate() + :members: + .. attributetable:: RawThreadDeleteEvent .. autoclass:: RawThreadDeleteEvent()