4545if TYPE_CHECKING :
4646 from ...client .context import _Context
4747 from ..cache import Storage
48+ from ..models .gw import GuildMembers
4849
4950log = get_logger ("gateway" )
5051
@@ -535,14 +536,25 @@ def _dispatch_event(self, event: str, data: dict) -> None:
535536
536537 self ._dispatch .dispatch (f"on_{ name } " , old_obj or obj )
537538
539+ elif "guild_members_chunk" in name :
540+ self .__modify_guild_cache (name , data , model , obj , ids = ids )
541+
542+ _member_cache : "Storage" = self ._http .cache [Member ]
543+ obj : GuildMembers
544+ for member in obj .members :
545+ member ._guild_id = obj .guild_id
546+ _member_cache .add (member , (obj .guild_id , member .id ))
547+
548+ self ._dispatch .dispatch (f"on_{ name } " , obj )
549+
538550 else :
539551 self ._dispatch .dispatch (f"on_{ name } " , obj )
540552
541553 except AttributeError as error :
542554 log .warning (f"An error occurred dispatching { name } : { error } " )
543555
544556 def __get_object_id (
545- self , data : dict , obj : Any , model : Any
557+ self , data : dict , obj : Any , model : type
546558 ) -> Optional [Union [Snowflake , Tuple [Snowflake , Snowflake ]]]:
547559 """
548560 Gets an ID from object.
@@ -552,7 +564,7 @@ def __get_object_id(
552564 :param obj: The object of the event.
553565 :type obj: Any
554566 :param model: The model of the event.
555- :type model: Any
567+ :type model: type
556568 :return: Object ID
557569 :rtype: Optional[Union[Snowflake, Tuple[Snowflake, Snowflake]]]
558570 """
@@ -581,14 +593,14 @@ def __get_object_id(
581593
582594 return id
583595
584- def __get_object_ids (self , obj : Any , model : Any ) -> Optional [List [Snowflake ]]:
596+ def __get_object_ids (self , obj : Any , model : type ) -> Optional [List [Snowflake ]]:
585597 """
586598 Gets a list of ids of object.
587599
588600 :param obj: The object of the event.
589601 :type obj: Any
590602 :param model: The model of the event.
591- :type model: Any
603+ :type model: type
592604 :return: Object IDs
593605 :rtype: Optional[Union[Snowflake, Tuple[Snowflake, Snowflake]]]
594606 """
@@ -648,7 +660,7 @@ def __modify_guild_cache(
648660 if iterable is not None and isinstance (iterable , list ):
649661 if "_create" in name or "_add" in name :
650662 iterable .append (obj )
651- if id :
663+ elif id :
652664 _id = id [1 ] if isinstance (id , tuple ) else id
653665 for index , __obj in enumerate (iterable ):
654666 if __obj .id == _id :
@@ -658,11 +670,19 @@ def __modify_guild_cache(
658670 elif "_update" in name and hasattr (obj , "id" ):
659671 iterable [index ] = obj
660672 break
661- elif ids is not None and "_update" in name :
662- objs = getattr (obj , attr , None )
663- if objs is not None :
673+ elif ids is not None and (objs := getattr (obj , attr , None )) is not None :
674+ if "_update" in name :
664675 iterable .clear ()
665676 iterable .extend (objs )
677+ elif "_chunk" in name :
678+ for _obj in objs :
679+ for index , __obj in enumerate (iterable ):
680+ if __obj .id == _obj .id :
681+ iterable [index ] = _obj
682+ break
683+ else :
684+ iterable .append (_obj )
685+
666686 setattr (guild , attr , iterable )
667687
668688 self ._http .cache [Guild ].add (guild )
@@ -1060,6 +1080,42 @@ async def _update_presence(self, presence: ClientPresence) -> None:
10601080 log .debug (f"UPDATE_PRESENCE: { presence ._json } " )
10611081 self .__presence = presence
10621082
1083+ async def request_guild_members (
1084+ self ,
1085+ guild_id : int ,
1086+ limit : int ,
1087+ query : Optional [str ] = None ,
1088+ presences : Optional [bool ] = None ,
1089+ user_ids : Optional [Union [int , List [int ]]] = None ,
1090+ nonce : Optional [str ] = None ,
1091+ ) -> None :
1092+ """Sends an ``REQUEST_MEMBERS`` packet to the gateway.
1093+
1094+ :param guild_id: ID of the guild to get members for.
1095+ :type guild_id: int
1096+ :param limit: Maximum number of members to send matching the 'query' parameter. Required when specifying 'query'.
1097+ :type limit: int
1098+ :param query: String that username starts with.
1099+ :type query: Optional[str]
1100+ :param presences: Used to specify if we want the presences of the matched members.
1101+ :type presences: Optional[bool]
1102+ :param user_ids: Used to specify which users you wish to fetch.
1103+ :type user_ids: Optional[Union[int, List[int]]]
1104+ :param nonce: Nonce to identify the Guild Members Chunk response.
1105+ :type nonce: Optional[str]
1106+ """
1107+ _data : dict = {"guild_id" : guild_id , "query" : query or "" , "limit" : limit }
1108+ if presences is not None :
1109+ _data ["presences" ] = presences
1110+ if user_ids is not None :
1111+ _data ["user_ids" ] = user_ids
1112+ if nonce is not None :
1113+ _data ["nonce" ] = nonce
1114+ payload : dict = {"op" : OpCodeType .REQUEST_MEMBERS .value , "d" : _data }
1115+
1116+ await self ._send_packet (payload )
1117+ log .debug (f"REQUEST_MEMBERS: { payload } " )
1118+
10631119 async def close (self ) -> None :
10641120 """
10651121 Closes the current connection.
0 commit comments