Skip to content

Commit 22a8232

Browse files
committed
refactor: events guild_ban_add, guild_ban_remove, guild_role_create, guild_role_update, guild_role_delete
1 parent 93bd39f commit 22a8232

File tree

3 files changed

+176
-73
lines changed

3 files changed

+176
-73
lines changed

discord/app/state.py

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -548,73 +548,6 @@ def parse_guild_audit_log_entry_create(self, data) -> None:
548548
entry = AuditLogEntry(users={data["user_id"]: user}, data=data, guild=guild)
549549
self.dispatch("audit_log_entry", entry)
550550

551-
def parse_guild_ban_add(self, data) -> None:
552-
# we make the assumption that GUILD_BAN_ADD is done
553-
# before GUILD_MEMBER_REMOVE is called
554-
# hence we don't remove it from cache or do anything
555-
# strange with it, the main purpose of this event
556-
# is mainly to dispatch to another event worth listening to for logging
557-
guild = self._get_guild(int(data["guild_id"]))
558-
if guild is not None:
559-
try:
560-
user = User(data=data["user"], state=self)
561-
except KeyError:
562-
pass
563-
else:
564-
member = guild.get_member(user.id) or user
565-
self.dispatch("member_ban", guild, member)
566-
567-
def parse_guild_ban_remove(self, data) -> None:
568-
guild = self._get_guild(int(data["guild_id"]))
569-
if guild is not None and "user" in data:
570-
user = self.store_user(data["user"])
571-
self.dispatch("member_unban", guild, user)
572-
573-
def parse_guild_role_create(self, data) -> None:
574-
guild = self._get_guild(int(data["guild_id"]))
575-
if guild is None:
576-
_log.debug(
577-
"GUILD_ROLE_CREATE referencing an unknown guild ID: %s. Discarding.",
578-
data["guild_id"],
579-
)
580-
return
581-
582-
role_data = data["role"]
583-
role = Role(guild=guild, data=role_data, state=self)
584-
guild._add_role(role)
585-
self.dispatch("guild_role_create", role)
586-
587-
def parse_guild_role_delete(self, data) -> None:
588-
guild = self._get_guild(int(data["guild_id"]))
589-
if guild is not None:
590-
role_id = int(data["role_id"])
591-
try:
592-
role = guild._remove_role(role_id)
593-
except KeyError:
594-
return
595-
else:
596-
self.dispatch("guild_role_delete", role)
597-
else:
598-
_log.debug(
599-
"GUILD_ROLE_DELETE referencing an unknown guild ID: %s. Discarding.",
600-
data["guild_id"],
601-
)
602-
603-
def parse_guild_role_update(self, data) -> None:
604-
guild = self._get_guild(int(data["guild_id"]))
605-
if guild is not None:
606-
role_data = data["role"]
607-
role_id = int(role_data["id"])
608-
role = guild.get_role(role_id)
609-
if role is not None:
610-
old_role = copy.copy(role)
611-
role._update(role_data)
612-
self.dispatch("guild_role_update", old_role, role)
613-
else:
614-
_log.debug(
615-
"GUILD_ROLE_UPDATE referencing an unknown guild ID: %s. Discarding.",
616-
data["guild_id"],
617-
)
618551

619552
def parse_guild_members_chunk(self, data) -> None:
620553
guild_id = int(data["guild_id"])

discord/events/guild.py

Lines changed: 175 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
import asyncio
2626
import copy
2727
import logging
28-
from typing import Any, Self
28+
from typing import TYPE_CHECKING, Any, Self
29+
from discord import Role
2930
from discord.app.event_emitter import Event
3031
from discord.app.state import ConnectionState
3132
from discord.emoji import Emoji
@@ -34,8 +35,12 @@
3435
from discord.raw_models import RawMemberRemoveEvent
3536
from discord.sticker import Sticker
3637

38+
if TYPE_CHECKING:
39+
from ..types.member import MemberWithUser
40+
3741
_log = logging.getLogger(__name__)
3842

43+
3944
class 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+
6571
class 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+
93100
class 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+
139147
class 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+
168177
class 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+
198210
class 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+
209222
class 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+
220234
class 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+
231246
class 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+
269285
class 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+
292309
class 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

discord/types/member.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Nickname(TypedDict):
3535

3636
class PartialMember(TypedDict):
3737
roles: SnowflakeList
38-
joined_at: str
38+
joined_at: str | None
3939
deaf: bool
4040
mute: bool
4141

0 commit comments

Comments
 (0)