What’s New¶
This page keeps a detailed human friendly rendering of what’s new and changed in specific versions.
v0.16.6¶
Bug Fixes¶
- Fix issue with
Client.create_server()
that made it stop working. - Fix main thread being blocked upon calling
StreamPlayer.stop
. - Handle HEARTBEAT_ACK and resume gracefully when it occurs.
- Fix race condition when pre-emptively rate limiting that caused releasing an already released lock.
- Fix invalid state errors when immediately cancelling a coroutine.
v0.16.1¶
This release is just a bug fix release with some better rate limit implementation.
Bug Fixes¶
- Servers are now properly chunked for user bots.
- The CDN URL is now used instead of the API URL for assets.
- Rate limit implementation now tries to use header information if possible.
- Event loop is now properly propagated (issue 420)
- Allow falsey values in
Client.send_message()
andClient.send_file()
.
v0.16.0¶
New Features¶
- Add
Channel.overwrites
to get all the permission overwrites of a channel. - Add
Server.features
to get information about partnered servers.
Bug Fixes¶
Timeout when waiting for offline members while triggering
on_ready()
.- The fact that we did not timeout caused a gigantic memory leak in the library that caused
thousands of duplicate
Member
instances causing big memory spikes.
- The fact that we did not timeout caused a gigantic memory leak in the library that caused
thousands of duplicate
Discard null sequences in the gateway.
- The fact these were not discarded meant that
on_ready()
kept being called instead ofon_resumed()
. Since this has been corrected, in most caseson_ready()
will be called once or twice withon_resumed()
being called much more often.
- The fact these were not discarded meant that
v0.15.1¶
- Fix crash on duplicate or out of order reactions.
v0.15.0¶
New Features¶
Rich Embeds for messages are now supported.
- To do so, create your own
Embed
and pass the instance to theembed
keyword argument toClient.send_message()
orClient.edit_message()
.
- To do so, create your own
Add
Client.clear_reactions()
to remove all reactions from a message.Add support for MESSAGE_REACTION_REMOVE_ALL event, under
on_reaction_clear()
.Add
Permissions.update()
andPermissionOverwrite.update()
for bulk permission updates.- This allows you to use e.g.
p.update(read_messages=True, send_messages=False)
in a single line.
- This allows you to use e.g.
Add
PermissionOverwrite.is_empty()
to check if the overwrite is empty (i.e. has no overwrites set explicitly as true or false).
For the command extension, the following changed:
Context
is no longer slotted to facilitate setting dynamic attributes.
v0.14.3¶
Bug Fixes¶
- Fix crash when dealing with MESSAGE_REACTION_REMOVE
- Fix incorrect buckets for reactions.
v0.14.2¶
New Features¶
Client.wait_for_reaction()
now returns a namedtuple withreaction
anduser
attributes.- This is for better support in the case that
None
is returned since tuple unpacking can lead to issues.
- This is for better support in the case that
Bug Fixes¶
- Fix bug that disallowed
None
to be passed foremoji
parameter inClient.wait_for_reaction()
.
v0.14.1¶
Bug fixes¶
- Fix bug with Reaction not being visible at import.
- This was also breaking the documentation.
v0.14.0¶
This update adds new API features and a couple of bug fixes.
New Features¶
- Add support for Manage Webhooks permission under
Permissions.manage_webhooks
- Add support for
around
argument in 3.5+Client.logs_from()
. - Add support for reactions.
Client.add_reaction()
to add a reactionsClient.remove_reaction()
to remove a reaction.Client.get_reaction_users()
to get the users that reacted to a message.Permissions.add_reactions
permission bit support.- Two new events,
on_reaction_add()
andon_reaction_remove()
. Message.reactions
to get reactions from a message.Client.wait_for_reaction()
to wait for a reaction from a user.
Bug Fixes¶
- Fix bug with Paginator still allowing lines that are too long.
- Fix the
Permissions.manage_emojis
bit being incorrect.
v0.13.0¶
This is a backwards compatible update with new features.
New Features¶
Add the ability to manage emojis.
Client.create_custom_emoji()
to create new emoji.Client.edit_custom_emoji()
to edit an old emoji.Client.delete_custom_emoji()
to delete a custom emoji.
Add new
Permissions.manage_emojis
toggle.- This applies for
PermissionOverwrite
as well.
- This applies for
Add new statuses for
Status
.Status.dnd
(aliased withStatus.do_not_disturb
) for Do Not Disturb.Status.invisible
for setting your status to invisible (please see the docs for a caveat).
Deprecate
Client.change_status()
- Use
Client.change_presence()
instead for better more up to date functionality. - This method is subject for removal in a future API version.
- Use
Add
Client.change_presence()
for changing your status with the new Discord API change.- This is the only method that allows changing your status to invisible or do not disturb.
v0.12.0¶
This is a bug fix update that also comes with new features.
New Features¶
Add custom emoji support.
- Adds a new class to represent a custom Emoji named
Emoji
- Adds a utility generator function,
Client.get_all_emojis()
. - Adds a list of emojis on a server,
Server.emojis
. - Adds a new event,
on_server_emojis_update()
.
- Adds a new class to represent a custom Emoji named
Add new server regions to
ServerRegion
Add support for new pinned system message under
MessageType.pins_add
.Add order comparisons for
Role
to allow it to be compared with regards to hierarchy.- This means that you can now do
role_a > role_b
etc to check ifrole_b
is lower in the hierarchy.
- This means that you can now do
Add
Server.role_hierarchy
to get the server’s role hierarchy.Add
Member.server_permissions
to get a member’s server permissions without their channel specific overwrites.Add
Client.get_user_info()
to retrieve a user’s info from their ID.Add a new
Player
property,Player.error
to fetch the error that stopped the player.- To help with this change, a player’s
after
function can now take a single parameter denoting the current player.
- To help with this change, a player’s
Add support for server verification levels.
- Adds a new enum called
VerificationLevel
. - This enum can be used in
Client.edit_server()
under theverification_level
keyword argument. - Adds a new attribute in the server,
Server.verification_level
.
- Adds a new enum called
Add
Server.voice_client
shortcut property forClient.voice_client_in()
.- This is technically old (was added in v0.10.0) but was undocumented until v0.12.0.
For the command extension, the following are new:
- Add custom emoji converter.
- All default converters that can take IDs can now convert via ID.
- Add coroutine support for
Bot.command_prefix
. - Add a method to reset command cooldown.
Bug Fixes¶
- Fix bug that caused the library to not work with the latest
websockets
library. - Fix bug that leaked keep alive threads (issue 309)
- Fix bug that disallowed
ServerRegion
from being used inClient.edit_server()
. - Fix bug in
Channel.permissions_for()
that caused permission resolution to happen out of order. - Fix bug in
Member.top_role
that did not account for same-position roles.
v0.11.0¶
This is a minor bug fix update that comes with a gateway update (v5 -> v6).
Breaking Changes¶
Permissions.change_nicknames
has been renamed toPermissions.change_nickname
to match the UI.
New Features¶
Add the ability to prune members via
Client.prune_members()
.Switch the websocket gateway version to v6 from v5. This allows the library to work with group DMs and 1-on-1 calls.
Add
AppInfo.owner
attribute.Add
CallMessage
for group voice call messages.Add
GroupCall
for group voice call information.Add
Message.system_content
to get the system message.Add the remaining VIP servers and the Brazil servers into
ServerRegion
enum.Add
stderr
argument toVoiceClient.create_ffmpeg_player()
to redirect stderr.The library now handles implicit permission resolution in
Channel.permissions_for()
.Add
Server.mfa_level
to query a server’s 2FA requirement.Add
Permissions.external_emojis
permission.Add
Member.voice
attribute that refers to aVoiceState
.- For backwards compatibility, the member object will have properties mirroring the old behaviour.
For the command extension, the following are new:
- Command cooldown system with the
cooldown
decorator. UserInputError
exception for the hierarchy for user input related errors.
Bug Fixes¶
Client.email
is now saved when using a token for user accounts.- Fix issue when removing roles out of order.
- Fix bug where discriminators would not update.
- Handle cases where
HEARTBEAT
opcode is received. This caused bots to disconnect seemingly randomly.
For the command extension, the following bug fixes apply:
Bot.check
decorator is actually a decorator not requiring parentheses.Bot.remove_command
andGroup.remove_command
no longer throw if the command doesn’t exist.- Command names are no longer forced to be
lower()
. - Fix a bug where Member and User converters failed to work in private message contexts.
HelpFormatter
now ignores hidden commands when deciding the maximum width.
v0.10.0¶
For breaking changes, see Migrating to v0.10.0. The breaking changes listed there will not be enumerated below. Since this version is rather a big departure from v0.9.2, this change log will be non-exhaustive.
New Features¶
- The library is now fully
asyncio
compatible, allowing you to write non-blocking code a lot more easily. - The library now fully handles 429s and unconditionally retries on 502s.
- A new command extension module was added but is currently undocumented. Figuring it out is left as an exercise to the reader.
- Two new exception types,
Forbidden
andNotFound
to denote permission errors or 404 errors. - Added
Client.delete_invite()
to revoke invites. - Added support for sending voice. Check
VoiceClient
for more details. - Added
Client.wait_for_message()
coroutine to aid with follow up commands. - Added
version_info
named tuple to check version info of the library. - Login credentials are now cached to have a faster login experience. You can disable this by passing in
cache_auth=False
when constructing aClient
. - New utility function,
discord.utils.get()
to simplify retrieval of items based on attributes. - All data classes now support
!=
,==
,hash(obj)
andstr(obj)
. - Added
Client.get_bans()
to get banned members from a server. - Added
Client.invites_from()
to get currently active invites in a server. - Added
Server.me
attribute to get theMember
version ofClient.user
. - Most data classes now support a
hash(obj)
function to allow you to use them inset
ordict
classes or subclasses. - Add
Message.clean_content()
to get a text version of the content with the user and channel mentioned changed into their names. - Added a way to remove the messages of the user that just got banned in
Client.ban()
. - Added
Client.wait_until_ready()
to facilitate easy creation of tasks that require the client cache to be ready. - Added
Client.wait_until_login()
to facilitate easy creation of tasks that require the client to be logged in. - Add
discord.Game
to represent any game with custom text to send toClient.change_status()
. - Add
Message.nonce
attribute. - Add
Member.permissions_in()
as another way of doingChannel.permissions_for()
. - Add
Client.move_member()
to move a member to another voice channel. - You can now create a server via
Client.create_server()
. - Added
Client.edit_server()
to edit existing servers. - Added
Client.server_voice_state()
to server mute or server deafen a member. - If you are being rate limited, the library will now handle it for you.
- Add
on_member_ban()
andon_member_unban()
events that trigger when a member is banned/unbanned.
Performance Improvements¶
- All data classes now use
__slots__
which greatly reduce the memory usage of things kept in cache. - Due to the usage of
asyncio
, the CPU usage of the library has gone down significantly. - A lot of the internal cache lists were changed into dictionaries to change the
O(n)
lookup intoO(1)
. - Compressed READY is now on by default. This means if you’re on a lot of servers (or maybe even a few) you would receive performance improvements by having to download and process less data.
- While minor, change regex from
\d+
to[0-9]+
to avoid unnecessary unicode character lookups.
Bug Fixes¶
- Fix bug where guilds being updated did not edit the items in cache.
- Fix bug where
member.roles
were empty upon joining instead of having the@everyone
role. - Fix bug where
Role.is_everyone()
was not being set properly when the role was being edited. Client.logs_from()
now handles cases where limit > 100 to sidestep the discord API limitation.- Fix bug where a role being deleted would trigger a
ValueError
. - Fix bug where
Permissions.kick_members()
andPermissions.ban_members()
were flipped. - Mentions are now triggered normally. This was changed due to the way discord handles it internally.
- Fix issue when a
Message
would attempt to upgrade aMessage.server
when the channel is aObject
. - Unavailable servers were not being added into cache, this has been corrected.