@@ -49,6 +49,14 @@ def _fill_optional(
4949) -> None : ...
5050
5151
52+ @overload
53+ def _fill_optional (
54+ data : _types .gateway .GuildMemberUpdateEvent ,
55+ obj : discord .Member | dict [str , object ],
56+ items : Iterable [str ]
57+ ) -> None : ...
58+
59+
5260@overload
5361def _fill_optional (
5462 data : _types .guild .Guild ,
@@ -95,17 +103,36 @@ def _fill_optional( # type: ignore[misc]
95103 items : Iterable [str ]
96104) -> None :
97105 if isinstance (obj , dict ):
98- for item in items :
99- result = obj .pop (item , None )
100- if result is None :
101- continue
102- data [item ] = result
103- if len (obj ) > 0 :
104- print ("Warning: Invalid attributes passed" )
106+ _fill_optional_dict (data , obj , items )
105107 else :
106- for item in items :
107- if hasattr (obj , item ):
108- data [item ] = getattr (obj , item )
108+ _fill_optional_value (data , obj , items )
109+
110+
111+ def _fill_optional_dict (
112+ data : dict [str , object ],
113+ obj : dict [str , object ],
114+ items : Iterable [str ],
115+ ) -> None :
116+ for item in items :
117+ result = obj .pop (item , None )
118+ if result is None :
119+ continue
120+ data [item ] = result
121+ if len (obj ) > 0 :
122+ print ("Warning: Invalid attributes passed" )
123+
124+
125+ def _fill_optional_value (
126+ data : dict [str , object ],
127+ obj : object ,
128+ items : Iterable [str ],
129+ ) -> None :
130+ for item in items :
131+ if item == "permissions" :
132+ print ()
133+ if (val := getattr (obj , item , None )) is None and (val := getattr (obj , f"_{ item } " , None )) is None :
134+ continue
135+ data [item ] = val
109136
110137
111138def make_user_dict (username : str , discrim : str | int , avatar : str | None , id_num : int = - 1 , flags : int = 0 ,
@@ -125,7 +152,7 @@ def make_user_dict(username: str, discrim: str | int, avatar: str | None, id_num
125152 'avatar' : avatar ,
126153 'flags' : flags ,
127154 }
128- items = ("bot" , "mfa_enabled" , "locale" , "verified" , "email" , "premium_type" )
155+ items = ("bot" , "system" , " mfa_enabled" , "locale" , "verified" , "email" , "premium_type" , "public_flags " )
129156 _fill_optional (out , kwargs , items )
130157 return out
131158
@@ -147,7 +174,7 @@ def make_member_dict(
147174 'mute' : mute ,
148175 'flags' : flags ,
149176 }
150- items = ("nick" ,)
177+ items = ("avatar" , " nick" , "premium_since" , "pending" , "permissions" , "communication_disabled_until" , "avatar_decoration_data" )
151178 _fill_optional (out , kwargs , items )
152179 return out
153180
@@ -168,7 +195,11 @@ class DictFromObject(Protocol):
168195 @overload
169196 def __call__ (self , obj : discord .user .BaseUser ) -> _types .member .UserWithMember : ...
170197 @overload
171- def __call__ (self , obj : discord .Member ) -> _types .member .MemberWithUser : ...
198+ def __call__ (self , obj : discord .Member , * , guild : Literal [False ] = ...) -> _types .member .MemberWithUser : ...
199+ @overload
200+ def __call__ (self , obj : discord .Member , * , guild : Literal [True ] = ...) -> _types .gateway .GuildMemberUpdateEvent : ...
201+ @overload
202+ def __call__ (self , obj : discord .Member , * , guild : bool = ...) -> _types .member .MemberWithUser | _types .gateway .GuildMemberUpdateEvent : ...
172203 @overload
173204 def __call__ (self , obj : discord .Role ) -> _types .role .Role : ...
174205
@@ -238,21 +269,36 @@ def _from_base_user(user: discord.user.BaseUser) -> _types.member.UserWithMember
238269
239270
240271@dict_from_object .register (discord .Member )
241- def _from_member (member : discord .Member ) -> _types .member .MemberWithUser :
272+ def _from_member (member : discord .Member , * , guild : bool = False ) -> _types .member .MemberWithUser | _types . gateway . GuildMemberUpdateEvent :
242273 # discord code adds default role to every member later on in Member constructor
243274 roles_no_default = list (filter (lambda r : not r == member .guild .default_role , member .roles ))
244- out : _types .member .MemberWithUser = {
245- 'guild_id' : member .guild .id , # type: ignore[typeddict-unknown-key]
246- 'user' : dict_from_object (member ._user ),
247- 'roles' : list (map (lambda role : int (role .id ), roles_no_default )),
248- 'joined_at' : str (int (member .joined_at .timestamp ())) if member .joined_at else None ,
249- 'flags' : member .flags .value ,
250- 'deaf' : member .voice .deaf if member .voice else False ,
251- 'mute' : member .voice .mute if member .voice else False ,
252- }
253- items = ("nick" ,)
254- _fill_optional (out , member , items )
255- return out
275+ items : tuple [str , ...]
276+ if guild :
277+ out : _types .gateway .GuildMemberUpdateEvent = {
278+ 'guild_id' : member .guild .id ,
279+ 'user' : dict_from_object (member ._user ),
280+ 'avatar' : member .avatar .url if member .avatar else "" ,
281+ 'roles' : list (map (lambda role : int (role .id ), roles_no_default )),
282+ 'joined_at' : str (int (member .joined_at .timestamp ())) if member .joined_at else None ,
283+ 'flags' : member .flags .value ,
284+ 'deaf' : member .voice .deaf if member .voice else False ,
285+ 'mute' : member .voice .mute if member .voice else False ,
286+ }
287+ items = ("nick" , "premium_since" , "pending" , "permissions" , "communication_disabled_until" , "avatar_decoration_data" )
288+ _fill_optional (out , member , items )
289+ return out
290+ else :
291+ mem_user : _types .member .MemberWithUser = {
292+ 'user' : dict_from_object (member ._user ),
293+ 'roles' : list (map (lambda role : int (role .id ), roles_no_default )),
294+ 'joined_at' : str (int (member .joined_at .timestamp ())) if member .joined_at else None ,
295+ 'flags' : member .flags .value ,
296+ 'deaf' : member .voice .deaf if member .voice else False ,
297+ 'mute' : member .voice .mute if member .voice else False ,
298+ }
299+ items = ("avatar" , "nick" , "premium_since" , "pending" , "permissions" , "communication_disabled_until" , "avatar_decoration_data" )
300+ _fill_optional (mem_user , member , items )
301+ return mem_user
256302
257303
258304@dict_from_object .register (discord .Role )
0 commit comments