Skip to content

Commit 38c4c7d

Browse files
authored
[ServerSupporters] Fix tag role issue. (#113)
1 parent 2339cf1 commit 38c4c7d

2 files changed

Lines changed: 58 additions & 42 deletions

File tree

serversupporters/info.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
"status"
1212
],
1313
"requirements": ["git+https://github.com/AAA3A-AAA3A/AAA3A_utils.git"],
14-
"min_bot_version": "3.5.0",
14+
"min_bot_version": "3.5.21",
1515
"end_user_data_statement": "This cog does not persistently store data or metadata about users."
1616
}

serversupporters/serversupporters.py

Lines changed: 57 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import discord # isort:skip
66
import typing # isort:skip
77

8-
import datetime
98
import asyncio
9+
import datetime
1010
import re
1111
from 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

Comments
 (0)