4343 Union ,
4444)
4545
46+ from discord .app .event_emitter import EventEmitter
47+
4648from .cache import Cache
4749
4850from .. import utils
@@ -186,6 +188,7 @@ def __init__(
186188 self .application_id : int | None = utils ._get_as_snowflake (
187189 options , "application_id"
188190 )
191+ self .application_flags : ApplicationFlags | None = None
189192 self .heartbeat_timeout : float = options .get ("heartbeat_timeout" , 60.0 )
190193 self .guild_ready_timeout : float = options .get ("guild_ready_timeout" , 2.0 )
191194 if self .guild_ready_timeout < 0 :
@@ -256,10 +259,7 @@ def __init__(
256259
257260 self .cache_app_emojis : bool = options .get ("cache_app_emojis" , False )
258261
259- self .parsers = parsers = {}
260- for attr , func in inspect .getmembers (self ):
261- if attr .startswith ("parse_" ):
262- parsers [attr [6 :].upper ()] = func
262+ self .emitter = EventEmitter (self )
263263
264264 self .cache : Cache = self .cache
265265
@@ -268,13 +268,13 @@ def clear(self, *, views: bool = True) -> None:
268268 self .cache .clear ()
269269 self ._voice_clients : dict [int , VoiceClient ] = {}
270270
271- def process_chunk_requests (
271+ async def process_chunk_requests (
272272 self , guild_id : int , nonce : str | None , members : list [Member ], complete : bool
273273 ) -> None :
274274 removed = []
275275 for key , request in self ._chunk_requests .items ():
276276 if request .guild_id == guild_id and request .nonce == nonce :
277- request .add_members (members )
277+ await request .add_members (members )
278278 if complete :
279279 request .done ()
280280 removed .append (key )
@@ -524,175 +524,6 @@ async def query_members(
524524 )
525525 raise
526526
527- async def _delay_ready (self ) -> None :
528-
529- if self .cache_app_emojis and self .application_id :
530- data = await self .http .get_all_application_emojis (self .application_id )
531- for e in data .get ("items" , []):
532- await self .maybe_store_app_emoji (self .application_id , e )
533- try :
534- states = []
535- while True :
536- # this snippet of code is basically waiting N seconds
537- # until the last GUILD_CREATE was sent
538- try :
539- guild = await asyncio .wait_for (
540- self ._ready_state .get (), timeout = self .guild_ready_timeout
541- )
542- except asyncio .TimeoutError :
543- break
544- else :
545- if self ._guild_needs_chunking (guild ):
546- future = await self .chunk_guild (guild , wait = False )
547- states .append ((guild , future ))
548- elif guild .unavailable is False :
549- self .dispatch ("guild_available" , guild )
550- else :
551- self .dispatch ("guild_join" , guild )
552-
553- for guild , future in states :
554- try :
555- await asyncio .wait_for (future , timeout = 5.0 )
556- except asyncio .TimeoutError :
557- _log .warning (
558- "Shard ID %s timed out waiting for chunks for guild_id %s." ,
559- guild .shard_id ,
560- guild .id ,
561- )
562-
563- if guild .unavailable is False :
564- self .dispatch ("guild_available" , guild )
565- else :
566- self .dispatch ("guild_join" , guild )
567-
568- # remove the state
569- try :
570- del self ._ready_state
571- except AttributeError :
572- pass # already been deleted somehow
573-
574- except asyncio .CancelledError :
575- pass
576- else :
577- # dispatch the event
578- self .call_handlers ("ready" )
579- self .dispatch ("ready" )
580- finally :
581- self ._ready_task = None
582-
583- def parse_ready (self , data ) -> None :
584- if self ._ready_task is not None :
585- self ._ready_task .cancel ()
586-
587- self ._ready_state = asyncio .Queue ()
588- self .clear (views = False )
589- self .user = ClientUser (state = self , data = data ["user" ])
590- self .store_user (data ["user" ])
591-
592- if self .application_id is None :
593- try :
594- application = data ["application" ]
595- except KeyError :
596- pass
597- else :
598- self .application_id = utils ._get_as_snowflake (application , "id" )
599- # flags will always be present here
600- self .application_flags = ApplicationFlags ._from_value (application ["flags" ]) # type: ignore
601-
602- for guild_data in data ["guilds" ]:
603- self ._add_guild_from_data (guild_data )
604-
605- self .dispatch ("connect" )
606- self ._ready_task = asyncio .create_task (self ._delay_ready ())
607-
608- def parse_resumed (self , data ) -> None :
609- self .dispatch ("resumed" )
610-
611- def parse_application_command_permissions_update (self , data ) -> None :
612- # unsure what the implementation would be like
613- pass
614-
615- def parse_auto_moderation_rule_create (self , data ) -> None :
616- rule = AutoModRule (state = self , data = data )
617- self .dispatch ("auto_moderation_rule_create" , rule )
618-
619- def parse_auto_moderation_rule_update (self , data ) -> None :
620- # somehow get a 'before' object?
621- rule = AutoModRule (state = self , data = data )
622- self .dispatch ("auto_moderation_rule_update" , rule )
623-
624- def parse_auto_moderation_rule_delete (self , data ) -> None :
625- rule = AutoModRule (state = self , data = data )
626- self .dispatch ("auto_moderation_rule_delete" , rule )
627-
628- def parse_auto_moderation_action_execution (self , data ) -> None :
629- event = AutoModActionExecutionEvent (self , data )
630- self .dispatch ("auto_moderation_action_execution" , event )
631-
632- def parse_entitlement_create (self , data ) -> None :
633- event = Entitlement (data = data , state = self )
634- self .dispatch ("entitlement_create" , event )
635-
636- def parse_entitlement_update (self , data ) -> None :
637- event = Entitlement (data = data , state = self )
638- self .dispatch ("entitlement_update" , event )
639-
640- def parse_entitlement_delete (self , data ) -> None :
641- event = Entitlement (data = data , state = self )
642- self .dispatch ("entitlement_delete" , event )
643-
644- def parse_subscription_create (self , data ) -> None :
645- event = Subscription (data = data , state = self )
646- self .dispatch ("subscription_create" , event )
647-
648- def parse_subscription_update (self , data ) -> None :
649- event = Subscription (data = data , state = self )
650- self .dispatch ("subscription_update" , event )
651-
652- def parse_subscription_delete (self , data ) -> None :
653- event = Subscription (data = data , state = self )
654- self .dispatch ("subscription_delete" , event )
655-
656- def parse_message_create (self , data ) -> None :
657- channel , _ = self ._get_guild_channel (data )
658- # channel would be the correct type here
659- message = Message (channel = channel , data = data , state = self ) # type: ignore
660- self .dispatch ("message" , message )
661- if self ._messages is not None :
662- self ._messages .append (message )
663- # we ensure that the channel is either a TextChannel, VoiceChannel, StageChannel, or Thread
664- if channel and channel .__class__ in (
665- TextChannel ,
666- VoiceChannel ,
667- StageChannel ,
668- Thread ,
669- ):
670- channel .last_message_id = message .id # type: ignore
671-
672- def parse_message_delete (self , data ) -> None :
673- raw = RawMessageDeleteEvent (data )
674- found = self ._get_message (raw .message_id )
675- raw .cached_message = found
676- self .dispatch ("raw_message_delete" , raw )
677- if self ._messages is not None and found is not None :
678- self .dispatch ("message_delete" , found )
679- self ._messages .remove (found )
680-
681- def parse_message_delete_bulk (self , data ) -> None :
682- raw = RawBulkMessageDeleteEvent (data )
683- if self ._messages :
684- found_messages = [
685- message for message in self ._messages if message .id in raw .message_ids
686- ]
687- else :
688- found_messages = []
689- raw .cached_messages = found_messages
690- self .dispatch ("raw_bulk_message_delete" , raw )
691- if found_messages :
692- self .dispatch ("bulk_message_delete" , found_messages )
693- for msg in found_messages :
694- # self._messages won't be None here
695- self ._messages .remove (msg ) # type: ignore
696527
697528 def parse_message_update (self , data ) -> None :
698529 raw = RawMessageUpdateEvent (data )
0 commit comments