| Commit message (Collapse) | Author | Lines | 
 | 
 | 
 | 
This case is already covered by checking if at least one letter is included.
 | 
 | 
The tag fallback didn't convert tags, resulting in possible invalid tag names being passed to the `tags_get_command`. This makes sure they're valid and ignores the risen exception if they are not.
 | 
 | 
With only ascii and numbers being allowed to go through, possible values still included things like `$()` which don't match anything in `REGEX_NON_ALPHABET` from tags.py resulting in an error.
 | 
 | 
* Convert diff namedtuple to dict outside the dict comprehension
* Define long condition as a boolean instead of in the if statement
* Pass role and user dicts to aiohttp normally instead of unpacking
 | 
 | 
If a reminder is invalid, it won't get rescheduled. Therefore, there
wouldn't exist a task to cancel and it'd raise a warning.
Fixes BOT-1C
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
This is more visible than it would be if it was only logged.
* Add a webhook for the dev-log channel to constants
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
command context.
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
Explain changes caused by 22a55534ef13990815a6f69d361e2a12693075d5.
 | 
 | 
 | 
 | 
 | 
 | 
Changed the pagination emoji collection from list to tuple
This change was suggested since this collection is constant
 | 
 | 
NGINX has been dockerised, and proxy passes now reference internal container domains rather than referencing host or external domains.
This will have a few extra benefits:
 - Less external factors involved for resolving the service address
 - Can work with the same address on development envs
 - Snekbox can be closed down entirely so it's inaccessible from external networks.
 | 
 | 
Fixed by allocating a pseudo-tty to the web and bot services in Docker
Compose.
 | 
 | 
 | 
 | 
The bot user was always being used instead of using the actor field
of the infraction.
 | 
 | 
Closes #685
 | 
 | 
The absolute value is useful for preventing negative values in the case
that date_to is in the past relative to date_from.
* Add an absolute parameter to take the absolute value of the duration
* Rename expiry to date_to
* Rewrite the docstring
 | 
 | 
Co-Authored-By: Mark <[email protected]>
 | 
 | 
 | 
 | 
 | 
 | 
* Refactor confirmation embed footer string generation to be more concise
* Multiline long method calls
* Refactor humanized delta f string generation for readability
* Switch from `datetime.isoformat` to `dateutils.parser.isoparse` to align with changes elsewhere in the codebase (should be more robust)
* Shift reminder channel whitelist to constants
Co-Authored-By: Mark <[email protected]>
 | 
 | 
https://github.com/python-discord/bot/issues/751
The infraction edit command defined in `bot.cogs.moderation.management` contained a bug causing it to attempt to schedule an expiration task when turning a temporary infraction into a permanent infraction. Since the "expires_at" field of a permanent infractions is `None`, this caused an exception to occur in the scheduler:
Traceback (most recent call last):
  File "/bot/bot/cogs/moderation/scheduler.py", line 415, in _scheduled_task
    expiry = dateutil.parser.isoparse(infraction["expires_at"]).replace(tzinfo=None)
  File "/usr/local/lib/python3.7/site-packages/dateutil/parser/isoparser.py", line 37, in func
    return f(self, str_in, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/dateutil/parser/isoparser.py", line 134, in isoparse
    components, pos = self._parse_isodate(dt_str)
  File "/usr/local/lib/python3.7/site-packages/dateutil/parser/isoparser.py", line 208, in _parse_isodate
    return self._parse_isodate_common(dt_str)
  File "/usr/local/lib/python3.7/site-packages/dateutil/parser/isoparser.py", line 213, in _parse_isodate_common
    len_str = len(dt_str)
TypeError: object of type 'NoneType' has no len()
I have solved this by adding a check that makes sure we only schedule an expiration task when the `"expires_at"` field has a truthy value (which all valid datetime strings are) using `if request_data['expires_at']`.
IMPORTANT NOTE: While it's tempting to just skip the entire scheduling block for permanent infractions, it's essential to unschedule existing expiration tasks for this infraction as we're changing a temporary infraction to a permanent infraction.
This commit closes #751
 | 
 | 
 | 
 | 
 | 
 | 
Add channel ID to config files
 | 
 | 
 |