diff options
author | 2022-04-22 03:05:39 +0300 | |
---|---|---|
committer | 2022-04-22 03:05:39 +0300 | |
commit | 2b2dc95f2aa2ac6606b51be183861f2663be3b3e (patch) | |
tree | e2f2ba0b3f6a07c33688d38a295875e102da4f61 | |
parent | Merge pull request #2133 from python-discord/slowmode/add-better-thread-support (diff) |
Make modpings rescheduling robust to unfilled cache
Additionally, this adds a check which will remove entries in the redis cache of former moderators.
-rw-r--r-- | bot/exts/moderation/modpings.py | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/bot/exts/moderation/modpings.py b/bot/exts/moderation/modpings.py index e82099c88..bdefea91b 100644 --- a/bot/exts/moderation/modpings.py +++ b/bot/exts/moderation/modpings.py @@ -13,6 +13,7 @@ from bot.constants import Colours, Emojis, Guild, Icons, MODERATION_ROLES, Roles from bot.converters import Expiry from bot.log import get_logger from bot.utils import time +from bot.utils.members import get_or_fetch_member log = get_logger(__name__) @@ -57,18 +58,29 @@ class ModPings(Cog): log.trace("Applying the moderators role to the mod team where necessary.") for mod in mod_team.members: - if mod in pings_on: # Make sure that on-duty mods aren't in the cache. + if mod in pings_on: # Make sure that on-duty mods aren't in the redis cache. if mod.id in pings_off: await self.pings_off_mods.delete(mod.id) continue - # Keep the role off only for those in the cache. + # Keep the role off only for those in the redis cache. if mod.id not in pings_off: await self.reapply_role(mod) else: expiry = isoparse(pings_off[mod.id]) self._role_scheduler.schedule_at(expiry, mod.id, self.reapply_role(mod)) + # At this stage every entry in `pings_off` is expected to have a scheduled task, but that might not be the case + # if the discord.py cache is missing members, or if the ID belongs to a former moderator. + for mod_id, expiry_iso in pings_off.items(): + if mod_id not in self._role_scheduler: + mod = await get_or_fetch_member(self.guild, mod_id) + # Make sure the member is still a moderator and doesn't have the pingable role. + if mod is None or mod.get_role(Roles.mod_team) is None or mod.get_role(Roles.moderators) is not None: + await self.pings_off_mods.delete(mod_id) + else: + self._role_scheduler.schedule_at(isoparse(expiry_iso), mod_id, self.reapply_role(mod)) + async def reschedule_modpings_schedule(self) -> None: """Reschedule moderators schedule ping.""" await self.bot.wait_until_guild_available() |