conflict fixes

This commit is contained in:
iDutchy
2021-01-14 18:03:09 -06:00
39 changed files with 1181 additions and 184 deletions

View File

@ -112,6 +112,7 @@
:root[data-theme="dark"] .highlight .ni { color: #d0d0d0; } /* Name.Entity */
:root[data-theme="dark"] .highlight .ne { color: #bbbbbb; } /* Name.Exception */
:root[data-theme="dark"] .highlight .nf { color: #6494d8; } /* Name.Function */
:root[data-theme="dark"] .highlight .fm { color: #6494d8; } /* Name.Function.Magic */
:root[data-theme="dark"] .highlight .nl { color: #d0d0d0; } /* Name.Label */
:root[data-theme="dark"] .highlight .nn { color: #6494d8;} /* Name.Namespace */
:root[data-theme="dark"] .highlight .nx { color: #d0d0d0; } /* Name.Other */

View File

@ -5,6 +5,7 @@ let bottomHeightThreshold, sections;
let hamburgerToggle;
let mobileSearch;
let sidebar;
let toTop;
class Modal {
constructor(element) {
@ -49,12 +50,19 @@ class SearchBar {
}
function scrollToTop() {
window.scrollTo({ top: 0, behavior: 'smooth' });
}
document.addEventListener('DOMContentLoaded', () => {
mobileSearch = new SearchBar();
bottomHeightThreshold = document.documentElement.scrollHeight - 30;
sections = document.querySelectorAll('section');
hamburgerToggle = document.getElementById('hamburger-toggle');
toTop = document.getElementById('to-top');
toTop.hidden = !(window.scrollY > 0);
if (hamburgerToggle) {
hamburgerToggle.addEventListener('click', (e) => {
@ -76,6 +84,16 @@ document.addEventListener('DOMContentLoaded', () => {
// insert ourselves after the element
parent.insertBefore(table, element.nextSibling);
});
window.addEventListener('scroll', () => {
toTop.hidden = !(window.scrollY > 0);
});
});
document.addEventListener('keydown', (event) => {
if (event.code == "Escape" && activeModal) {
activeModal.close();
}
});
document.addEventListener('keydown', (event) => {

View File

@ -94,10 +94,13 @@ function updateSetting(element) {
}
}
for (const setting of settings) {
setting.load();
}
document.addEventListener('DOMContentLoaded', () => {
settingsModal = new Modal(document.querySelector('div#settings.modal'));
for (const setting of settings) {
setting.load();
setting.setElement();
}
});

View File

@ -19,6 +19,7 @@ Historically however, thanks to:
/* CSS variables would go here */
:root {
--font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
--monospace-font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
/* palette goes here */
--white: #ffffff;
@ -96,6 +97,8 @@ Historically however, thanks to:
--rtd-ad-background: var(--grey-2);
--rtd-ad-main-text: var(--grey-6);
--rtd-ad-small-text: var(--grey-4);
--rtd-version-background: #272525;
--rtd-version-main-text: #fcfcfc;
--attribute-table-title: var(--grey-6);
--attribute-table-entry-border: var(--grey-3);
--attribute-table-entry-text: var(--grey-5);
@ -103,6 +106,7 @@ Historically however, thanks to:
--attribute-table-entry-hover-background: var(--grey-2);
--attribute-table-entry-hover-text: var(--blue-2);
--attribute-table-badge: var(--grey-7);
--highlighted-text: rgb(252, 233, 103);
}
:root[data-font="serif"] {
@ -162,6 +166,7 @@ Historically however, thanks to:
--attribute-table-entry-hover-background: var(--grey-6);
--attribute-table-entry-hover-text: var(--blue-1);
--attribute-table-badge: var(--grey-4);
--highlighted-text: rgba(250, 166, 26, 0.2);
}
img[src$="snake_dark.svg"] {
@ -247,6 +252,7 @@ header > nav {
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
}
header > nav a {
@ -265,6 +271,12 @@ header > nav.mobile-only {
header > nav.mobile-only .search {
width: 100%;
position: absolute;
top: 0;
right: 0;
z-index: -1;
padding-top: 0;
transition: top 0.5s ease-in-out;
}
header > nav.mobile-only .search-wrapper {
@ -316,6 +328,11 @@ header > nav > a:hover {
cursor: pointer;
}
.sub-header option {
color: black;
}
.sub-header > select:focus {
outline: none;
}
@ -380,12 +397,12 @@ aside h3 {
position: relative;
line-height: 0.5em;
transition: transform 0.4s;
transform: rotate(0deg);
transform: rotate(-90deg);
}
.expanded {
transition: transform 0.4s;
transform: rotate(-90deg);
transform: rotate(0deg);
}
.ref-internal-padding {
@ -567,6 +584,37 @@ div.modal input {
cursor: pointer;
}
/* scroll to top button */
#to-top {
position: fixed;
bottom: 50px;
right: 20px;
cursor: pointer;
}
#to-top.is-rtd {
bottom: 90px;
}
#to-top > span {
display: block;
width: auto;
height: 30px;
padding: 0 6px;
background-color: var(--rtd-version-background);
color: var(--rtd-version-main-text);
}
#to-top span {
line-height: 30px;
font-size: 90%;
text-align: center;
}
/* copy button */
.relative-copy {
@ -855,7 +903,7 @@ dl.field-list {
/* internal references are forced to bold for some reason */
a.reference.internal > strong {
font-weight: unset;
font-family: monospace;
font-family: var(--monospace-font-family);
}
/* exception hierarchy */
@ -950,7 +998,7 @@ pre {
}
pre, code {
font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-family: var(--monospace-font-family);
font-size: 0.9em;
overflow-wrap: break-word;
}
@ -1007,6 +1055,13 @@ dd {
margin-left: 1.5em;
}
dt:target, span.highlighted {
background-color: var(--highlighted-text);
}
rect.highlighted {
fill: var(--highlighted-text);
}
.container.operations {
padding: 10px;

View File

@ -67,7 +67,7 @@
<a onclick="mobileSearch.close();" title="{{ _('Close') }}" id="close-search" class="mobile-only" hidden><span class="material-icons">close</span></a>
</nav>
<nav class="mobile-only">
<form role="search" class="search" action="search.html" method="get">
<form role="search" class="search" action="{{ pathto('search') }}" method="get">
<div class="search-wrapper">
<input type="search" name="q" placeholder="{{ _('Search documentation') }}" />
<button type="submit">
@ -90,7 +90,7 @@
<option value="{{ pathto(p + '/index')|e }}" {% if pagename is prefixedwith p %}selected{% endif %}>{{ ext }}</option>
{%- endfor %}
</select>
<form role="search" class="search" action="search.html" method="get">
<form role="search" class="search" action="{{ pathto('search') }}" method="get">
<div class="search-wrapper">
<input type="search" name="q" placeholder="{{ _('Search documentation') }}" />
<button type="submit">
@ -115,7 +115,7 @@
</div>
</aside>
{#- The actual body of the contents #}
<main class="grid-item">
<main class="grid-item" role="main">
{% block body %} {% endblock %}
</main>
{%- block footer %}
@ -190,5 +190,9 @@
</div>
</div>
<div id="to-top" onclick="scrollToTop()"{%- if READTHEDOCS %} class="is-rtd"{%- endif %} hidden>
<span><span class="material-icons">arrow_upward</span> to top</span>
</div>
</body>
</html>

View File

@ -87,6 +87,14 @@ VoiceClient
.. autoclass:: VoiceClient()
:members:
VoiceProtocol
~~~~~~~~~~~~~~~
.. attributetable:: VoiceProtocol
.. autoclass:: VoiceProtocol
:members:
AudioSource
~~~~~~~~~~~~
@ -147,7 +155,7 @@ Opus Library
Event Reference
---------------
This page outlines the different types of events listened by :class:`Client`.
This section outlines the different types of events listened by :class:`Client`.
There are two ways to register an event, the first way is through the use of
:meth:`Client.event`. The second way is through subclassing :class:`Client` and
@ -661,6 +669,7 @@ to handle it, which defaults to print a traceback and ignoring the exception.
- activity
- nickname
- roles
- pending
This requires :attr:`Intents.members` to be enabled.
@ -2150,9 +2159,9 @@ Certain utilities make working with async iterators easier, detailed below.
Collects items into chunks of up to a given maximum size.
Another :class:`AsyncIterator` is returned which collects items into
:class:`list`\s of a given size. The maximum chunk size must be a positive integer.
.. versionadded:: 1.6
Collecting groups of users: ::
async for leader, *users in reaction.users().chunk(3):
@ -2616,11 +2625,22 @@ Webhook Support
discord.py offers support for creating, editing, and executing webhooks through the :class:`Webhook` class.
Webhook
~~~~~~~~~
.. attributetable:: Webhook
.. autoclass:: Webhook
:members:
WebhookMessage
~~~~~~~~~~~~~~~~
.. attributetable:: WebhookMessage
.. autoclass:: WebhookMessage
:members:
Adapters
~~~~~~~~~
@ -2790,6 +2810,8 @@ Message
DeletedReferencedMessage
~~~~~~~~~~~~~~~~~~~~~~~~~
.. attributetable:: DeletedReferencedMessage
.. autoclass:: DeletedReferencedMessage()
:members:
@ -2998,6 +3020,8 @@ Invite
Template
~~~~~~~~~
.. attributetable:: Template
.. autoclass:: Template()
:members:
@ -3029,6 +3053,8 @@ Widget
Sticker
~~~~~~~~~~~~~~~
.. attributetable:: Sticker
.. autoclass:: Sticker()
:members:
@ -3101,6 +3127,8 @@ dynamic attributes in mind.
Object
~~~~~~~
.. attributetable:: Object
.. autoclass:: Object
:members:
@ -3126,6 +3154,12 @@ MessageReference
.. autoclass:: MessageReference
:members:
PartialMessage
~~~~~~~~~~~~~~~~~
.. autoclass:: PartialMessage
:members:
Intents
~~~~~~~~~~

View File

@ -40,6 +40,7 @@ extensions = [
'details',
'exception_hierarchy',
'attributetable',
'resourcelinks',
]
autodoc_member_order = 'bysource'
@ -76,7 +77,7 @@ master_doc = 'index'
# General information about the project.
project = u'discord.py'
copyright = u'2015-2020, Rapptz'
copyright = u'2015-2021, Rapptz'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@ -91,6 +92,9 @@ with open('../discord/__init__.py') as f:
# The full version, including alpha/beta/rc tags.
release = version
# This assumes a tag is available for final releases
branch = 'master' if version.endswith('a') else 'v' + version
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
@ -152,6 +156,13 @@ html_context = {
],
}
resource_links = {
'discord': 'https://discord.gg/r3sSKJJ',
'issues': 'https://github.com/Rapptz/discord.py/issues',
'discussions': 'https://github.com/Rapptz/discord.py/discussions',
'examples': 'https://github.com/Rapptz/discord.py/tree/%s/examples' % branch,
}
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
@ -337,3 +348,4 @@ def setup(app):
if app.config.language == 'ja':
app.config.intersphinx_mapping['py'] = ('https://docs.python.org/ja/3', None)
app.config.html_context['discord_invite'] = 'https://discord.gg/nXzj3dg'
app.config.resource_links['discord'] = 'https://discord.gg/nXzj3dg'

View File

@ -35,7 +35,7 @@ Creating a Bot account is a pretty straightforward process.
7. Copy the token using the "Copy" button.
- **This is not the Client Secret at the General Information page**
- **This is not the Client Secret at the General Information page.**
.. warning::

View File

@ -7,16 +7,29 @@ The following section outlines the API of discord.py's command extension module.
.. _ext_commands_api_bot:
Bots
------
Bot
----
~~~~
.. attributetable:: discord.ext.commands.Bot
.. autoclass:: discord.ext.commands.Bot
:members:
:inherited-members:
AutoShardedBot
~~~~~~~~~~~~~~~~
.. attributetable:: discord.ext.commands.AutoShardedBot
.. autoclass:: discord.ext.commands.AutoShardedBot
:members:
Prefix Helpers
----------------
.. autofunction:: discord.ext.commands.when_mentioned
.. autofunction:: discord.ext.commands.when_mentioned_or
@ -64,21 +77,39 @@ are custom to the command extension module.
.. _ext_commands_api_command:
Command
--------
Commands
----------
Decorators
~~~~~~~~~~~~
.. autofunction:: discord.ext.commands.command
.. autofunction:: discord.ext.commands.group
Command
~~~~~~~~~
.. attributetable:: discord.ext.commands.Command
.. autoclass:: discord.ext.commands.Command
:members:
:special-members: __call__
Group
~~~~~~
.. attributetable:: discord.ext.commands.Group
.. autoclass:: discord.ext.commands.Group
:members:
:inherited-members:
GroupMixin
~~~~~~~~~~~
.. attributetable:: discord.ext.commands.GroupMixin
.. autoclass:: discord.ext.commands.GroupMixin
:members:
@ -87,28 +118,58 @@ Command
Cogs
------
Cog
~~~~
.. attributetable:: discord.ext.commands.Cog
.. autoclass:: discord.ext.commands.Cog
:members:
CogMeta
~~~~~~~~
.. attributetable:: discord.ext.commands.CogMeta
.. autoclass:: discord.ext.commands.CogMeta
:members:
.. _ext_commands_help_command:
Help Commands
-----------------
---------------
HelpCommand
~~~~~~~~~~~~
.. attributetable:: discord.ext.commands.HelpCommand
.. autoclass:: discord.ext.commands.HelpCommand
:members:
DefaultHelpCommand
~~~~~~~~~~~~~~~~~~~
.. attributetable:: discord.ext.commands.DefaultHelpCommand
.. autoclass:: discord.ext.commands.DefaultHelpCommand
:members:
:exclude-members: send_bot_help, send_cog_help, send_group_help, send_command_help, prepare_help_command
MinimalHelpCommand
~~~~~~~~~~~~~~~~~~~
.. attributetable:: discord.ext.commands.MinimalHelpCommand
.. autoclass:: discord.ext.commands.MinimalHelpCommand
:members:
:exclude-members: send_bot_help, send_cog_help, send_group_help, send_command_help, prepare_help_command
Paginator
~~~~~~~~~~
.. attributetable:: discord.ext.commands.Paginator
.. autoclass:: discord.ext.commands.Paginator
:members:
@ -190,6 +251,8 @@ Checks
Context
--------
.. attributetable:: discord.ext.commands.Context
.. autoclass:: discord.ext.commands.Context
:members:
:inherited-members:
@ -353,9 +416,15 @@ Exceptions
.. autoexception:: discord.ext.commands.ChannelNotReadable
:members:
.. autoexception:: discord.ext.commands.BadColourArgument
:members:
.. autoexception:: discord.ext.commands.RoleNotFound
:members:
.. autoexception:: discord.ext.commands.BadInviteArgument
:members:
.. autoexception:: discord.ext.commands.EmojiNotFound
:members:
@ -409,7 +478,7 @@ Exceptions
Exception Hierarchy
+++++++++++++++++++++
~~~~~~~~~~~~~~~~~~~~~
.. exception_hierarchy::

View File

@ -713,7 +713,7 @@ Global Checks
Sometimes we want to apply a check to **every** command, not just certain commands. The library supports this as well
using the global check concept.
Global checks work similarly to regular checks except they are registered with the :func:`.Bot.check` decorator.
Global checks work similarly to regular checks except they are registered with the :meth:`.Bot.check` decorator.
For example, to block all DMs we could do the following:

View File

@ -135,6 +135,8 @@ Doing something during cancellation:
API Reference
---------------
.. attributetable:: discord.ext.tasks.Loop
.. autoclass:: discord.ext.tasks.Loop()
:members:

View File

@ -0,0 +1,44 @@
# Credit to sphinx.ext.extlinks for being a good starter
# Copyright 2007-2020 by the Sphinx team
# Licensed under BSD.
from typing import Any, Dict, List, Tuple
from docutils import nodes, utils
from docutils.nodes import Node, system_message
from docutils.parsers.rst.states import Inliner
import sphinx
from sphinx.application import Sphinx
from sphinx.util.nodes import split_explicit_title
from sphinx.util.typing import RoleFunction
def make_link_role(resource_links: Dict[str, str]) -> RoleFunction:
def role(
typ: str,
rawtext: str,
text: str,
lineno: int,
inliner: Inliner,
options: Dict = {},
content: List[str] = []
) -> Tuple[List[Node], List[system_message]]:
text = utils.unescape(text)
has_explicit_title, title, key = split_explicit_title(text)
full_url = resource_links[key]
if not has_explicit_title:
title = full_url
pnode = nodes.reference(title, title, internal=False, refuri=full_url)
return [pnode], []
return role
def add_link_role(app: Sphinx) -> None:
app.add_role('resource', make_link_role(app.config.resource_links))
def setup(app: Sphinx) -> Dict[str, Any]:
app.add_config_value('resource_links', {}, 'env')
app.connect('builder-inited', add_link_role)
return {'version': sphinx.__display_version__, 'parallel_read_safe': True}

View File

@ -30,41 +30,57 @@ Features
- Easy to use with an object oriented design
- Optimised for both speed and memory
Documentation Contents
-----------------------
Getting started
-----------------
.. toctree::
:maxdepth: 2
Is this your first time using the library? This is the place to get started!
intro
quickstart
migrating
logging
api
- **First steps:** :doc:`intro` | :doc:`quickstart` | :doc:`logging`
- **Working with Discord:** :doc:`discord` | :doc:`intents`
- **Examples:** Many examples are available in the :resource:`repository <examples>`.
Getting help
--------------
If you're having trouble with something, these resources might help.
- Try the :doc:`faq` first, it's got answers to all common questions.
- Ask us and hang out with us in our :resource:`Discord <discord>` server.
- If you're looking for something specific, try the :ref:`index <genindex>` or :ref:`searching <search>`.
- Report bugs in the :resource:`issue tracker <issues>`.
- Ask in our :resource:`GitHub discussions page <discussions>`.
Extensions
-----------
------------
These extensions help you during development when it comes to common tasks.
.. toctree::
:maxdepth: 3
:maxdepth: 1
ext/commands/index.rst
ext/tasks/index.rst
Manuals
---------
Additional Information
-----------------------
These pages go into great detail about everything the API can do.
.. toctree::
:maxdepth: 2
:maxdepth: 1
discord
intents
faq
whats_new
version_guarantees
api
discord.ext.commands API Reference <ext/commands/api.rst>
discord.ext.tasks API Reference <ext/tasks/index.rst>
If you still can't find what you're looking for, try in one of the following pages:
Meta
------
* :ref:`genindex`
* :ref:`search`
If you're looking for something related to the project itself, it's here.
.. toctree::
:maxdepth: 1
whats_new
version_guarantees
migrating

View File

@ -60,7 +60,7 @@ With the API change requiring bot authors to specify intents, some intents were
A privileged intent is one that requires you to go to the developer portal and manually enable it. To enable privileged intents do the following:
1. Make sure you're logged on to the `Discord website <https://discord.com>`_.
2. Navigate to the `application page <https://discord.com/developers/applications>`_
2. Navigate to the `application page <https://discord.com/developers/applications>`_.
3. Click on the bot you want to enable privileged intents for.
4. Navigate to the bot tab on the left side of the screen.
@ -74,7 +74,7 @@ A privileged intent is one that requires you to go to the developer portal and m
.. warning::
Enabling privileged intents when your bot is in over 100 guilds requires going through `bot verification <https://support.discord.com/hc/en-us/articles/360040720412>`_. If your bot is already verified and you would like to enable a privileged intent you must go through `discord support <https://dis.gd/contact>`_ and talk to them about it.
Enabling privileged intents when your bot is in over 100 guilds requires going through `bot verification <https://support.discord.com/hc/en-us/articles/360040720412>`_. If your bot is already verified and you would like to enable a privileged intent you must go through `Discord support <https://dis.gd/contact>`_ and talk to them about it.
.. note::
@ -203,4 +203,4 @@ On Windows use ``py -3`` instead of ``python3``.
There is no currently set date in which the old gateway will stop working so it is recommended to update your code instead.
If you truly dislike the direction Discord is going with their API, you can contact them via `support <https://dis.gd/contact>`_
If you truly dislike the direction Discord is going with their API, you can contact them via `support <https://dis.gd/contact>`_.

View File

@ -52,7 +52,7 @@ Virtual Environments
~~~~~~~~~~~~~~~~~~~~~
Sometimes you want to keep libraries from polluting system installs or use a different version of
libraries than the ones installed on the system. You might also not have permissions to install libaries system-wide.
libraries than the ones installed on the system. You might also not have permissions to install libraries system-wide.
For this purpose, the standard library as of Python 3.3 comes with a concept called "Virtual Environment"s to
help maintain these separate versions.

View File

@ -11,7 +11,7 @@ if you don't check the :ref:`installing` portion.
A Minimal Bot
---------------
Let's make a bot that replies to a specific message and walk you through it.
Let's make a bot that responds to a specific message and walk you through it.
It looks something like this:
@ -53,7 +53,7 @@ There's a lot going on here, so let's walk you through it step by step.
sure that we ignore messages from ourselves. We do this by checking if the :attr:`Message.author`
is the same as the :attr:`Client.user`.
5. Afterwards, we check if the :class:`Message.content` starts with ``'$hello'``. If it is,
then we reply in the channel it was used in with ``'Hello!'``.
then we send a message in the channel it was used in with ``'Hello!'``.
6. Finally, we run the bot with our login token. If you need help getting your token or creating a bot,
look in the :ref:`discord-intro` section.

View File

@ -66,6 +66,78 @@ New Features
- |commands| Add :attr:`Context.clean_prefix <ext.commands.Context>`
.. _vp1p6p0:
v1.6.0
--------
This version comes with support for replies and stickers.
New Features
~~~~~~~~~~~~~~
- An entirely redesigned documentation. This was the cumulation of multiple months of effort.
- There's now a dark theme, feel free to navigate to the cog on the screen to change your setting, though this should be automatic.
- Add support for :meth:`AppInfo.icon_url_as` and :meth:`AppInfo.cover_image_url_as` (:issue:`5888`)
- Add :meth:`Colour.random` to get a random colour (:issue:`6067`)
- Add support for stickers via :class:`Sticker` (:issue:`5946`)
- Add support for replying via :meth:`Message.reply` (:issue:`6061`)
- This also comes with the :attr:`AllowedMentions.replied_user` setting.
- :meth:`abc.Messageable.send` can now accept a :class:`MessageReference`.
- :class:`MessageReference` can now be constructed by users.
- :meth:`Message.to_reference` can now convert a message to a :class:`MessageReference`.
- Add support for getting the replied to resolved message through :attr:`MessageReference.resolved`.
- Add support for role tags.
- :attr:`Guild.premium_subscriber_role` to get the "Nitro Booster" role (if available).
- :attr:`Guild.self_role` to get the bot's own role (if available).
- :attr:`Role.tags` to get the role's tags.
- :meth:`Role.is_premium_subscriber` to check if a role is the "Nitro Booster" role.
- :meth:`Role.is_bot_managed` to check if a role is a bot role (i.e. the automatically created role for bots).
- :meth:`Role.is_integration` to check if a role is role created by an integration.
- Add :meth:`Client.is_ws_ratelimited` to check if the websocket is rate limited.
- :meth:`ShardInfo.is_ws_ratelimited` is the equivalent for checking a specific shard.
- Add support for chunking an :class:`AsyncIterator` through :meth:`AsyncIterator.chunk` (:issue:`6100`, :issue:`6082`)
- Add :attr:`PartialEmoji.created_at` (:issue:`6128`)
- Add support for editing and deleting webhook sent messages (:issue:`6058`)
- This adds :class:`WebhookMessage` as well to power this behaviour.
- Add :class:`PartialMessage` to allow working with a message via channel objects and just a message_id (:issue:`5905`)
- This is useful if you don't want to incur an extra API call to fetch the message.
- Add :meth:`Emoji.url_as` (:issue:`6162`)
- Add support for :attr:`Member.pending` for the membership gating feature.
- Allow ``colour`` parameter to take ``int`` in :meth:`Guild.create_role` (:issue:`6195`)
- Add support for ``presences`` in :meth:`Guild.query_members` (:issue:`2354`)
- |commands| Add support for ``description`` keyword argument in :class:`commands.Cog <ext.commands.Cog>` (:issue:`6028`)
- |tasks| Add support for calling the wrapped coroutine as a function via ``__call__``.
Bug Fixes
~~~~~~~~~~~
- Raise :exc:`DiscordServerError` when reaching 503s repeatedly (:issue:`6044`)
- Fix :exc:`AttributeError` when :meth:`Client.fetch_template` is called (:issue:`5986`)
- Fix errors when playing audio and moving to another channel (:issue:`5953`)
- Fix :exc:`AttributeError` when voice channels disconnect too fast (:issue:`6039`)
- Fix stale :class:`User` references when the members intent is off.
- Fix :func:`on_user_update` not dispatching in certain cases when a member is not cached but the user somehow is.
- Fix :attr:`Message.author` being overwritten in certain cases during message update.
- This would previously make it so :attr:`Message.author` is a :class:`User`.
- Fix :exc:`UnboundLocalError` for editing ``public_updates_channel`` in :meth:`Guild.edit` (:issue:`6093`)
- Fix uninitialised :attr:`CustomActivity.created_at` (:issue:`6095`)
- |commands| Errors during cog unload no longer stops module cleanup (:issue:`6113`)
- |commands| Properly cleanup lingering commands when a conflicting alias is found when adding commands (:issue:`6217`)
Miscellaneous
~~~~~~~~~~~~~~~
- ``ffmpeg`` spawned processes no longer open a window in Windows (:issue:`6038`)
- Update dependencies to allow the library to work on Python 3.9+ without requiring build tools. (:issue:`5984`, :issue:`5970`)
- Fix docstring issue leading to a SyntaxError in 3.9 (:issue:`6153`)
- Update Windows opus binaries from 1.2.1 to 1.3.1 (:issue:`6161`)
- Allow :meth:`Guild.create_role` to accept :class:`int` as the ``colour`` parameter (:issue:`6195`)
- |commands| :class:`MessageConverter <ext.commands.MessageConverter>` regex got updated to support ``www.`` prefixes (:issue:`6002`)
- |commands| :class:`UserConverter <ext.commands.UserConverter>` now fetches the API if an ID is passed and the user is not cached.
- |commands| :func:`max_concurrency <ext.commands.max_concurrency>` is now called before cooldowns (:issue:`6172`)
.. _vp1p5p1:
v1.5.1