2525import asyncio
2626import copy
2727import logging
28- from typing import Any , Self
28+ from typing import TYPE_CHECKING , Any , Self
29+ from discord import Role
2930from discord .app .event_emitter import Event
3031from discord .app .state import ConnectionState
3132from discord .emoji import Emoji
3435from discord .raw_models import RawMemberRemoveEvent
3536from discord .sticker import Sticker
3637
38+ if TYPE_CHECKING :
39+ from ..types .member import MemberWithUser
40+
3741_log = logging .getLogger (__name__ )
3842
43+
3944class GuildMemberJoin (Event , Member ):
4045 __event_name__ = "GUILD_MEMBER_JOIN"
4146
@@ -62,6 +67,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
6267 self .__dict__ .update (member .__dict__ )
6368 return self
6469
70+
6571class GuildMemberRemove (Event , Member ):
6672 __event_name__ = "GUILD_MEMBER_REMOVE"
6773
@@ -90,6 +96,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
9096 data ["guild_id" ],
9197 )
9298
99+
93100class GuildMemberUpdate (Event , Member ):
94101 __event_name__ = "GUILD_MEMBER_UPDATE"
95102
@@ -136,6 +143,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
136143 user_id ,
137144 )
138145
146+
139147class GuildEmojisUpdate (Event ):
140148 __event_name__ = "GUILD_EMOJIS_UPDATE"
141149 guild : Guild
@@ -165,6 +173,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
165173 self .old_emojis = guild .emojis
166174 self .emojis = emojis
167175
176+
168177class GuildStickersUpdate (Event ):
169178 __event_name__ = "GUILD_STICKERS_UPDATE"
170179
@@ -177,7 +186,9 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
177186 guild = await state ._get_guild (int (data ["guild_id" ]))
178187 if guild is None :
179188 _log .debug (
180- ("GUILD_STICKERS_UPDATE referencing an unknown guild ID: %s. Discarding." ),
189+ (
190+ "GUILD_STICKERS_UPDATE referencing an unknown guild ID: %s. Discarding."
191+ ),
181192 data ["guild_id" ],
182193 )
183194 return
@@ -195,6 +206,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
195206 self .stickers = stickers
196207 self .guild = guild
197208
209+
198210class GuildAvailable (Event , Guild ):
199211 __event_name__ = "GUILD_AVAILABLE"
200212
@@ -206,6 +218,7 @@ async def __load__(cls, data: Guild, _: ConnectionState) -> Self:
206218 self .__dict__ .update (data .__dict__ )
207219 return self
208220
221+
209222class GuildUnavailable (Event , Guild ):
210223 __event_name__ = "GUILD_UNAVAILABLE"
211224
@@ -217,6 +230,7 @@ async def __load__(cls, data: Guild, _: ConnectionState) -> Self:
217230 self .__dict__ .update (data .__dict__ )
218231 return self
219232
233+
220234class GuildJoin (Event , Guild ):
221235 __event_name__ = "GUILD_JOIN"
222236
@@ -228,6 +242,7 @@ async def __load__(cls, data: Guild, _: ConnectionState) -> Self:
228242 self .__dict__ .update (data .__dict__ )
229243 return self
230244
245+
231246class GuildCreate (Event , Guild ):
232247 __event_name__ = "GUILD_CREATE"
233248
@@ -244,7 +259,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
244259
245260 try :
246261 # Notify the on_ready state, if any, that this guild is complete.
247- state ._ready_state .put_nowait (guild ) # type: ignore
262+ state ._ready_state .put_nowait (guild ) # type: ignore
248263 except AttributeError :
249264 pass
250265 else :
@@ -266,6 +281,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
266281 self .__dict__ .update (data .__dict__ )
267282 return self
268283
284+
269285class GuildUpdate (Event , Guild ):
270286 __event_name__ = "GUILD_UPDATE"
271287
@@ -289,6 +305,7 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
289305 data ["id" ],
290306 )
291307
308+
292309class GuildDelete (Event , Guild ):
293310 __event_name__ = "GUILD_DELETE"
294311
@@ -315,9 +332,162 @@ async def __load__(cls, data: Any, state: ConnectionState) -> Self | None:
315332
316333 # do a cleanup of the messages cache
317334 messages = await state .cache .get_all_messages ()
318- await asyncio .gather (* [state .cache .delete_message (message .id ) for message in messages ])
335+ await asyncio .gather (
336+ * [state .cache .delete_message (message .id ) for message in messages ]
337+ )
319338
320339 await state ._remove_guild (guild )
321340 self = cls ()
322341 self .__dict__ .update (guild .__dict__ )
323- return self
342+ return self
343+
344+
345+ class GuildBanAdd (Event , Member ):
346+ __event_name__ = "GUILD_BAN_ADD"
347+
348+ def __init__ (self ) -> None : ...
349+
350+ @classmethod
351+ async def __load__ (cls , data : Any , state : ConnectionState ) -> Self | None :
352+ guild = await state ._get_guild (int (data ["guild_id" ]))
353+ if guild is None :
354+ _log .debug (
355+ "GUILD_BAN_ADD referencing an unknown guild ID: %s. Discarding." ,
356+ data ["guild_id" ],
357+ )
358+ return
359+
360+ member = await guild .get_member (int (data ["user" ]["id" ]))
361+ if member is None :
362+ fake_data : MemberWithUser = {
363+ "user" : data ["user" ],
364+ "roles" : [],
365+ "joined_at" : None ,
366+ "deaf" : False ,
367+ "mute" : False ,
368+ }
369+ member = Member (guild = guild , data = fake_data , state = state )
370+
371+ self = cls ()
372+ self .__dict__ .update (member .__dict__ )
373+ return self
374+
375+
376+ class GuildBanRemove (Event , Member ):
377+ __event_name__ = "GUILD_BAN_REMOVE"
378+
379+ def __init__ (self ) -> None : ...
380+
381+ @classmethod
382+ async def __load__ (cls , data : Any , state : ConnectionState ) -> Self | None :
383+ guild = await state ._get_guild (int (data ["guild_id" ]))
384+ if guild is None :
385+ _log .debug (
386+ "GUILD_BAN_ADD referencing an unknown guild ID: %s. Discarding." ,
387+ data ["guild_id" ],
388+ )
389+ return
390+
391+ member = await guild .get_member (int (data ["user" ]["id" ]))
392+ if member is None :
393+ fake_data : MemberWithUser = {
394+ "user" : data ["user" ],
395+ "roles" : [],
396+ "joined_at" : None ,
397+ "deaf" : False ,
398+ "mute" : False ,
399+ }
400+ member = Member (guild = guild , data = fake_data , state = state )
401+
402+ self = cls ()
403+ self .__dict__ .update (member .__dict__ )
404+ return self
405+
406+
407+ class GuildRoleCreate (Event , Role ):
408+ __event_name__ = "GUILD_ROLE_CREATE"
409+
410+ def __init__ (self ) -> None : ...
411+
412+ @classmethod
413+ async def __load__ (cls , data : Any , state : ConnectionState ) -> Self | None :
414+ guild = await state ._get_guild (int (data ["guild_id" ]))
415+ if guild is None :
416+ _log .debug (
417+ "GUILD_ROLE_CREATE referencing an unknown guild ID: %s. Discarding." ,
418+ data ["guild_id" ],
419+ )
420+ return
421+
422+ role = Role (guild = guild , data = data ["role" ], state = state )
423+ guild ._add_role (role )
424+
425+ self = cls ()
426+ self .__dict__ .update (role .__dict__ )
427+ return self
428+
429+
430+ class GuildRoleUpdate (Event , Role ):
431+ __event_name__ = "GUILD_ROLE_UPDATE"
432+
433+ old : Role
434+
435+ def __init__ (self ) -> None : ...
436+
437+ @classmethod
438+ async def __load__ (cls , data : Any , state : ConnectionState ) -> Self | None :
439+ guild = await state ._get_guild (int (data ["guild_id" ]))
440+ if guild is None :
441+ _log .debug (
442+ "GUILD_ROLE_UPDATE referencing an unknown guild ID: %s. Discarding." ,
443+ data ["guild_id" ],
444+ )
445+ return
446+
447+ role_id : int = int (data ["role" ]["id" ])
448+ role = guild .get_role (role_id )
449+ if role is None :
450+ _log .debug (
451+ "GUILD_ROLE_UPDATE referencing an unknown role ID: %s. Discarding." ,
452+ data ["role" ]["id" ],
453+ )
454+ return
455+
456+ old_role = copy .copy (role )
457+ await role ._update (data ["role" ])
458+
459+ self = cls ()
460+ self .__dict__ .update (role .__dict__ )
461+ self .old = old_role
462+ return self
463+
464+
465+ class GuildRoleDelete (Event , Role ):
466+ __event_name__ = "GUILD_ROLE_DELETE"
467+
468+ def __init__ (self ) -> None : ...
469+
470+ @classmethod
471+ async def __load__ (cls , data : Any , state : ConnectionState ) -> Self | None :
472+ guild = await state ._get_guild (int (data ["guild_id" ]))
473+ if guild is None :
474+ _log .debug (
475+ "GUILD_ROLE_DELETE referencing an unknown guild ID: %s. Discarding." ,
476+ data ["guild_id" ],
477+ )
478+ return
479+
480+ role_id : int = int (data ["role_id" ])
481+ role = guild .get_role (role_id )
482+ if role is None :
483+ _log .debug (
484+ "GUILD_ROLE_DELETE referencing an unknown role ID: %s. Discarding." ,
485+ data ["role_id" ],
486+ )
487+ return
488+
489+ guild ._remove_role (role_id )
490+
491+ self = cls ()
492+ self .__dict__ .update (role .__dict__ )
493+ return self
0 commit comments