| Commit message (Collapse) | Author | Age | Lines | 
| ...                                          |  | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
This is supposed to be provided by our MutableMapping mixin, but unit
tests are demonstrating that these don't really work as intended.
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
This would've been implemented by MutableMapping, but that
implementation is O(n) instead of O(1) since it just iterates the
entire hash and does HDEL. Feels wasteful.
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
The rest of the features should be provided by the MutableMapping abc
we're interfacing. Specifically, MutableMapping provides these:
.pop, .popitem, .clear, .update, .setdefault, __contains__, .keys,
.items, .values, .get, __eq__, and __ne__.
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
It was brought to my attention that we may need several caches per Cog
for some of our Cogs. This means that the original approach of having
this be a mixin is a little bit problematic.
Instead, RedisDict will be instantiated directly inside the class you
want it in. By leveraging __set_name__, we can create a namespace
containing both the class name and the variable name without the user
having to provide anything.
For example, if you create an attribute MyClass.cache = RedisDict(),
this will be using the redis namespace 'MyClass.cache.' before anything
you store in it.
With this approach, it is also possible to instantiate a RedisDict with
a custom namespace by simply passing it into the constructor.
- RedisDict("firedog") will create items with the 'firedog.your_item'
  prefix.
- If there are multiple RedisDicts using the same namespace, an
  underscore will be appended to the namespace, such that the second
  RedisDict("firedog") will actually create items in the
  'firedog_.your_item' namespace.
This is also possible to use outside of classes, so long as you provide
a custom namespace when you instantiate it.
Custom namespaces will always take precedence over automatic
'Class.attribute_name' ones.
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
We're using __init_subclass__ to initialize our RedisDict with the
subclass name as a namespace. This will be prefixed to all data that
we store, so that there won't be collisions between different
subclasses.
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
This is the module we will be using to interface with Redis.
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
This is almost hilariously easy since we can just use
the official image for it.
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
for embed descriptions
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
test_get_disallowed_extensions
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
extensions and added a test for it.
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
extensions and added a test for it.
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
Co-authored-by: Mark <[email protected]>
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
meantime.
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | |\ \ \ \ \ \ \ \ \ \ \ \ \ \  
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
ban-kick-reason-length
 | 
| | | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
Co-authored-by: Mark <[email protected]>
 | 
| | | | | | | | | |/ / / / / / / / / / / / / /   | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
Replace `{"foo": "bar"}` with `{"id": 1}`
 | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | |  | 
To allow `.get`, I had to replace `str` return value with `dict`
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | |\ \ \ \ \ \ \ \ \ \ \ \ \ \   | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
- Remove unnecessary space from placeholder
- Rename `has_active_infraction` to `get_active_infraction`
 | 
| | | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
Co-authored-by: Leon Sandøy <[email protected]>
 | 
| | | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | | 
| | | | | | | | | | | | | | | | | | | | | | |  | 
removed unnecessary type hint and added comment to kick truncation test about awaiting `kick`.
 | 
| | | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | |  | 
 | 
| | | | | | | | | | | | | | | | | | | | | | | |  | 
 |