55import discord # isort:skip
66import typing # isort:skip
77
8- import datetime
98import asyncio
9+ import datetime
1010import re
1111from collections import defaultdict
1212
@@ -111,9 +111,9 @@ async def cog_unload(self) -> None:
111111 async def _startup_resync (self ) -> None :
112112 await self .bot .wait_until_ready ()
113113 for guild in self .bot .guilds :
114- if not await self .config .guild (guild ). enabled () or await self . bot . cog_disabled_in_guild (
115- self , guild
116- ):
114+ if not await self .config .guild (
115+ guild
116+ ). enabled () or await self . bot . cog_disabled_in_guild ( self , guild ) :
117117 continue
118118 try :
119119 await self .sync_guild_roles (guild )
@@ -141,7 +141,10 @@ async def get_role(
141141 return role
142142
143143 async def get_embed (
144- self , member : discord .Member , _type : typing .Literal ["tag" , "status" ], enabled : bool = True
144+ self ,
145+ member : discord .Member ,
146+ _type : typing .Literal ["tag" , "status" ],
147+ enabled : bool = True ,
145148 ) -> discord .Embed :
146149 embed : discord .Embed = discord .Embed (
147150 title = (
@@ -166,11 +169,16 @@ async def get_embed(
166169 embed .description = _ (
167170 "{member.mention} has been removed from the **{role.mention}** role for no longer being a server supporter."
168171 ).format (member = member , role = role , _type = _type )
169- embed .set_footer (text = member .guild .name , icon_url = get_non_animated_asset (member .guild .icon ))
172+ embed .set_footer (
173+ text = member .guild .name , icon_url = get_non_animated_asset (member .guild .icon )
174+ )
170175 return embed
171176
172177 async def log (
173- self , member : discord .Member , _type : typing .Literal ["tag" , "status" ], enabled : bool = True
178+ self ,
179+ member : discord .Member ,
180+ _type : typing .Literal ["tag" , "status" ],
181+ enabled : bool = True ,
174182 ) -> None :
175183 if (logs_channel_id := await self .config .guild (member .guild ).logs_channel ()) is None or (
176184 logs_channel := member .guild .get_channel_or_thread (logs_channel_id )
@@ -209,7 +217,10 @@ async def log(
209217 )
210218
211219 async def update_roles (
212- self , member : discord .Member , _type : typing .Literal ["tag" , "status" ], should_have_role : bool
220+ self ,
221+ member : discord .Member ,
222+ _type : typing .Literal ["tag" , "status" ],
223+ should_have_role : bool ,
213224 ) -> bool :
214225 if (role := await self .get_role (member , _type )) is None :
215226 return False
@@ -239,7 +250,9 @@ async def update_roles(
239250 )
240251 return False
241252
242- async def check_invites_in_status (self , guild : discord .Guild , status : typing .Optional [str ]) -> bool :
253+ async def check_invites_in_status (
254+ self , guild : discord .Guild , status : typing .Optional [str ]
255+ ) -> bool :
243256 if not status :
244257 return False
245258 invite_codes = {
@@ -366,38 +379,41 @@ async def on_presence_update(self, before: discord.Member, after: discord.Member
366379 self .cache .pop (after , None )
367380
368381 @commands .Cog .listener ()
369- async def on_member_update (
370- self ,
371- before : discord .Member ,
372- after : discord .Member ,
373- user_payload : typing .Optional [typing .Dict [str , typing .Any ]] = None ,
374- ) -> None :
382+ async def on_user_update (self , before : discord .User , after : discord .User ) -> None :
375383 if after .bot :
376384 return
377- if (
378- not await self .config .guild (after .guild ).enabled ()
379- or await self .bot .cog_disabled_in_guild (self , after .guild )
380- or (tag_supporter_role := await self .get_role (after , "tag" )) is None
385+ before_pg = before .primary_guild
386+ after_pg = after .primary_guild
387+ if before_pg == after_pg or (
388+ before_pg is not None
389+ and after_pg is not None
390+ and before_pg .id == after_pg .id
391+ and before_pg .identity_enabled == after_pg .identity_enabled
381392 ):
382393 return
383- if self .cache [after ]:
384- return
385- self .cache [after ] = True
386394
387- try :
388- if discord .version_info >= (2 , 6 , 0 ):
389- before_qualifies = await self .check (before , "tag" )
390- after_qualifies = await self .check (after , "tag" )
391- else :
392- before_qualifies = tag_supporter_role in before .roles
393- after_qualifies = await self .check (after , "tag" , user_payload )
394- if before_qualifies == after_qualifies :
395- return
396- role_changed = await self .update_roles (after , "tag" , after_qualifies )
397- if role_changed :
398- await self .log (after , "tag" , after_qualifies )
399- finally :
400- self .cache .pop (after , None )
395+ for guild in self .bot .guilds :
396+ if not await self .config .guild (
397+ guild
398+ ).enabled () or await self .bot .cog_disabled_in_guild (self , guild ):
399+ continue
400+ if (member := guild .get_member (after .id )) is None :
401+ continue
402+ if (role := await self .get_role (member , "tag" )) is None :
403+ continue
404+ if self .cache [member ]:
405+ continue
406+ self .cache [member ] = True
407+ try :
408+ before_qualifies = role in member .roles
409+ after_qualifies = await self .check (member , "tag" )
410+ if before_qualifies == after_qualifies :
411+ continue
412+ role_changed = await self .update_roles (member , "tag" , after_qualifies )
413+ if role_changed :
414+ await self .log (member , "tag" , after_qualifies )
415+ finally :
416+ self .cache .pop (member , None )
401417
402418 @commands .admin_or_permissions (manage_guild = True , manage_roles = True )
403419 @commands .bot_has_guild_permissions (manage_roles = True )
@@ -414,8 +430,7 @@ async def listsupporters(
414430 if _type == "tag" :
415431 if discord .version_info >= (2 , 6 , 0 ):
416432 members = [
417- member for member in ctx .guild .members
418- if await self .check (member , "tag" )
433+ member for member in ctx .guild .members if await self .check (member , "tag" )
419434 ]
420435 else :
421436 retrieve , after = 1000 , discord .guild .OLDEST_OBJECT
@@ -438,8 +453,7 @@ async def listsupporters(
438453 break
439454 else :
440455 members = [
441- member for member in ctx .guild .members
442- if await self .check (member , "status" )
456+ member for member in ctx .guild .members if await self .check (member , "status" )
443457 ]
444458 embed : discord .Embed = discord .Embed (
445459 title = _ ("{count} Server {_type} Supporter{s}" ).format (
@@ -467,4 +481,6 @@ async def forceupdate(self, ctx: commands.Context) -> None:
467481 _ ("The Server Supporters system is not enabled." )
468482 )
469483 updated_count = await self .sync_guild_roles (ctx .guild )
470- await ctx .send (_ ("Force update complete. {count} role changes made." ).format (count = updated_count ))
484+ await ctx .send (
485+ _ ("Force update complete. {count} role changes made." ).format (count = updated_count )
486+ )
0 commit comments