aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar kwzrd <[email protected]>2020-09-10 18:41:07 +0200
committerGravatar kwzrd <[email protected]>2020-09-10 19:04:56 +0200
commit1b3a5c5d90bb658895fea8a2bed91366d2f2f76e (patch)
treeeafad5c7f2cc8a409384a3db8a6b5bf29a29eafc
parentVerification: set 'tasks_running' to 0 on suspicious 403s (diff)
Verification: move constants to config
-rw-r--r--bot/cogs/verification.py45
-rw-r--r--bot/constants.py10
-rw-r--r--config-default.yml13
3 files changed, 43 insertions, 25 deletions
diff --git a/bot/cogs/verification.py b/bot/cogs/verification.py
index 08f7c282e..0092a0898 100644
--- a/bot/cogs/verification.py
+++ b/bot/cogs/verification.py
@@ -18,16 +18,6 @@ from bot.utils.redis_cache import RedisCache
log = logging.getLogger(__name__)
-UNVERIFIED_AFTER = 3 # Amount of days after which non-Developers receive the @Unverified role
-KICKED_AFTER = 30 # Amount of days after which non-Developers get kicked from the guild
-
-# Number in range [0, 1] determining the percentage of unverified users that are safe
-# to be kicked from the guild in one batch, any larger amount will require staff confirmation,
-# set this to 0 to require explicit approval for batches of any size
-KICK_CONFIRMATION_THRESHOLD = 0.01 # 1%
-
-BOT_MESSAGE_DELETE_DELAY = 10
-
# Sent via DMs once user joins the guild
ON_JOIN_MESSAGE = f"""
Hello! Welcome to Python Discord!
@@ -62,7 +52,7 @@ If you'd like to unsubscribe from the announcement notifications, simply send `!
# Sent via DMs to users kicked for failing to verify
KICKED_MESSAGE = f"""
Hi! You have been automatically kicked from Python Discord as you have failed to accept our rules \
-within `{KICKED_AFTER}` days. If this was an accident, please feel free to join us again!
+within `{constants.Verification.kicked_after}` days. If this was an accident, please feel free to join us again!
{constants.Guild.invite}
"""
@@ -74,11 +64,9 @@ REMINDER_MESSAGE = f"""
Welcome to Python Discord! Please read the documents mentioned above and type `!accept` to gain permissions \
to send messages in the community!
-You will be kicked if you don't verify within `{KICKED_AFTER}` days.
+You will be kicked if you don't verify within `{constants.Verification.kicked_after}` days.
""".strip()
-REMINDER_FREQUENCY = 28 # Hours to wait between sending `REMINDER_MESSAGE`
-
# An async function taking a Member param
Request = t.Callable[[discord.Member], t.Awaitable]
@@ -209,7 +197,7 @@ class Verification(Cog):
pydis = self.bot.get_guild(constants.Guild.id)
percentage = n_members / len(pydis.members)
- if percentage < KICK_CONFIRMATION_THRESHOLD:
+ if percentage < constants.Verification.kick_confirmation_threshold:
log.debug(f"Kicking {percentage:.2%} of the guild's population is seen as safe")
return True
@@ -221,7 +209,8 @@ class Verification(Cog):
confirmation_msg = await core_dev_channel.send(
f"{core_dev_ping} Verification determined that `{n_members}` members should be kicked as they haven't "
- f"verified in `{KICKED_AFTER}` days. This is `{percentage:.2%}` of the guild's population. Proceed?",
+ f"verified in `{constants.Verification.kicked_after}` days. This is `{percentage:.2%}` of the guild's "
+ f"population. Proceed?",
allowed_mentions=mention_role(constants.Roles.core_developers),
)
@@ -333,7 +322,7 @@ class Verification(Cog):
Note that this is a potentially destructive operation. Returns the amount of successful requests.
"""
- log.info(f"Kicking {len(members)} members from the guild (not verified after {KICKED_AFTER} days)")
+ log.info(f"Kicking {len(members)} members (not verified after {constants.Verification.kicked_after} days)")
async def kick_request(member: discord.Member) -> None:
"""Send `KICKED_MESSAGE` to `member` and kick them from the guild."""
@@ -343,7 +332,7 @@ class Verification(Cog):
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")
+ await member.kick(reason=f"User has not verified in {constants.Verification.kicked_after} days")
n_kicked = await self._send_requests(members, kick_request, Limit(batch_size=2, sleep_secs=1))
self.bot.stats.incr("verification.kicked", count=n_kicked)
@@ -358,11 +347,14 @@ class Verification(Cog):
Returns the amount of successful requests.
"""
- log.info(f"Assigning {role} role to {len(members)} members (not verified after {UNVERIFIED_AFTER} days)")
+ log.info(
+ f"Assigning {role} role to {len(members)} members (not verified "
+ f"after {constants.Verification.unverified_after} days)"
+ )
async def role_request(member: discord.Member) -> None:
"""Add `role` to `member`."""
- await member.add_roles(role, reason=f"User has not verified in {UNVERIFIED_AFTER} days")
+ await member.add_roles(role, reason=f"Not verified after {constants.Verification.unverified_after} days")
return await self._send_requests(members, role_request, Limit(batch_size=25, sleep_secs=1))
@@ -397,10 +389,13 @@ class Verification(Cog):
# to do with them based on time passed since their join date
since_join = current_dt - member.joined_at
- if since_join > timedelta(days=KICKED_AFTER):
+ if since_join > timedelta(days=constants.Verification.kicked_after):
for_kick.add(member) # User should be removed from the guild
- elif since_join > timedelta(days=UNVERIFIED_AFTER) and unverified not in member.roles:
+ elif (
+ since_join > timedelta(days=constants.Verification.unverified_after)
+ and unverified not in member.roles
+ ):
for_role.add(member) # User should be given the @Unverified role
log.debug(f"Found {len(for_role)} users for {unverified} role, {len(for_kick)} users to be kicked")
@@ -445,7 +440,7 @@ class Verification(Cog):
# endregion
# region: periodically ping @Unverified
- @tasks.loop(hours=REMINDER_FREQUENCY)
+ @tasks.loop(hours=constants.Verification.reminder_frequency)
async def ping_unverified(self) -> None:
"""
Delete latest `REMINDER_MESSAGE` and send it again.
@@ -488,7 +483,7 @@ class Verification(Cog):
time_since = datetime.utcnow() - snowflake_time(last_reminder)
log.trace(f"Time since latest verification reminder: {time_since}")
- to_sleep = timedelta(hours=REMINDER_FREQUENCY) - time_since
+ to_sleep = timedelta(hours=constants.Verification.reminder_frequency) - time_since
log.trace(f"Time to sleep until next ping: {to_sleep}")
# Delta can be negative if `REMINDER_FREQUENCY` has already passed
@@ -519,7 +514,7 @@ class Verification(Cog):
if message.author.bot:
# They're a bot, delete their message after the delay.
- await message.delete(delay=BOT_MESSAGE_DELETE_DELAY)
+ await message.delete(delay=constants.Verification.bot_message_delete_delay)
return
# if a user mentions a role or guild member
diff --git a/bot/constants.py b/bot/constants.py
index daef6c095..820828a19 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -589,6 +589,16 @@ class PythonNews(metaclass=YAMLGetter):
webhook: int
+class Verification(metaclass=YAMLGetter):
+ section = "verification"
+
+ unverified_after: int
+ kicked_after: int
+ reminder_frequency: int
+ bot_message_delete_delay: int
+ kick_confirmation_threshold: float
+
+
class Event(Enum):
"""
Event names. This does not include every event (for example, raw
diff --git a/config-default.yml b/config-default.yml
index a98fd14ef..c89695bd9 100644
--- a/config-default.yml
+++ b/config-default.yml
@@ -493,5 +493,18 @@ python_news:
channel: *PYNEWS_CHANNEL
webhook: *PYNEWS_WEBHOOK
+
+verification:
+ unverified_after: 3 # Days after which non-Developers receive the @Unverified role
+ kicked_after: 30 # Days after which non-Developers get kicked from the guild
+ reminder_frequency: 28 # Hours between @Unverified pings
+ bot_message_delete_delay: 10 # Seconds before deleting bots response in #verification
+
+ # Number in range [0, 1] determining the percentage of unverified users that are safe
+ # to be kicked from the guild in one batch, any larger amount will require staff confirmation,
+ # set this to 0 to require explicit approval for batches of any size
+ kick_confirmation_threshold: 0.01 # 1%
+
+
config:
required_keys: ['bot.token']