aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/cogs/verification.py17
1 files changed, 16 insertions, 1 deletions
diff --git a/bot/cogs/verification.py b/bot/cogs/verification.py
index d5216c7c0..196808b0d 100644
--- a/bot/cogs/verification.py
+++ b/bot/cogs/verification.py
@@ -87,6 +87,14 @@ MENTION_UNVERIFIED = discord.AllowedMentions(roles=[discord.Object(constants.Rol
Request = t.Callable[[discord.Member], t.Awaitable]
+class StopExecution(Exception):
+ """Signals that a task should halt immediately & alert admins."""
+
+ def __init__(self, reason: discord.HTTPException) -> None:
+ super().__init__()
+ self.reason = reason
+
+
class Limit(t.NamedTuple):
"""Composition over config for throttling requests."""
@@ -277,6 +285,9 @@ class Verification(Cog):
continue
try:
await request(member)
+ except StopExecution as stop_execution:
+ await self._alert_admins(stop_execution.reason)
+ break
except discord.HTTPException as http_exc:
bad_statuses.add(http_exc.status)
else:
@@ -304,8 +315,12 @@ class Verification(Cog):
async def kick_request(member: discord.Member) -> None:
"""Send `KICKED_MESSAGE` to `member` and kick them from the guild."""
- with suppress(discord.Forbidden):
+ try:
await member.send(KICKED_MESSAGE)
+ except discord.Forbidden as exc_403:
+ log.trace(f"DM dispatch failed on 403 error with code: {exc_403.code}")
+ if exc_403.code != 50_007: # 403 raised for any other reason than disabled DMs
+ raise StopExecution(reason=exc_403)
await member.kick(reason=f"User has not verified in {KICKED_AFTER} days")
n_kicked = await self._send_requests(members, kick_request, Limit(batch_size=2, sleep_secs=1))