Skip to content

Commit 4b84447

Browse files
BobDotComDorukyumpre-commit-ci[bot]
authored
feat: add more raw events (#1880)
* feat: add raw_member_remove event * feat: add raw_member_remove event * docs: document on_raw_member_remove * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix: fix docs for raw_member_remove * fix(docs): add versionadded for on_raw_member_remove * feat: add raw_thread_update event * fix(docs): fix rst syntax * fix: improve parse_thread_update method 1. Changed so raw_thread_update will be dispatched even when an unknown guild is referenced 2. Added handling to remove archived threads from the cache. * fix(docs): fix url & syntax for gateway link * Add raw_thread_member_remove event * fix name typo * docs(changelog): add changelog entry --------- Co-authored-by: Dorukyum <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 44ad1a9 commit 4b84447

File tree

7 files changed

+209
-15
lines changed

7 files changed

+209
-15
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ These changes are available on the `master` branch, but have not yet been releas
3131
([#1912](https://github.com/Pycord-Development/pycord/pull/1912))
3232
- Added GIF sticker format type to the `StickerFormatType` enum.
3333
([#1915](https://github.com/Pycord-Development/pycord/pull/1915))
34+
- Added new raw events: `raw_member_remove`, `raw_thread_update`, and
35+
`raw_thread_member_remove`.
36+
([#1880](https://github.com/Pycord-Development/pycord/pull/1880))
3437

3538
### Changed
3639

discord/flags.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,7 @@ def members(self):
689689
690690
- :func:`on_member_join`
691691
- :func:`on_member_remove`
692+
- :func:`on_raw_member_remove`
692693
- :func:`on_member_update`
693694
- :func:`on_user_update`
694695

discord/raw_models.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
from .automod import AutoModAction, AutoModTriggerType
3232
from .enums import ChannelType, try_enum
33+
from .types.user import User
3334

3435
if TYPE_CHECKING:
3536
from .abc import MessageableChannel
@@ -43,13 +44,16 @@
4344
from .types.raw_models import (
4445
BulkMessageDeleteEvent,
4546
IntegrationDeleteEvent,
47+
MemberRemoveEvent,
4648
MessageDeleteEvent,
4749
MessageUpdateEvent,
4850
ReactionActionEvent,
4951
ReactionClearEmojiEvent,
5052
ReactionClearEvent,
5153
ScheduledEventSubscription,
5254
ThreadDeleteEvent,
55+
ThreadMembersUpdateEvent,
56+
ThreadUpdateEvent,
5357
TypingEvent,
5458
)
5559

@@ -62,10 +66,13 @@
6266
"RawReactionClearEvent",
6367
"RawReactionClearEmojiEvent",
6468
"RawIntegrationDeleteEvent",
69+
"RawThreadUpdateEvent",
6570
"RawThreadDeleteEvent",
6671
"RawTypingEvent",
72+
"RawMemberRemoveEvent",
6773
"RawScheduledEventSubscription",
6874
"AutoModActionExecutionEvent",
75+
"RawThreadMembersUpdateEvent",
6976
)
7077

7178

@@ -305,6 +312,38 @@ def __init__(self, data: IntegrationDeleteEvent) -> None:
305312
self.application_id: int | None = None
306313

307314

315+
class RawThreadUpdateEvent(_RawReprMixin):
316+
"""Represents the payload for an :func:`on_raw_thread_update` event.
317+
318+
.. versionadded:: 2.4
319+
320+
Attributes
321+
----------
322+
thread_id: :class:`int`
323+
The ID of the updated thread.
324+
thread_type: :class:`discord.ChannelType`
325+
The channel type of the updated thread.
326+
guild_id: :class:`int`
327+
The ID of the guild the thread belongs to.
328+
parent_id: :class:`int`
329+
The ID of the channel the thread belongs to.
330+
data: :class:`dict`
331+
The raw data given by the `gateway <https://discord.com/developers/docs/topics/gateway-events#thread-update>`_.
332+
thread: :class:`discord.Thread` | None
333+
The thread, if it could be found in the internal cache.
334+
"""
335+
336+
__slots__ = ("thread_id", "thread_type", "parent_id", "guild_id", "data", "thread")
337+
338+
def __init__(self, data: ThreadUpdateEvent) -> None:
339+
self.thread_id: int = int(data["id"])
340+
self.thread_type: ChannelType = try_enum(ChannelType, data["type"])
341+
self.guild_id: int = int(data["guild_id"])
342+
self.parent_id: int = int(data["parent_id"])
343+
self.data: ThreadUpdateEvent = data
344+
self.thread: Thread | None = None
345+
346+
308347
class RawThreadDeleteEvent(_RawReprMixin):
309348
"""Represents the payload for :func:`on_raw_thread_delete` event.
310349
@@ -370,6 +409,26 @@ def __init__(self, data: TypingEvent) -> None:
370409
self.guild_id: int | None = None
371410

372411

412+
class RawMemberRemoveEvent(_RawReprMixin):
413+
"""Represents the payload for an :func:`on_raw_member_remove` event.
414+
415+
.. versionadded:: 2.4
416+
417+
Attributes
418+
----------
419+
user: :class:`discord.User`
420+
The user that left the guild.
421+
guild_id: :class:`int`
422+
The ID of the guild the user left.
423+
"""
424+
425+
__slots__ = ("user", "guild_id")
426+
427+
def __init__(self, data: MemberRemoveEvent, user: User):
428+
self.user: User = user
429+
self.guild_id: int = int(data["guild_id"])
430+
431+
373432
class RawScheduledEventSubscription(_RawReprMixin):
374433
"""Represents the payload for a :func:`raw_scheduled_event_user_add` or
375434
:func:`raw_scheduled_event_user_remove` event.
@@ -516,3 +575,29 @@ def __repr__(self) -> str:
516575
f"rule_id={self.rule_id!r} guild_id={self.guild_id!r} "
517576
f"user_id={self.user_id!r}>"
518577
)
578+
579+
580+
class RawThreadMembersUpdateEvent(_RawReprMixin):
581+
"""Represents the payload for an :func:`on_raw_thread_member_remove` event.
582+
583+
.. versionadded:: 2.4
584+
585+
Attributes
586+
----------
587+
thread_id: :class:`int`
588+
The ID of the thread that was updated.
589+
guild_id: :class:`int`
590+
The ID of the guild the thread is in.
591+
member_count: :class:`int`
592+
The approximate number of members in the thread. Maximum of 50.
593+
data: :class:`dict`
594+
The raw data given by the `gateway <https://discord.com/developers/docs/topics/gateway-events#thread-members-update>`_.
595+
"""
596+
597+
__slots__ = ("thread_id", "guild_id", "member_count", "data")
598+
599+
def __init__(self, data: ThreadMembersUpdateEvent) -> None:
600+
self.thread_id = int(data["id"])
601+
self.guild_id = int(data["guild_id"])
602+
self.member_count = int(data["member_count"])
603+
self.data = data

discord/state.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -969,23 +969,28 @@ def parse_thread_create(self, data) -> None:
969969
def parse_thread_update(self, data) -> None:
970970
guild_id = int(data["guild_id"])
971971
guild = self._get_guild(guild_id)
972+
raw = RawThreadUpdateEvent(data)
972973
if guild is None:
973974
_log.debug(
974975
"THREAD_UPDATE referencing an unknown guild ID: %s. Discarding",
975976
guild_id,
976977
)
977978
return
978-
979-
thread_id = int(data["id"])
980-
thread = guild.get_thread(thread_id)
981-
if thread is not None:
982-
old = copy.copy(thread)
983-
thread._update(data)
984-
self.dispatch("thread_update", old, thread)
985979
else:
986-
thread = Thread(guild=guild, state=guild._state, data=data)
987-
guild._add_thread(thread)
988-
self.dispatch("thread_join", thread)
980+
thread = guild.get_thread(raw.thread_id)
981+
if thread is not None:
982+
old = copy.copy(thread)
983+
thread._update(data)
984+
if thread.archived:
985+
guild._remove_thread(thread)
986+
self.dispatch("thread_update", old, thread)
987+
else:
988+
thread = Thread(guild=guild, state=guild._state, data=data)
989+
if not thread.archived:
990+
guild._add_thread(thread)
991+
self.dispatch("thread_join", thread)
992+
raw.thread = thread
993+
self.dispatch("raw_thread_update", raw)
989994

990995
def parse_thread_delete(self, data) -> None:
991996
guild_id = int(data["guild_id"])
@@ -1084,6 +1089,7 @@ def parse_thread_members_update(self, data) -> None:
10841089

10851090
thread_id = int(data["id"])
10861091
thread: Thread | None = guild.get_thread(thread_id)
1092+
raw = RawThreadMembersUpdateEvent(data)
10871093
if thread is None:
10881094
_log.debug(
10891095
(
@@ -1108,6 +1114,7 @@ def parse_thread_members_update(self, data) -> None:
11081114
for member_id in removed_member_ids:
11091115
if member_id != self_id:
11101116
member = thread._pop_member(member_id)
1117+
self.dispatch("raw_thread_member_remove", raw)
11111118
if member is not None:
11121119
self.dispatch("thread_member_remove", member)
11131120
else:
@@ -1134,23 +1141,27 @@ def parse_guild_member_add(self, data) -> None:
11341141
self.dispatch("member_join", member)
11351142

11361143
def parse_guild_member_remove(self, data) -> None:
1144+
user = self.store_user(data["user"])
1145+
raw = RawMemberRemoveEvent(data, user)
1146+
11371147
guild = self._get_guild(int(data["guild_id"]))
11381148
if guild is not None:
11391149
try:
11401150
guild._member_count -= 1
11411151
except AttributeError:
11421152
pass
11431153

1144-
user_id = int(data["user"]["id"])
1145-
member = guild.get_member(user_id)
1154+
member = guild.get_member(user.id)
11461155
if member is not None:
1156+
raw.user = member
11471157
guild._remove_member(member) # type: ignore
11481158
self.dispatch("member_remove", member)
11491159
else:
11501160
_log.debug(
11511161
"GUILD_MEMBER_REMOVE referencing an unknown guild ID: %s. Discarding.",
11521162
data["guild_id"],
11531163
)
1164+
self.dispatch("raw_member_remove", raw)
11541165

11551166
def parse_guild_member_update(self, data) -> None:
11561167
guild = self._get_guild(int(data["guild_id"]))

discord/types/raw_models.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
from .emoji import PartialEmoji
3030
from .member import Member
3131
from .snowflake import Snowflake
32+
from .threads import Thread, ThreadMember
33+
from .user import User
3234

3335

3436
class _MessageEventOptional(TypedDict, total=False):
@@ -79,6 +81,9 @@ class IntegrationDeleteEvent(TypedDict):
7981
guild_id: Snowflake
8082

8183

84+
ThreadUpdateEvent = Thread
85+
86+
8287
class ThreadDeleteEvent(TypedDict, total=False):
8388
thread_id: Snowflake
8489
thread_type: int
@@ -112,3 +117,16 @@ class AutoModActionExecutionEvent(TypedDict):
112117
rule_trigger_type: AutoModTriggerType
113118
user_id: Snowflake
114119
content: str
120+
121+
122+
class MemberRemoveEvent(TypedDict):
123+
guild_id: Snowflake
124+
user: User
125+
126+
127+
class ThreadMembersUpdateEvent(TypedDict):
128+
id: Snowflake
129+
guild_id: Snowflake
130+
member_count: int
131+
added_members: NotRequired[list[ThreadMember]]
132+
removed_member_ids: NotRequired[list[Snowflake]]

docs/api/events.rst

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -581,15 +581,40 @@ Invites
581581
Members/Users
582582
-------------
583583
.. function:: on_member_join(member)
584-
on_member_remove(member)
585584

586-
Called when a :class:`Member` leaves or joins a :class:`Guild`.
585+
Called when a :class:`Member` joins a :class:`Guild`.
587586

588587
This requires :attr:`Intents.members` to be enabled.
589588

590-
:param member: The member who joined or left.
589+
:param member: The member who joined.
591590
:type member: :class:`Member`
592591

592+
.. function:: on_member_remove(member)
593+
594+
Called when a :class:`Member` leaves a :class:`Guild`.
595+
596+
If the guild or member could not be found in the internal cache, this event will not
597+
be called. Alternatively, :func:`on_raw_member_remove` is called regardless of the
598+
internal cache.
599+
600+
This requires :attr:`Intents.members` to be enabled.
601+
602+
:param member: The member who left.
603+
:type member: :class:`Member`
604+
605+
.. function:: on_raw_member_remove(payload)
606+
607+
Called when a :class:`Member` leaves a :class:`Guild`. Unlike
608+
:func:`on_member_remove`, this is called regardless of the state of the internal
609+
member cache.
610+
611+
This requires :attr:`Intents.members` to be enabled.
612+
613+
.. versionadded:: 2.4
614+
615+
:param payload: The raw event payload data.
616+
:type payload: :class:`RawMemberRemoveEvent`
617+
593618
.. function:: on_member_update(before, after)
594619

595620
Called when a :class:`Member` updates their profile.
@@ -1102,19 +1127,53 @@ Threads
11021127
:param member: The member who joined or left.
11031128
:type member: :class:`ThreadMember`
11041129

1130+
1131+
.. function:: on_raw_thread_member_remove(payload)
1132+
1133+
Called when a :class:`ThreadMember` leaves a :class:`Thread`. Unlike :func:`on_thread_member_remove` this
1134+
is called regardless of the member being in the thread's internal cache of members or not.
1135+
1136+
This requires :attr:`Intents.members` to be enabled.
1137+
1138+
.. versionadded:: 2.4
1139+
1140+
:param payload: The raw event payload data.
1141+
:type member: :class:`RawThreadMembersUpdateEvent`
1142+
1143+
1144+
11051145
.. function:: on_thread_update(before, after)
11061146

11071147
Called whenever a thread is updated.
11081148

11091149
This requires :attr:`Intents.guilds` to be enabled.
11101150

1151+
If the thread could not be found in the internal cache, this event will not be called.
1152+
Threads will not be in the cache if they are archived. Alternatively,
1153+
:func:`on_raw_thread_update` is called regardless of the internal cache.
1154+
11111155
.. versionadded:: 2.0
11121156

11131157
:param before: The updated thread's old info.
11141158
:type before: :class:`Thread`
11151159
:param after: The updated thread's new info.
11161160
:type after: :class:`Thread`
11171161

1162+
1163+
.. function:: on_raw_thread_update(payload)
1164+
1165+
Called whenever a thread is updated.
1166+
1167+
Unlike :func:`on_thread_update` this is called regardless of if the thread is in the
1168+
internal thread cache or not.
1169+
1170+
This requires :attr:`Intents.guilds` to be enabled.
1171+
1172+
.. versionadded:: 2.4
1173+
1174+
:param payload: The raw event payload data.
1175+
:type payload: :class:`RawThreadUpdateEvent`
1176+
11181177
Typing
11191178
------
11201179
.. function:: on_typing(channel, user, when)

docs/api/models.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,23 @@ Events
502502
.. autoclass:: RawScheduledEventSubscription()
503503
:members:
504504

505+
.. attributetable:: RawMemberRemoveEvent
506+
507+
.. autoclass:: RawMemberRemoveEvent()
508+
:members:
509+
510+
.. attributetable:: RawThreadUpdateEvent
511+
512+
.. autoclass:: RawThreadUpdateEvent()
513+
:members:
514+
515+
.. attributetable:: RawThreadMembersUpdateEvent
516+
517+
.. autoclass:: RawThreadMembersUpdateEvent()
518+
:members:
519+
520+
521+
505522
Webhooks
506523
--------
507524

0 commit comments

Comments
 (0)