Skip to content

Commit

Permalink
Add improved configuration variables for task intervals & reminder de…
Browse files Browse the repository at this point in the history
…lays
  • Loading branch information
CarrotManMatt committed May 14, 2024
1 parent 104489e commit 8f65658
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 53 deletions.
15 changes: 14 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ MESSAGES_FILE_PATH=messages.json
# One of: Once, Interval, False
SEND_INTRODUCTION_REMINDERS=Once

# How long to wait after a user joins your guild before sending them the first/only message remind them to send an introduction
# Is ignored if SEND_INTRODUCTION_REMINDERS=False
# Must be a string of the seconds, minutes, hours, days or weeks before the first/only reminder is sent (format: "<seconds>s<minutes>m<hours>h<days>d<weeks>w")
# The delay must be longer than or equal to 1 day (in any allowed format)
SEND_INTRODUCTION_REMINDERS_DELAY=40h

# The interval of time between sending out reminders to Discord members that are not inducted, saying that they need to send an introduction to be allowed access
# Is ignored if SEND_INTRODUCTION_REMINDERS=Once or SEND_INTRODUCTION_REMINDERS=False
# Must be a string of the seconds, minutes or hours between reminders (format: "<seconds>s<minutes>m<hours>h")
Expand All @@ -68,10 +74,17 @@ SEND_INTRODUCTION_REMINDERS_INTERVAL=6h
# Must be a boolean (True or False)
SEND_GET_ROLES_REMINDERS=True

# How long to wait after a user is inducted before sending them the message to get some opt-in roles
# Is ignored if SEND_GET_ROLES_REMINDERS=False
# Must be a string of the seconds, minutes, hours, days or weeks before a reminder is sent (format: "<seconds>s<minutes>m<hours>h<days>d<weeks>w")
# The delay must be longer than or equal to 1 day (in any allowed format)
SEND_GET_ROLES_REMINDERS_DELAY=40h

# !!This is an advanced configuration variable, so is unlikely to need to be changed from its default value!!
# The interval of time between sending out reminders to Discord members that have been inducted, saying that they can get opt-in roles. (This message will be only sent once, the interval is just how often the check for new guests occurs)
# Is ignored if SEND_GET_ROLES_REMINDERS=False
# Must be a string of the seconds, minutes or hours between reminders (format: "<seconds>s<minutes>m<hours>h")
SEND_GET_ROLES_REMINDERS_INTERVAL=24h
ADVANCED_SEND_GET_ROLES_REMINDERS_INTERVAL=24h


# The number of days to look over messages sent, to generate statistics data
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,10 @@ The [configuration variables](https://wikipedia.org/wiki/Environment_variable) `
However, because these are rather annoying/drastic actions to be executed automatically, there are additional conditions that must be met on a per-[member](https://discord.com/developers/docs/resources/guild#guild-member-object) basis for the action to trigger.
The conditions for each [task](https://docs.pycord.dev/en/stable/ext/tasks) are listed below, along with the additional [environment variables](https://wikipedia.org/wiki/Environment_variable) that can be used to configure the conditions to suit your needs.

| Task Name | Enable/Disable | Per-Member Conditions | Scheduled Interval |
|----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `introduction_reminder` | `SEND_INTRODUCTION_REMINDERS`:<br/>* `Once` - Only send the introduction reminder once (even if they later delete the message)<br/>* `Interval` - Send an introduction reminder at a set interval<br/>* `False` - Do not send introduction reminders | * The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not been inducted (does not have the "@**Guest**" [role](https://discord.com/developers/docs/topics/permissions#role-object))<br/>* The time since the [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) joined is greater than the maximum out of 1 day or one third of `KICK_NO_INTRODUCTION_DISCORD_MEMBERS_DELAY`<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not opted out of introduction reminders<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not yet been sent an introduction reminder. (Only applies when `SEND_INTRODUCTION_REMINDERS` is set to the value `Once`) | The interval of time between this task running is determined by `SEND_INTRODUCTION_REMINDERS_INTERVAL`. (When `SEND_INTRODUCTION_REMINDERS` is set to the value `Once`, all [Discord members](https://discord.com/developers/docs/resources/guild#guild-member-object) will still be checked at this interval, just not sent a message if they have already been sent an introduction reminder) |
| `get_roles_reminder` | `SEND_GET_ROLES_REMINDERS`:<br/>* `True` - A single reminder for the [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) to get [roles](https://discord.com/developers/docs/topics/permissions#role-object) will be sent to them only once (even if they later delete the message)<br/>* `False` - Do not send any reminders for [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) to get [roles](https://discord.com/developers/docs/topics/permissions#role-object) | * The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has been inducted (has the "@**Guest**" [role](https://discord.com/developers/docs/topics/permissions#role-object))<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) does not have any of the opt-in [roles](https://discord.com/developers/docs/topics/permissions#role-object). (E.g. "@**First Year**" or "@**Anime**".) (Having the green "@**Member**" [role](https://discord.com/developers/docs/topics/permissions#role-object) or even the "@**Committee**" [role](https://discord.com/developers/docs/topics/permissions#role-object) makes no difference)<br/>* The time since the [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) was inducted (gained the "@**Guest**" [role](https://discord.com/developers/docs/topics/permissions#role-object)) is greater than 1 day<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not yet been sent a reminder to get [roles](https://discord.com/developers/docs/topics/permissions#role-object) | The interval of time between this task running is determined by `SEND_GET_ROLES_REMINDERS_INTERVAL` |
| Task Name | Enable/Disable | Per-Member Conditions | Scheduled Interval |
|-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `introduction_reminder` | `SEND_INTRODUCTION_REMINDERS`:<br/>* `Once` - Only send the introduction reminder once (even if they later delete the message)<br/>* `Interval` - Send an introduction reminder at a set interval<br/>* `False` - Do not send introduction reminders | * The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not been inducted (does not have the "@**Guest**" [role](https://discord.com/developers/docs/topics/permissions#role-object))<br/>* The time since the [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) joined your community's guild is greater than `SEND_INTRODUCTION_REMINDERS_DELAY`<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not opted out of introduction reminders<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not yet been sent an introduction reminder. (Only applies when `SEND_INTRODUCTION_REMINDERS` is set to the value `Once`) | The interval of time between this task running is determined by `SEND_INTRODUCTION_REMINDERS_INTERVAL`. (When `SEND_INTRODUCTION_REMINDERS` is set to the value `Once`, all [Discord members](https://discord.com/developers/docs/resources/guild#guild-member-object) will still be checked at this interval, just not sent a message if they have already been sent an introduction reminder). The default interval is to send messages every 6 hours |
| `get_roles_reminder` | `SEND_GET_ROLES_REMINDERS`:<br/>* `True` - A single reminder for the [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) to get [roles](https://discord.com/developers/docs/topics/permissions#role-object) will be sent to them only once (even if they later delete the message)<br/>* `False` - Do not send any reminders for [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) to get [roles](https://discord.com/developers/docs/topics/permissions#role-object) | * The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has been inducted (has the "@**Guest**" [role](https://discord.com/developers/docs/topics/permissions#role-object))<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) does not have any of the opt-in [roles](https://discord.com/developers/docs/topics/permissions#role-object). (E.g. "@**First Year**" or "@**Anime**".) (Having the green "@**Member**" [role](https://discord.com/developers/docs/topics/permissions#role-object) or even the "@**Committee**" [role](https://discord.com/developers/docs/topics/permissions#role-object) makes no difference)<br/>* The time since the [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) was inducted (gained the "@**Guest**" [role](https://discord.com/developers/docs/topics/permissions#role-object)) is greater than `SEND_GET_ROLES_REMINDERS_DELAY`<br/>* The [Discord member](https://discord.com/developers/docs/resources/guild#guild-member-object) has not yet been sent a reminder to get [roles](https://discord.com/developers/docs/topics/permissions#role-object) | The interval of time between this task running is determined by `ADVANCED_SEND_GET_ROLES_REMINDERS_INTERVAL`. It is unlikely that this value will need to be changed from the default of 24 hours |

## Deploying in Production

Expand Down
6 changes: 3 additions & 3 deletions cogs/send_get_roles_reminders.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def cog_unload(self) -> None:
"""
self.send_get_roles_reminders.cancel()

@tasks.loop(**settings["SEND_GET_ROLES_REMINDERS_INTERVAL"]) # type: ignore[misc]
@tasks.loop(**settings["ADVANCED_SEND_GET_ROLES_REMINDERS_INTERVAL"]) # type: ignore[misc]
@functools.partial(
ErrorCaptureDecorators.capture_error_and_close,
error_type=GuestRoleDoesNotExistError,
Expand Down Expand Up @@ -147,9 +147,9 @@ async def send_get_roles_reminders(self) -> None:

if guest_role_received_time is not None:
time_since_role_received: datetime.timedelta = (
discord.utils.utcnow() - guest_role_received_time
discord.utils.utcnow() - guest_role_received_time
)
if time_since_role_received <= datetime.timedelta(days=1):
if time_since_role_received <= settings["SEND_GET_ROLES_REMINDERS_DELAY"]:
continue

if member not in guild.members: # HACK: Caching errors can cause the member to no longer be part of the guild at this point, so this check must be performed before sending that member a message # noqa: FIX004
Expand Down
Loading

0 comments on commit 8f65658

Please sign in to comment.