Clients
Client
- @activity_primary_entry_point_command
- asyncapplication_info
- asyncbefore_identify_hook
- asyncchange_presence
- defclear
- asyncclose
- asyncconnect
- asyncconsume_entitlement
- asynccreate_guild
- asynccreate_test_entitlement
- asyncdelete_invite
- asyncdelete_test_entitlement
- @event
- asyncfetch_all_nitro_stickers
- asyncfetch_channel
- asyncfetch_entitlements
- asyncfetch_guild
- deffetch_guilds
- asyncfetch_invite
- asyncfetch_template
- asyncfetch_user
- asyncfetch_voice_regions
- asyncfetch_webhook
- asyncfetch_widget
- defget_all_channels
- defget_all_members
- defget_channel
- defget_emoji
- defget_guild
- defget_message
- defget_partial_messageable
- defget_user
- defis_closed
- defis_ready
- defis_ws_ratelimited
- asynclogin
- asynclogout
- @message_command
- asyncon_application_command_error
- @on_click
- asyncon_error
- @on_select
- @on_submit
- @once
- asyncrequest_offline_members
- defrun
- @slash_command
- asyncstart
- asyncupdate_primary_entry_point_command
- @user_command
- asyncwait_for
- asyncwait_until_ready
- class discord.Client(*, loop=None, **options)
Bases:
object
Represents a client connection that connects to Discord. This class is used to interact with the Discord WebSocket and API.
A number of options can be passed to the
Client
.- Parameters:
max_messages (Optional[
int
]) –The maximum number of messages to store in the internal message cache. This defaults to
1000
. Passing inNone
disables the message cache.Changed in version 1.3: Allow disabling the message cache and change the default size to
1000
.loop (Optional[
asyncio.AbstractEventLoop
]) – Theasyncio.AbstractEventLoop
to use for asynchronous operations. Defaults toNone
, in which case the default event loop is used viaasyncio.get_event_loop()
.connector (
aiohttp.BaseConnector
) – The connector to use for connection pooling.proxy (Optional[
str
]) – Proxy URL.proxy_auth (Optional[
aiohttp.BasicAuth
]) – An object that represents proxy HTTP Basic Authorization.shard_id (Optional[
int
]) – Integer starting at0
and less thanshard_count
.shard_count (Optional[
int
]) – The total number of shards.intents (
Intents
) – The intents that you want to enable for the _session. This is a way of disabling and enabling certain gateway events from triggering and being sent. If not given, defaults to a regularly constructedIntents
class.gateway_version (
int
) – The gateway and api version to use. Defaults tov10
.api_error_locale (
discord.Locale
) – The locale language to use for api errors. This will be applied to theX-Discord-Local
header in requests. Default toLocale.en_US
member_cache_flags (
MemberCacheFlags
) – Allows for finer control over how the library caches members. If not given, defaults to cache as much as possible with the currently selected intents.fetch_offline_members (
bool
) – A deprecated alias ofchunk_guilds_at_startup
.chunk_guilds_at_startup (
bool
) – Indicates ifon_ready()
should be delayed to chunk all guilds at start-up if necessary. This operation is incredibly slow for large amounts of guilds. The default isTrue
ifIntents.members
isTrue
.status (Optional[
Status
]) – A status to start your presence with upon logging on to Discord.activity (Optional[
BaseActivity
]) – An activity to start your presence with upon logging on to Discord.allowed_mentions (Optional[
AllowedMentions
]) – Control how the client handles mentions by default on every message sent.heartbeat_timeout (
float
) – The maximum numbers of seconds before timing out and restarting the WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if processing the initial packets take too long to the point of disconnecting you. The default timeout is 60 seconds.guild_ready_timeout (
float
) –The maximum number of seconds to wait for the GUILD_CREATE stream to end before preparing the member cache and firing READY. The default timeout is 2 seconds.
Added in version 1.4.
guild_subscriptions (
bool
) –Whether to dispatch presence or typing events. Defaults to
True
.Added in version 1.3.
Warning
If this is set to
False
then the following features will be disabled:No user related updates (
on_user_update()
will not dispatch)- All member related events will be disabled.
Typing events will be disabled (
on_typing()
).If
fetch_offline_members
is set toFalse
then the user cache will not exist. This makes it difficult or impossible to do many things, for example:Computing permissions
Querying members in a voice channel via
VoiceChannel.members
will be empty.Most forms of receiving
Member
will be receivingUser
instead, except for message events.Guild.owner
will usually resolve toNone
.Guild.get_member()
will usually be unavailable.Anything that involves using
Member
.users
will not be as populated.etc.
In short, this makes it so the only member you can reliably query is the message author. Useful for bots that do not require any state.
assume_unsync_clock (
bool
) –Whether to assume the system clock is unsynced. This applies to the ratelimit handling code. If this is set to
True
, the default, then the library uses the time to reset a rate limit bucket given by Discord. If this isFalse
then your system clock is used to calculate how long to sleep for. If this is set toFalse
it is recommended to sync your system clock to Google’s NTP server.Added in version 1.3.
sync_commands (
bool
) –Whether to sync application-commands on startup, default
False
.This will register global and guild application-commands(slash-, user- and message-commands) that are not registered yet, update changes and remove application-commands that could not be found in the code anymore if
delete_not_existing_commands
is set toTrue
what it is by default.delete_not_existing_commands (
bool
) – Whether to remove global and guild-only application-commands that are not in the code anymore, defaultTrue
.auto_check_for_updates (
bool
) –Whether to check for available updates automatically, default
False
for legal reasons. For more info seediscord.on_update_available()
.Note
For now, this may only work on the original repository, not on forks. This is because it uses an internal API that listens to a private application that is on the original repo.
In the future this API might be open-sourced, or it will be possible to add your forks URL as a valid source.
- @event
A decorator that registers an event to listen to.
You can find more info about the events on the documentation below.
The events must be a coroutine, if not,
TypeError
is raised.Example
@client.event async def on_ready(): print('Ready!')
- Raises:
TypeError – The coroutine passed is not actually a coroutine.
- @once(name=None, check=None)
A decorator that registers an event to listen to only once. For example if you want to perform a database connection once the bot is ready.
You can find more info about the events on the documentation below.
The events must be a coroutine, if not,
TypeError
is raised.- Parameters:
name (
str
) – The name of the event we want to listen to. This is passed towait_for()
. Defaults tofunc.__name__
.check (Optional[Callable[…,
bool
]]) – A predicate to check what to wait for. The arguments must meet the parameters of the event being waited for.
- Raises:
TypeError – The coroutine passed is not actually a coroutine.
Example
@client.once() async def ready(): print('Beep bop, I\'m ready!') @client.once(check=lambda msg: msg.author.id == 693088765333471284) async def message(message): await message.reply('Hey there, how are you?')
- async for ... in fetch_guilds(*, limit=100, before=None, after=None)
Retrieves an
AsyncIterator
that enables receiving your guilds.Note
Using this, you will only receive
Guild.owner
,Guild.icon
,Guild.id
, andGuild.name
perGuild
.Note
This method is an API call. For general usage, consider
guilds
instead.Examples
Usage
async for guild in client.fetch_guilds(limit=150): print(guild.name)
Flattening into a list
guilds = await client.fetch_guilds(limit=150).flatten() # guilds is now a list of Guild...
All parameters are optional.
- Parameters:
limit (Optional[
int
]) – The number of guilds to retrieve. IfNone
, it retrieves every guild you have access to. Note, however, that this would make it a slow operation. Defaults to100
.before (Union[
abc.Snowflake
,datetime.datetime
]) – Retrieves guilds before this date or object. If a date is provided it must be a timezone-naive datetime representing UTC time.after (Union[
abc.Snowflake
,datetime.datetime
]) – Retrieve guilds after this date or object. If a date is provided it must be a timezone-naive datetime representing UTC time.
- Raises:
discord.HTTPException – Getting the guilds failed.
- Yields:
Guild
– The guild with the guild data parsed.
- @slash_command(name=None, name_localizations=<Localizations: None>, description=None, description_localizations=<Localizations: None>, allow_dm=MISSING, allowed_contexts=MISSING, allowed_integration_types=MISSING, is_nsfw=MISSING, default_required_permissions=None, options=[], guild_ids=None, connector={}, option_descriptions={}, option_descriptions_localizations={}, base_name=None, base_name_localizations=<Localizations: None>, base_desc=None, base_desc_localizations=<Localizations: None>, group_name=None, group_name_localizations=<Localizations: None>, group_desc=None, group_desc_localizations=<Localizations: None>)
A decorator that adds a slash-command to the client. The function this is attached to must be a coroutine.
Warning
sync_commands
of theClient
instance must be set toTrue
to register a command if it does not already exist and update it if changes where made.Note
Any of the following parameters are only needed when the corresponding target was not used before (e.g. there is already a command in the code that has these parameters set) - otherwise it will replace the previous value or update it for iterables.
allow_dm
allowed_contexts
(update)allowed_integration_types
(update)is_nsfw
base_name_localizations
base_desc
base_desc_localizations
group_name_localizations
group_desc
group_desc_localizations
- Parameters:
name (Optional[
str
]) – The name of the command. Must only contain a-z, _ and - and be 1-32 characters long. Default to the functions name.name_localizations (Optional[
Localizations
]) – Localizations object for name field. Values follow the same restrictions asname
description (Optional[
str
]) – The description of the command shows up in the client. Must be between 1-100 characters long. Default to the functions docstring or “No Description”.description_localizations (Optional[
Localizations
]) – Localizations object for description field. Values follow the same restrictions asdescription
allow_dm (Optional[
bool
]) – Deprecated: Useallowed_contexts
instead. Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.allowed_contexts (Optional[List[
InteractionContextType
]]) – global commands only: The contexts in which the command is available. By default, commands are available in all contexts.allowed_integration_types (Optional[List[
AppIntegrationType
]]) – global commands only: The types of app integrations where the command is available. Default to the app’s configured integration typesis_nsfw (
bool
) –Whether this command is an NSFW command , default
False
.Note
Currently all sub-commands of a command that is marked as NSFW are NSFW too.
default_required_permissions (Optional[
Permissions
]) – Permissions that a Member needs by default to execute(see) the command.options (Optional[List[
SlashCommandOption
]]) – A list of max. 25 options for the command. If not provided the options will be generated usinggenerate_options()
that creates the options out of the function parameters. Required options must be listed before optional ones. Useoptions
to connect non-ascii option names with the parameter of the function.guild_ids (Optional[List[
int
]]) – ID’s of guilds this command should be registered in. If empty, the command will be global.connector (Optional[Dict[
str
,str
]]) – A dictionary containing the name of function-parameters as keys and the name of the option as values. Useful for using non-ascii Letters in your option names without getting ide-errors.option_descriptions (Optional[Dict[
str
,str
]]) –Descriptions the
generate_options()
should take for the Options that will be generated. The keys are thename
of the option and the value thedescription
.Note
This will only be used if
options
is not set.option_descriptions_localizations (Optional[Dict[
str
,Localizations
]]) – Localizeddescription
for the options. In the format{'option_name': Localizations(...)}
base_name (Optional[
str
]) – The name of the base-command(a-z, _ and -, 1-32 characters) if you want the command to be in a command-/sub-command-group. If the base-command does not exist yet, it will be added.base_name_localizations (Optional[
Localizations
]) – Localizedbase_name
’s for the command.base_desc (Optional[
str
]) – The description of the base-command(1-100 characters).base_desc_localizations (Optional[
Localizations
]) – Localizedbase_description
’s for the command.group_name (Optional[
str
]) – The name of the command-group(a-z, _ and -, 1-32 characters) if you want the command to be in a sub-command-group.group_name_localizations (Optional[
Localizations
]) – Localizedgroup_name
’s for the command.group_desc (Optional[
str
]) – The description of the sub-command-group(1-100 characters).group_desc_localizations (Optional[
Localizations
]) – Localizedgroup_desc
’s for the command.
- Raises:
TypeError – The function the decorator is attached to is not actual a coroutine or a parameter passed to
SlashCommandOption
is invalid for theoption_type
or theoption_type
itself is invalid.InvalidArgument – You passed
group_name
but nobase_name
.ValueError – Any of
name
,description
,options
,base_name
,base_desc
,group_name
orgroup_desc
is not valid.
- Returns:
If neither
guild_ids
norbase_name
passed: An instance ofSlashCommand
.If
guild_ids
and nobase_name
where passed: An instance ofGuildOnlySlashCommand
representing the guild-only slash-commands.If
base_name
and noguild_ids
where passed: An instance ofSubCommand
.If
base_name
andguild_ids
passed: instance ofGuildOnlySubCommand
representing the guild-only sub-commands.
- Return type:
Union[
SlashCommand
,GuildOnlySlashCommand
,SubCommand
,GuildOnlySubCommand
]
- @message_command(name=None, name_localizations=<Localizations: None>, default_required_permissions=None, allow_dm=True, allowed_contexts=MISSING, allowed_integration_types=MISSING, is_nsfw=False, guild_ids=None)
A decorator that registers a
MessageCommand
(shows up underApps
when right-clicking on a message) to the client. The function this is attached to must be a coroutine.Note
sync_commands
of theClient
instance must be set toTrue
to register a command if it does not already exit and update it if changes where made.- Parameters:
name (Optional[
str
]) – The name of the message-command, default to the functions name. Must be between 1-32 characters long.name_localizations (
Localizations
) – Localizedname
’s.default_required_permissions (Optional[
Permissions
]) – Permissions that a member needs by default to execute(see) the command.allow_dm (
bool
) – Deprecated: Useallowed_contexts
instead. Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.allowed_contexts (Optional[List[
InteractionContextType
]]) – global commands only: The contexts in which the command is available. By default, commands are available in all contexts.allowed_integration_types (Optional[List[
AppIntegrationType
]]) – global commands only: The types of app integrations where the command is available. Default to the app’s configured integration typesis_nsfw (
bool
) – Whether this command is an NSFW command , defaultFalse
.guild_ids (Optional[List[
int
]]) – ID’s of guilds this command should be registered in. If empty, the command will be global.
- Returns:
The message-command registered.
- Return type:
- Raises:
TypeError – The function the decorator is attached to is not actual a coroutine.
- @user_command(name=None, name_localizations=<Localizations: None>, default_required_permissions=None, allow_dm=True, allowed_contexts=MISSING, allowed_integration_types=MISSING, is_nsfw=False, guild_ids=None)
A decorator that registers a
UserCommand
(shows up underApps
when right-clicking on a user) to the client. The function this is attached to must be a coroutine.Note
sync_commands
of theClient
instance must be set toTrue
to register a command if it does not already exist and update it if changes where made.- Parameters:
name (Optional[
str
]) – The name of the user-command, default to the functions name. Must be between 1-32 characters long.name_localizations (
Localizations
) – Localizedname
’s.default_required_permissions (Optional[
Permissions
]) – Permissions that a member needs by default to execute(see) the command.allow_dm (
bool
) – Deprecated: Useallowed_contexts
instead. Indicates whether the command is available in DMs with the app, only for globally-scoped commands. By default, commands are visible.allowed_contexts (Optional[List[
InteractionContextType
]]) – global commands only: The contexts in which the command is available. By default, commands are available in all contexts.allowed_integration_types (Optional[List[
AppIntegrationType
]]) – global commands only: The types of app integrations where the command is available. Default to the app’s configured integration typesis_nsfw (
bool
) – Whether this command is an NSFW command , defaultFalse
.guild_ids (Optional[List[
int
]]) – ID’s of guilds this command should be registered in. If empty, the command will be global.
- Returns:
The user-command registered.
- Return type:
- Raises:
TypeError – The function the decorator is attached to is not actual a coroutine.
- @on_click(custom_id=None)
A decorator with which you can assign a function to a specific
Button
(or its custom_id).Important
The function this is attached to must take the same parameters as a
on_raw_button_click()
event.Warning
The func must be a coroutine, if not,
TypeError
is raised.- Parameters:
custom_id (Optional[Union[Pattern[AnyStr], AnyStr]]) –
If the
custom_id
of theButton
could not be used as a function name, or you want to give the function a different name then the custom_id use this one to set the custom_id. You can also specify a regex and if the custom_id matches it, the function will be executed.Note
As the
custom_id
is converted to a Pattern put^
in front and$
at the end of thecustom_id
if you want that the custom_id must exactly match the specified value. Otherwise, something like ‘cool blue Button is blue’ will let the function bee invoked too.
Example
# the button Button(label='Hey im a cool blue Button', custom_id='cool blue Button', style=ButtonStyle.blurple) # function that's called when the button pressed @client.on_click(custom_id='^cool blue Button$') async def cool_blue_button(i: discord.ComponentInteraction, button: Button): await i.respond(f'Hey you pressed a {button.custom_id}!', hidden=True)
- Return type:
The decorator for the function called when the button clicked
- Raises:
TypeError – The coroutine passed is not actually a coroutine.
- @on_select(custom_id=None)
A decorator with which you can assign a function to a specific
SelectMenu
(or its custom_id).Important
The function this is attached to must take the same parameters as a
on_raw_selection_select()
event.Warning
The func must be a coroutine, if not,
TypeError
is raised.- Parameters:
custom_id (Optional[Union[Pattern[AnyStr], AnyStr]] = None) –
If the custom_id of the
SelectMenu
could not be used as a function name, or you want to give the function a different name then the custom_id use this one to set the custom_id. You can also specify a regex and if the custom_id matches it, the function will be executed.Note
As the
custom_id
is converted to a Pattern put^
in front and$
at the end of thecustom_id
if you want that the custom_id must exactly match the specified value. Otherwise, something like ‘choose_your_gender later’ will let the function bee invoked too.
Example
# the SelectMenu SelectMenu(custom_id='choose_your_gender', options=[ SelectOption(label='Female', value='Female', emoji='♀️'), SelectOption(label='Male', value='Male', emoji='♂️'), SelectOption(label='Trans/Non Binary', value='Trans/Non Binary', emoji='⚧') ], placeholder='Choose your Gender') # function that's called when the SelectMenu is used @client.on_select() async def choose_your_gender(i: discord.Interaction, select_menu): await i.respond(f'You selected `{select_menu.values[0]}`!', hidden=True)
- Raises:
TypeError – The coroutine passed is not actually a coroutine.
- @on_submit(custom_id=None)
A decorator with which you can assign a function to a specific
Modal
(or its custom_id).Important
The function this is attached to must take the same parameters as a
on_modal_submit()
event.Warning
The func must be a coroutine, if not,
TypeError
is raised.- Parameters:
custom_id (Optional[Union[Pattern[AnyStr], AnyStr]]) –
If the
custom_id
of the modal could not be used as a function name, or you want to give the function a different name then the custom_id use this one to set the custom_id. You can also specify a regex and if the custom_id matches it, the function will be executed.Note
As the
custom_id
is converted to a Pattern put^
in front and$
at the end of thecustom_id
if you want that the custom_id must exactly match the specified value. Otherwise, something like ‘suggestions_modal_submit_private’ will let the function bee invoked too.
Examples
# the Modal Modal( title='Create a new suggestion', custom_id='suggestions_modal', components=[...] ) # function that's called when the Modal is submitted @client.on_submit(custom_id='^suggestions_modal$') async def suggestions_modal_callback(i: discord.ModalSubmitInteraction): ... # This can also be done based on the function name @client.on_submit() async def suggestions_modal(i: discord.ModalSubmitInteraction): ...
@client.on_submit(custom_id='^ticket_answer:(?P<id>[0-9]+)$') async def ticket_answer_callback(i: discord.ModalSubmitInteraction): user_id = int(i.match['id']) user = client.get_user(user_id) or await client.fetch_user(user_id)
- Raises:
TypeError – The coroutine passed is not actually a coroutine.
- property latency
Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds.
This could be referred to as the Discord WebSocket protocol latency.
- Type:
- is_ws_ratelimited()
bool
: Whether the websocket is currently rate limited.This can be useful to know when deciding whether you should query members using HTTP or via the gateway.
Added in version 1.6.
- property user
Represents the connected client.
None
if not logged in.- Type:
Optional[
ClientUser
]
- property guilds
The guilds that the connected client is a member of.
- Type:
List[
Guild
]
- property emojis
The emojis that the connected client has.
- Type:
List[
Emoji
]
- property stickers
The stickers that the connected client has.
- Type:
List[
Sticker
]
- property cached_messages
Read-only list of messages the connected client has cached.
Added in version 1.1.
- Type:
Sequence[
Message
]
- property private_channels
The private channels that the connected client is participating on.
Note
This returns only up to 128 most recent private channels due to an internal working on how Discord deals with private channels.
- Type:
List[
abc.PrivateChannel
]
- property voice_clients
Represents a list of voice connections.
These are usually
VoiceClient
instances.- Type:
List[
VoiceProtocol
]
- is_ready()
bool
: Specifies if the client’s internal cache is ready for use.
- await on_error(event_method, *args, **kwargs)
This function is a coroutine.
The default error handler provided by the client.
By default, this prints to
sys.stderr
however it could be overridden to have a different implementation. Checkon_error()
for more details.
- await on_application_command_error(cmd, interaction, exception)
This function is a coroutine.
The default error handler when an Exception was raised when invoking an application-command.
By default, this prints to
sys.stderr
however it could be overridden to have a different implementation. Checkon_application_command_error()
for more details.
- await request_offline_members(*guilds)
This function is a coroutine.
Requests previously offline members from the guild to be filled up into the
Guild.members
cache. This function is usually not called. It should only be used if you have thefetch_offline_members
parameter set toFalse
.When the client logs on and connects to the websocket, Discord does not provide the library with offline members if the number of members in the guild is larger than 250. You can check if a guild is large if
Guild.large
isTrue
.Warning
This method is deprecated. Use
Guild.chunk()
instead.- Parameters:
*guilds (
Guild
) – An argument list of guilds to request offline members for.- Raises:
.InvalidArgument – If any guild is unavailable in the collection.
- await before_identify_hook(shard_id, *, initial=False)
This function is a coroutine.
A hook that is called before IDENTIFYing a _session. This is useful if you wish to have more control over the synchronization of multiple IDENTIFYing clients.
The default implementation sleeps for 5 seconds.
Added in version 1.4.
- await login(token)
This function is a coroutine.
Logs in the client with the specified credentials.
This function can be used in two different ways.
- Parameters:
token (
str
) – The authentication token. Do not prefix this token with anything as the library will do it for you.- Raises:
.LoginFailure – The wrong credentials are passed.
.HTTPException – An unknown HTTP related error occurred, usually when it isn’t 200 or the known incorrect credentials passing status code.
- await logout()
This function is a coroutine.
Logs out of Discord and closes all connections.
Deprecated since version 1.7.
- await connect(*, reconnect=True)
This function is a coroutine.
Creates a websocket connection and lets the websocket listen to messages from Discord. This is a loop that runs the entire event system and miscellaneous aspects of the library. Control is not resumed until the WebSocket connection is terminated.
- Parameters:
reconnect (
bool
) – If we should attempt reconnecting, either due to internet failure or a specific failure on Discord’s part. Certain disconnects that lead to bad state will not be handled (such as invalid sharding payloads or bad tokens).- Raises:
.GatewayNotFound – If the gateway to connect to Discord is not found. Usually if this is thrown then there is a Discord API outage.
.ConnectionClosed – The websocket connection has been terminated.
- await close()
This function is a coroutine.
Closes the connection to Discord.
- clear()
Clears the internal state of the bot.
After this, the bot can be considered “re-opened”, i.e.
is_closed()
andis_ready()
both returnFalse
along with the bot’s internal cache cleared.
- await start(token, reconnect=True)
This function is a coroutine.
A shorthand coroutine for
login()
+connect()
.- Raises:
TypeError – An unexpected keyword argument was received.
- run(token, reconnect=True, *, log_handler=MISSING, log_formatter=MISSING, log_level=MISSING, root_logger=False)
A blocking call that abstracts away the event loop initialisation from you.
If you want more control over the event loop then this function should not be used. Use
start()
coroutine orconnect()
+login()
.Roughly Equivalent to:
try: loop.run_until_complete(start(*args, **kwargs)) except KeyboardInterrupt: loop.run_until_complete(close()) # cancel all tasks lingering finally: loop.close()
This function also sets up the :mod:`logging library to make it easier for beginners to know what is going on with the library. For more advanced users, this can be disabled by passing
None
to thelog_handler
parameter.Warning
This function must be the last function to call due to the fact that it is blocking. That means that registration of events or anything being called after this function call will not execute until it returns.
- Parameters:
token (
str
) – The authentication token. Do not prefix this token with anything as the library will do it for you.reconnect (
bool
) – If we should attempt reconnecting, either due to internet failure or a specific failure on Discord’s part. Certain disconnects that lead to bad state will not be handled (such as invalid sharding payloads or bad tokens).log_handler (Optional[
logging.Handler
]) – The log handler to use for the library’s logger. If this isNone
then the library will not set up anything logging related. Logging will still work ifNone
is passed, though it is your responsibility to set it up. The default log handler if not provided islogging.StreamHandler
.log_formatter (
logging.Formatter
) – The formatter to use with the given log handler. If not provided then it defaults to a colour based logging formatter (if available).log_level (
int
) – The default log level for the library’s logger. This is only applied if thelog_handler
parameter is notNone
. Defaults tologging.INFO
.root_logger (
bool
) – Whether to set up the root logger rather than the library logger. By default, only the library logger ('discord'
) is set up. If this is set toTrue
then the root logger is set up as well. Defaults toFalse
.
- is_closed()
bool
: Indicates if the websocket connection is closed.
- property activity
The activity being used upon logging in.
- Type:
Optional[
BaseActivity
]
- property allowed_mentions
The allowed mention configuration.
Added in version 1.4.
- Type:
Optional[
AllowedMentions
]
- property users
Returns a list of all the users the bot can see.
- Type:
List[
User
]
- get_channel(id)
Returns a channel with the given ID.
- Parameters:
id (
int
) – The ID to search for.- Returns:
The returned channel or
None
if not found.- Return type:
Optional[Union[
abc.GuildChannel
,abc.PrivateChannel
]]
- get_partial_messageable(id, *, guild_id=None, type=None)
Returns a
PartialMessageable
with the given channel ID. This is useful if you have the ID of a channel but don’t want to do an API call to send messages to it.- Parameters:
id (
int
) – The channel ID to create aPartialMessageable
for.guild_id (Optional[
int
]) – The optional guild ID to create aPartialMessageable
for. This is not required to actually send messages, but it does allow thejump_url()
andguild
properties to function properly.type (Optional[
ChannelType
]) – The underlying channel type for thePartialMessageable
.
- Returns:
The partial messageable created
- Return type:
- for ... in get_all_channels()
A generator that retrieves every
abc.GuildChannel
the client can ‘access’.This is equivalent to:
for guild in client.guilds: for channel in guild.channels: yield channel
Note
Just because you receive a
abc.GuildChannel
does not mean that you can communicate in said channel.abc.GuildChannel.permissions_for()
should be used for that.- Yields:
abc.GuildChannel
– A channel the client can ‘access’.
- for ... in get_all_members()
Returns a generator with every
Member
the client can see.This is equivalent to:
for guild in client.guilds: for member in guild.members: yield member
- Yields:
Member
– A member the client can see.
- await wait_until_ready()
This function is a coroutine.
Waits until the client’s internal cache is all ready.
- wait_for(event, *, check=None, timeout=None)
This function is a coroutine.
Waits for a WebSocket event to be dispatched.
This could be used to wait for a user to reply to a message, or to react to a message, or to edit a message in a self-contained way.
The
timeout
parameter is passed ontoasyncio.wait_for()
. By default, it does not timeout. Note that this does propagate theasyncio.TimeoutError
for you in case of timeout and is provided for ease of use.In case the event returns multiple arguments, a
tuple
containing those arguments is returned instead. Please check the documentation for a list of events and their parameters.This function returns the first event that meets the requirements.
Examples
Waiting for a user reply:
@client.event async def on_message(message): if message.content.startswith('$greet'): channel = message.channel await channel.send('Say hello!') def check(m): return m.content == 'hello' and m.channel == channel msg = await client.wait_for('message', check=check) await channel.send('Hello {.author}!'.format(msg))
Waiting for a thumbs up reaction from the message author:
@client.event async def on_message(message): if message.content.startswith('$thumb'): channel = message.channel await channel.send('Send me that 👍 reaction, mate') def check(reaction, user): return user == message.author and str(reaction.emoji) == '👍' try: reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check) except asyncio.TimeoutError: await channel.send('👎') else: await channel.send('👍')
- Parameters:
event (
str
) – The event name, similar to the event reference, but without theon_
prefix, to wait for.check (Optional[Callable[…,
bool
]]) – A predicate to check what to wait for. The arguments must meet the parameters of the event being waited for.timeout (Optional[
float
]) – The number of seconds to wait before timing out and raisingasyncio.TimeoutError
.
- Raises:
asyncio.TimeoutError – If a timeout is provided, and it was reached.
- Returns:
Returns no arguments, a single argument, or a
tuple
of multiple arguments that mirrors the parameters passed in the event reference.- Return type:
Any
- activity_primary_entry_point_command(name='launch', name_localizations=<Localizations: None>, description='', description_localizations=<Localizations: None>, default_required_permissions=None, allowed_contexts=None, allowed_integration_types=None, is_nsfw=False)
A decorator that sets the handler function for the primary entry point of an activity.
This overwrites the default activity command created by Discord.
Note
If you only want to change the name, description, permissions, etc. of the default activity command, use
update_activity_command()
instead.- Parameters:
name (Optional[
str
]) – The name of the activity command. Default to ‘launch’.name_localizations (
Localizations
) – Localizedname
’s.description (
str
) – The description of the activity command.description_localizations (
Localizations
) – Localizeddescription
’s.default_required_permissions (Optional[
Permissions
]) – Permissions that a member needs by default to execute(see) the command.allowed_contexts (Optional[List[
InteractionContextType
]]) – The contexts in which the command is available. By default, commands are available in all contexts.allowed_integration_types (Optional[List[
AppIntegrationType
]]) – global commands only: The types of app integrations where the command is available. Default to the app’s configured integration typesis_nsfw (
bool
) – Whether this command is an NSFW command, defaultFalse
.
- Returns:
The activity command to be registered as the primary entry point.
- Return type:
ActivityEntryPointCommand
- Raises:
TypeError – The function the decorator is attached to is not actual a coroutine.
- property application_commands
Returns a list of any application command that is registered for the bot`
- Type:
List[
ApplicationCommand
]
- property global_application_commands
Returns a list of all global application commands that are registered for the bot
Note
This requires the bot running and all commands cached, otherwise the list will be empty
- Returns:
A list of registered global application commands for the bot
- Return type:
List[
ApplicationCommand
]
- await change_presence(*, activity=None, status='online')
This function is a coroutine.
Changes the client’s presence.
Changed in version 2.0: Removed the
afk
parameterExample
game = discord.Game("with the API") await client.change_presence(status=discord.Status.idle, activity=game)
- Parameters:
activity (Optional[
BaseActivity
]) – The activity being done.None
if no currently active activity is done.status (Optional[
Status
]) – Indicates what status to change to. IfNone
, thenStatus.online
is used.
- Raises:
.InvalidArgument – If the
activity
parameter is not the proper type.
- await fetch_template(code)
This function is a coroutine.
Gets a
Template
from a discord.new URL or code.
- await fetch_guild(guild_id)
This function is a coroutine.
Retrieves a
Guild
from an ID.Note
Using this, you will not receive
Guild.channels
,Guild.members
,Member.activity
andMember.voice
perMember
.Note
This method is an API call. For general usage, consider
get_guild()
instead.
- await create_guild(name, region=None, icon=None, *, code=None)
This function is a coroutine.
Creates a
Guild
.Bot accounts in more than 10 guilds are not allowed to create guilds.
- Parameters:
name (
str
) – The name of the guild.region (
VoiceRegion
) – The region for the voice communication server. Defaults toVoiceRegion.us_west
.icon (
bytes
) – The bytes-like object representing the icon. SeeClientUser.edit()
for more details on what is expected.code (Optional[
str
]) –The code for a template to create the guild with.
Added in version 1.4.
- Raises:
.HTTPException – Guild creation failed.
.InvalidArgument – Invalid icon image format given. Must be PNG or JPG.
- Returns:
The guild created. This is not the same guild that is added to cache.
- Return type:
- await fetch_invite(url, *, with_counts=True)
This function is a coroutine.
Gets an
Invite
from a discord.gg URL or ID.Note
If the invite is for a guild you have not joined, the guild and channel attributes of the returned
Invite
will bePartialInviteGuild
andPartialInviteChannel
respectively.- Parameters:
url (Union[
Invite
,str
]) – The Discord invite ID or URL (must be a discord.gg URL).with_counts (
bool
) – Whether to include count information in the invite. This fills theInvite.approximate_member_count
andInvite.approximate_presence_count
fields.
- Raises:
.NotFound – The invite has expired or is invalid.
.HTTPException – Getting the invite failed.
- Returns:
The invite from the URL/ID.
- Return type:
- await delete_invite(invite)
This function is a coroutine.
Revokes an
Invite
, URL, or ID to an invite.You must have the
manage_channels
permission in the associated guild to do this.
- await fetch_widget(guild_id)
This function is a coroutine.
Gets a
Widget
from a guild ID.Note
The guild must have the widget enabled to get this information.
- await application_info()
This function is a coroutine.
Retrieves the bot’s application information.
- Raises:
.HTTPException – Retrieving the information failed somehow.
- Returns:
The bot’s application information.
- Return type:
- await fetch_user(user_id)
This function is a coroutine.
Retrieves a
User
based on their ID. This can only be used by bot accounts. You do not have to share any guilds with the user to get this information, however many operations do require that you do.Note
This method is an API call. If you have
Intents.members
and member cache enabled, considerget_user()
instead.
- await fetch_channel(channel_id)
This function is a coroutine.
Retrieves a
abc.GuildChannel
orabc.PrivateChannel
with the specified ID.Note
This method is an API call. For general usage, consider
get_channel()
instead.Added in version 1.2.
- Raises:
.InvalidData – An unknown channel type was received from Discord.
.HTTPException – Retrieving the channel failed.
.NotFound – Invalid Channel ID.
.Forbidden – You do not have permission to fetch this channel.
- Returns:
The channel from the ID.
- Return type:
Union[
abc.GuildChannel
,abc.PrivateChannel
]
- await fetch_webhook(webhook_id)
This function is a coroutine.
Retrieves a
Webhook
with the specified ID.- Raises:
.HTTPException – Retrieving the webhook failed.
.NotFound – Invalid webhook ID.
.Forbidden – You do not have permission to fetch this webhook.
- Returns:
The webhook you requested.
- Return type:
- await fetch_all_nitro_stickers()
This function is a coroutine.
Retrieves a
list
with all build-inStickerPack
‘s.- Returns:
A list containing all build-in sticker-packs.
- Return type:
- await fetch_voice_regions()
This function is a coroutine.
Returns a list of
VoiceRegionInfo
that can be used when creating or editing aVoiceChannel
orStageChannel
’s region.Note
This method is an API call. For general usage, consider using the
VoiceRegion
enum instead.- Returns:
The voice regions that can be used.
- Return type:
List[
VoiceRegionInfo
]
- await create_test_entitlement(sku_id, target, owner_type=MISSING)
This function is a coroutine.
Note
This method is only temporary and probably will be removed with or even before a stable v2 release as discord is already redesigning the testing system based on developer feedback.
See https://github.com/discord/discord-api-docs/pull/6502 for more information.
Creates a test entitlement to a given
SKU
for a given guild or user. Discord will act as though that user or guild has entitlement to your premium offering.After creating a test entitlement, you’ll need to reload your Discord client. After doing so, you’ll see that your server or user now has premium access.
- Parameters:
sku_id (
int
) – The ID of the SKU to create a test entitlement for.target (Union[
User
,Guild
,Snowflake
]) –The target to create a test entitlement for.
This can be a user, guild or just the ID, if so the owner_type parameter must be set.
owner_type (
str
) – The type of thetarget
, could beguild
oruser
.
- Returns:
The created test entitlement.
- Return type:
- await delete_test_entitlement(entitlement_id)
This function is a coroutine.
Note
This method is only temporary and probably will be removed with or even before a stable v2 release as discord is already redesigning the testing system based on developer feedback.
See https://github.com/discord/discord-api-docs/pull/6502 for more information.
Deletes a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering.
- Parameters:
entitlement_id (
int
) – The ID of the entitlement to delete.
- await fetch_entitlements(*, limit=100, user=None, guild=None, sku_ids=None, before=None, after=None, exclude_ended=False)
This function is a coroutine.
- Parameters:
limit (
int
) – The maximum amount of entitlements to fetch. Defaults to100
.user (Optional[
User
]) – The user to fetch entitlements for.guild (Optional[
Guild
]) – The guild to fetch entitlements for.sku_ids (Optional[List[
int
]]) – Optional list of SKU IDs to check entitlements forbefore (Optional[Union[
datetime.datetime
,Snowflake
]]) – Retrieve entitlements before this date or object. If a date is provided it must be a timezone-naive datetime representing UTC time.after (Optional[Union[
datetime.datetime
,Snowflake
]]) – Retrieve entitlements after this date or object. If a date is provided it must be a timezone-naive datetime representing UTC time.exclude_ended (
bool
) – Whether ended entitlements should be fetched or not. Defaults toFalse
.
- Returns:
An iterator to fetch all entitlements for the current application.
- Return type:
- await consume_entitlement(entitlement_id)
This function is a coroutine.
For one-time purchase
consumable
SKUs, marks a given entitlement for the user as consumed.consumed
will beFalse
for this entitlement when usingfetch_entitlements()
.- Parameters:
entitlement_id (
int
) – The ID of the entitlement to consume.
- await update_primary_entry_point_command(name=MISSING, name_localizations=MISSING, description=MISSING, description_localizations=MISSING, default_required_permissions=MISSING, allowed_contexts=MISSING, allowed_integration_types=MISSING, is_nsfw=MISSING, handler=MISSING)
This function is a coroutine.
Update the :ddocs:`primary entry point command <interactions/application-commands#entry-point-commands>`_ of the application.
If you don’t want to handle the command, set
handler
toEntryPointHandlerType.discord
- Parameters:
name (Optional[
str
]) – The name of the activity command.name_localizations (
Localizations
) – Localizedname
’s.description (Optional[
str
]) – The description of the activity command.description_localizations (
Localizations
) – Localizeddescription
’s.default_required_permissions (Optional[
Permissions
]) – Permissions that a member needs by default to execute(see) the command.allowed_contexts (Optional[List[
InteractionContextType
]]) – The contexts in which the command is available. By default, commands are available in all contexts.allowed_integration_types (Optional[List[
AppIntegrationType
]]) – The types of app integrations where the command is available. Default to the app’s configured integration typesis_nsfw (
bool
) – Whether this command is an NSFW command , defaultFalse
.handler (
EntryPointHandlerType
) – The handler for the primary entry point command. Default toEntryPointHandlerType.discord
, unlessactivity_primary_entry_point_command
is set.
- Returns:
The updated primary entry point command.
- Return type:
ActivityEntryPointCommand
- Raises:
HTTPException – Editing the command failed.
AutoShardedClient
- asyncchange_presence
- asyncclose
- asyncconnect
- defget_shard
- defis_ws_ratelimited
- asyncrequest_offline_members
- class discord.AutoShardedClient(*args, loop=None, **kwargs)
Bases:
Client
A client similar to
Client
except it handles the complications of sharding for the user into a more manageable and transparent single process bot.When using this client, you will be able to use it as-if it was a regular
Client
with a single shard when implementation wise internally it is split up into multiple shards. This allows you to not have to deal with IPC or other complicated infrastructure.It is recommended to use this client only if you have surpassed at least 1000 guilds.
If no
shard_count
is provided, then the library will use the Bot Gateway endpoint call to figure out how many shards to use.If a
shard_ids
parameter is given, then those shard IDs will be used to launch the internal shards. Note thatshard_count
must be provided if this is used. By default, when omitted, the client will launch shards from 0 toshard_count - 1
.- shard_ids
An optional list of shard_ids to launch the shards with.
- Type:
Optional[List[
int
]]
- property latency
Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds.
This operates similarly to
Client.latency()
except it uses the average latency of every shard’s latency. To get a list of shard latency, check thelatencies
property. Returnsnan
if there are no shards ready.- Type:
- property latencies
A list of latencies between a HEARTBEAT and a HEARTBEAT_ACK in seconds.
This returns a list of tuples with elements
(shard_id, latency)
.
- get_shard(shard_id)
Optional[
ShardInfo
]: Gets the shard information at a given shard ID orNone
if not found.
- property shards
Returns a mapping of shard IDs to their respective info object.
- Type:
Mapping[int,
ShardInfo
]
- await request_offline_members(*guilds)
This function is a coroutine.
Requests previously offline members from the guild to be filled up into the
Guild.members
cache. This function is usually not called. It should only be used if you have thefetch_offline_members
parameter set toFalse
.When the client logs on and connects to the websocket, Discord does not provide the library with offline members if the number of members in the guild is larger than 250. You can check if a guild is large if
Guild.large
isTrue
.Warning
This method is deprecated. Use
Guild.chunk()
instead.- Parameters:
*guilds (
Guild
) – An argument list of guilds to request offline members for.- Raises:
InvalidArgument – If any guild is unavailable in the collection.
- await connect(*, reconnect=True)
This function is a coroutine.
Creates a websocket connection and lets the websocket listen to messages from Discord. This is a loop that runs the entire event system and miscellaneous aspects of the library. Control is not resumed until the WebSocket connection is terminated.
- Parameters:
reconnect (
bool
) – If we should attempt reconnecting, either due to internet failure or a specific failure on Discord’s part. Certain disconnects that lead to bad state will not be handled (such as invalid sharding payloads or bad tokens).- Raises:
.GatewayNotFound – If the gateway to connect to Discord is not found. Usually if this is thrown then there is a Discord API outage.
.ConnectionClosed – The websocket connection has been terminated.
- await close()
This function is a coroutine.
Closes the connection to Discord.
- await change_presence(*, activity=None, status=None, afk=False, shard_id=None)
This function is a coroutine.
Changes the client’s presence.
Example:
game = discord.Game("with the API") await client.change_presence(status=discord.Status.idle, activity=game)
- Parameters:
activity (Optional[
BaseActivity
]) – The activity being done.None
if no currently active activity is done.status (Optional[
Status
]) – Indicates what status to change to. IfNone
, thenStatus.online
is used.afk (
bool
) – Indicates if you are going AFK. This allows the discord client to know how to handle push notifications better for you in case you are actually idle and not lying.shard_id (Optional[
int
]) – The shard_id to change the presence to. If not specified orNone
, then it will change the presence of every shard the bot can see.
- Raises:
InvalidArgument – If the
activity
parameter is not of proper type.
- is_ws_ratelimited()
bool
: Whether the websocket is currently rate limited.This can be useful to know when deciding whether you should query members using HTTP or via the gateway.
This implementation checks if any of the shards are rate limited. For more granular control, consider
ShardInfo.is_ws_ratelimited()
.Added in version 1.6.