|  | Commit message (Collapse) | Author | Lines | 
|---|
|  |  | 
|  | Discord has a built-in player for all of these and they are really just stripped down videos, which are allowed. | 
|  |  | 
|  | I have added attributes to the Emojis class in `bot.constants` for the newly added ducky emoji constants. | 
|  | I have added the IDs of the new duckies we have to the constants | 
|  | Also includes the following related formats:
- .svg
- .ai (Adobe Illustrator)
- .aep (Adobe After Effects)
- .xcf (GIMP | 
|  | It's important to us that we keep the information we have about users
in the database in sync with the actual user information the bot can
observe in our guild. To do this, we relied on the `on_member_update`
event listener to synchronize a user's information when an update of
the information was detected. However, unfortunately, this does not
work for user account information (i.e., the username, avatar, and
discriminator of the user).
The solution is to use the `on_user_update` event listener to watch
for updates in the user settings and to use the `on_member_update`
event listener to watch for updates in guild-related information for
that user. (We currently only sync the roles the user has.)
See:
- https://discordpy.readthedocs.io/en/stable/api.html#discord.on_member_update
- https://discordpy.readthedocs.io/en/stable/api.html#discord.on_user_update
Note:
The docs for `discord.py` make it *seem* like the `on_member_update`
event does not fire for updates of theusername, discriminator, and
avatar attributes. However, experimentation shows that this event
*does* fire; it's just that the member objects provided as `before`
and `after` to the listener will already have been updated in cache
by the `on_user_update` event that fires *before* it.
This means that if the only changes made were to the username,
avatar, and discriminator, the `on_member_update` event does fire,
but with two *equal* Member objects. This makes it appear as if you
may be able to use `on_member_update`, since it fires, but it does
not actually contain anything useful. | 
|  |  | 
|  |  | 
|  | Similar to `format_infraction_with_duration` ( if not outright copying it ), added 3 tests for `until_expiration`:
- None `expiry`.
- Custom `max_units`.
- Normal use cases. | 
|  | `format_infraction_with_duration`
- `until_expiration` was being a pain to unittests without a `now` ( default to `datetime.utcnow()` ). Adding an optional argument for this will not only make writing tests easier, but also allow more control over the helper function should we need to calculate the remaining time between two dates in the past.
- Changed typehint for `date_from` in `format_infraction_with_duration` to `Optional[datetime.datetime]` to better reflect what it is. | 
|  |  | 
|  |  | 
|  |  | 
|  | This make the channel specifiable without the amount.
Co-Authored-By: scragly <[email protected]> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | It will attempt to find the most recent infraction authored by the
invoker of the edit command. | 
|  |  | 
|  | Messages are deleted after a delay of 10 seconds. This helps keep the
channel clean. The periodic ping is an exception; it will remain. | 
|  |  | 
|  |  | 
|  |  | 
|  | Raising an exception allows the error handler to display a message to
the user if the failure happened from a command invocation. | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | The object is basically just a namedtuple so there's no need to
re-create it every time a token is obtained.
* Remove log message which shows credentials.
* Initialise headers attribute to None in __init__. | 
|  | This removes the duplicate code for renewing the token. Since
fetch_posts is the only place where the token gets used, it can just be
refreshed there directly. | 
|  |  | 
|  |  | 
|  |  | 
|  | Only a warning is logged if it's a Forbidden error. Otherwise, the whole
exception is logged. | 
|  |  | 
|  | Active thread counts are observed to be lower with it in use. | 
|  | The in_channel decorator raised 'NoneType' is not iterable when it
wasn't passed, due to the default value being None but not checked
against before iterating over it. This edit ensures the arguments are
set to an empty list in cases where they have a value of None instead. | 
|  |  | 
|  | aiohttp throws a warning when a session is created outside of a running
async event loop. In aiohttp 4.0 this actually changes to an error
instead of merely a warning.
Since discord.py manages the event loop with client.run(), some of
the "internal" coroutines of the client were overwritten in the bot
subclass to be able to hook into when the bot starts and stops.
Sessions of both the bot and the API client can now potentially be None
if accessed before the sessions have been created. However, if called,
the API client's methods will wait for a session to be ready. It will
attempt to create a session as soon as the event loop starts (i.e. the
bot is running). | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | Hard-coded version number to 1.0.0. | 
|  | Include the check about whether or not there is a token in the posted message in `parse_codeblock` boolean. | 
|  | - Added the option to specify a channel to have Python repeat what you said to it, as well as keeping the old functionality of having it repeat what you said in the current channel if no channel argument is given.
Signed-off-by: Daniel Brown <[email protected]> |