Welcome to discord-ws!¶
discord-ws
is a minimal, asynchronous Python wrapper for the Discord Gateway API.
Note
This library is not associated with discord-ws on PyPI, which is written by a different author. For now, there are no plans to release this package on PyPI.
Features¶
Fully implements Discord’s connection lifecycle
Allows receiving JSON-encoded payloads (not ETF)
Can switch between plain text and zlib transport compression
Provides access to raw dispatch events via callback mechanism
Usage¶
Assuming you have Python 3.11+ and Git installed, you can install this library with:
pip install git+https://github.com/thegamecracks/discord-ws
If you want to test out the library without writing a script, create a bot on Discord’s Developer Portal, copy your bot token, and try out the built-in CLI:
python -m discord_ws --standard-intents --zlib-stream
If you do want to write a script, import the library and use the
Client
class to establish a connection yourself:
import asyncio
import discord_ws
client = discord_ws.Client(
token="Bot YOUR_TOKEN_HERE",
intents=discord_ws.Intents.standard(),
)
@client.on_dispatch
async def handle_event(event: discord_ws.DispatchEvent):
... # Do something with the events received from Discord
asyncio.run(client.run())
Resources¶
GitHub Repository: https://github.com/thegamecracks/discord-ws
Discord Docs: https://discord.com/developers/docs/topics/gateway
License¶
This project is written under the MIT license.
Client API Reference¶
- class discord_ws.Client¶
Bases:
object
The websocket client for connecting to the Discord Gateway.
Public Data Attributes:
gateway_url
The URL to use when connecting to the gateway.
token
The token to use for authenticating with the gateway.
intents
The gateway intents to use when identifying with the gateway.
user_agent
The user agent used when connecting to the gateway.
compress
If true, zlib transport compression will be enabled for data received by Discord.
large_threshold
The threshold where offline guild members are no longer sent, provided when identifying with the gateway.
presence
The presence for the client to use when identifying to the gateway.
shard
The shard identifier used for routing traffic.
Public Methods:
__init__
(*, token, intents[, gateway_url, ...])on_dispatch
(func)Sets the callback function to invoke when an event is dispatched.
run
(*[, reconnect])Begins and maintains a connection to the gateway.
set_presence
(presence, *[, persistent])Sets the bot's presence for the current connection, if any.
close
()Gracefully closes the current connection.
- __init__(*, token: str, intents: Intents, gateway_url: str | None = None, user_agent: str | None = None, compress: bool = True, large_threshold: int | None = None, presence: GatewayPresenceUpdate | None = None, shard: Shard | None = None) None ¶
- Parameters:
token – The token to use for authenticating with the gateway.
intents – The gateway intents to use when identifying with the gateway.
gateway_url – The URL to use when connecting to the gateway. If this is not provided, it will automatically be fetched from the Get Gateway HTTP endpoint during
Client.run()
.user_agent – An optional user agent used when connecting to the gateway, overriding the library’s default.
compress – If true, zlib transport compression will be enabled for data received by Discord. This is distinct from payload compression which is not implemented by this library.
large_threshold – The threshold where offline guild members are no longer sent, provided when identifying with the gateway.
presence – An optional presence for the client to use when identifying to the gateway.
shard –
The shard identifier used for routing traffic.
Added in version unreleased.
- gateway_url: str | None¶
The URL to use when connecting to the gateway.
If this is not provided, it will automatically be fetched from the Get Gateway HTTP endpoint during
Client.run()
.
- compress: bool¶
If true, zlib transport compression will be enabled for data received by Discord.
This is distinct from payload compression which is not implemented by this library.
- large_threshold: int | None¶
The threshold where offline guild members are no longer sent, provided when identifying with the gateway.
- presence: GatewayPresenceUpdate | None¶
The presence for the client to use when identifying to the gateway.
- on_dispatch(func: Callable[[DispatchEvent], Any] | None) Callable[[DispatchEvent], Any] | None ¶
Sets the callback function to invoke when an event is dispatched.
This can be a coroutine function or return an awaitable object.
- async run(*, reconnect: bool = True) None ¶
Begins and maintains a connection to the gateway.
Use the
close()
method to gracefully close the connection.This method may raise an
ExceptionGroup
so it is recommended to handle errors usingexcept*
syntax.- Parameters:
reconnect – If True, this method will reconnect to Discord where possible.
- Raises:
AuthenticationFailedError – The client’s token was incorrect. Can be raised even if reconnect is True.
ConnectionClosedError – An error caused the connection to close. Certain error codes can raise this even if reconnect is True.
GatewayReconnect – The gateway has asked us to reconnect. Only raised when reconnect is False.
HeartbeatLostError – The gateway failed to acknowledge our heartbeat. Only raised when reconnect is False.
PrivilegedIntentsError – The client requested privileged intents that were not enabled. Can be raised even if reconnect is True.
SessionInvalidated – The gateway has invalidated our session. Only raised when reconnect is False.
- class discord_ws.DispatchEvent¶
Bases:
TypedDict
Represents a dispatch event between the client and Discord gateway.
- class discord_ws.Shard¶
Bases:
NamedTuple
A pair indicating which shard a connection belongs to.
This determines which guilds a connection will receive events from, according to the formula
shard_id = (guild_id >> 22) % num_shards
. Shard ID 0 will also receive events from DMs.shard_id
doesn’t necessarily have to be unique, nor doesnum_shards
have to be the same across all connections.Added in version unreleased.
Gateway Intents¶
- class discord_ws.Intents¶
Bases:
IntFlag
A set of event types that the client can ask to be received when identifying with the gateway.
- GUILDS = 1¶
Corresponds with the following events:
GUILD_CREATE
GUILD_UPDATE
GUILD_DELETE
GUILD_ROLE_CREATE
GUILD_ROLE_UPDATE
GUILD_ROLE_DELETE
CHANNEL_CREATE
CHANNEL_UPDATE
CHANNEL_DELETE
CHANNEL_PINS_UPDATE
THREAD_CREATE
THREAD_UPDATE
THREAD_DELETE
THREAD_LIST_SYNC
THREAD_MEMBER_UPDATE
THREAD_MEMBERS_UPDATE *
STAGE_INSTANCE_CREATE
STAGE_INSTANCE_UPDATE
STAGE_INSTANCE_DELETE
- GUILD_MEMBERS = 2¶
Corresponds with the following events:
GUILD_MEMBER_ADD
GUILD_MEMBER_UPDATE
GUILD_MEMBER_REMOVE
THREAD_MEMBERS_UPDATE *
- GUILD_MODERATION = 4¶
Corresponds with the following events:
GUILD_AUDIT_LOG_ENTRY_CREATE
GUILD_BAN_ADD
GUILD_BAN_REMOVE
- GUILD_EMOJIS_AND_STICKERS = 8¶
Corresponds with the following events:
GUILD_EMOJIS_UPDATE
GUILD_STICKERS_UPDATE
- GUILD_INTEGRATIONS = 16¶
Corresponds with the following events:
GUILD_INTEGRATIONS_UPDATE
INTEGRATION_CREATE
INTEGRATION_UPDATE
INTEGRATION_DELETE
- GUILD_WEBHOOKS = 32¶
Corresponds with the following events:
WEBHOOKS_UPDATE
- GUILD_INVITES = 64¶
Corresponds with the following events:
INVITE_CREATE
INVITE_DELETE
- GUILD_VOICE_STATES = 128¶
Corresponds with the following events:
VOICE_STATE_UPDATE
- GUILD_PRESENCES = 256¶
Corresponds with the following events:
PRESENCE_UPDATE
- GUILD_MESSAGES = 512¶
Corresponds with the following events:
MESSAGE_CREATE
MESSAGE_UPDATE
MESSAGE_DELETE
MESSAGE_DELETE_BULK
- GUILD_MESSAGE_REACTIONS = 1024¶
Corresponds with the following events:
MESSAGE_REACTION_ADD
MESSAGE_REACTION_REMOVE
MESSAGE_REACTION_REMOVE_ALL
MESSAGE_REACTION_REMOVE_EMOJI
- __new__(value)¶
- GUILD_MESSAGE_TYPING = 2048¶
Corresponds with the following events:
TYPING_START
- DIRECT_MESSAGES = 4096¶
Corresponds with the following events:
MESSAGE_CREATE
MESSAGE_UPDATE
MESSAGE_DELETE
CHANNEL_PINS_UPDATE
- DIRECT_MESSAGE_REACTIONS = 8192¶
Corresponds with the following events:
MESSAGE_REACTION_ADD
MESSAGE_REACTION_REMOVE
MESSAGE_REACTION_REMOVE_ALL
MESSAGE_REACTION_REMOVE_EMOJI
- DIRECT_MESSAGE_TYPING = 16384¶
Corresponds with the following events:
TYPING_START
- MESSAGE_CONTENT = 32768¶
Provides data for events that contain message content fields.
- GUILD_SCHEDULED_EVENTS = 65536¶
Corresponds with the following events:
GUILD_SCHEDULED_EVENT_CREATE
GUILD_SCHEDULED_EVENT_UPDATE
GUILD_SCHEDULED_EVENT_DELETE
GUILD_SCHEDULED_EVENT_USER_ADD
GUILD_SCHEDULED_EVENT_USER_REMOVE
- AUTO_MODERATION_CONFIGURATION = 1048576¶
Corresponds with the following events:
AUTO_MODERATION_RULE_CREATE
AUTO_MODERATION_RULE_UPDATE
AUTO_MODERATION_RULE_DELETE
- AUTO_MODERATION_EXECUTION = 2097152¶
Corresponds with the following events:
AUTO_MODERATION_ACTION_EXECUTION
Exceptions¶
- class discord_ws.ConnectionClosedError¶
Bases:
ClientError
,ConnectionError
An error caused the connection to close.
- class discord_ws.AuthenticationFailedError¶
Bases:
ConnectionClosedError
The client failed to authenticate with Discord.
- class discord_ws.PrivilegedIntentsError¶
Bases:
ConnectionClosedError
The client requested privileged intents that were not enabled.
- class discord_ws.GatewayInterrupt¶
Bases:
ClientError
The client has been asked by the gateway to interrupt the current connection.
This exception and its subclasses are expected to be raised during normal operation, and should not impact the client’s ability to reconnect to the gateway.
- class discord_ws.GatewayReconnect¶
Bases:
GatewayInterrupt
The client has been asked to reconnect to the gateway.
This corresponds with the Reconnect (7) opcode.
- class discord_ws.SessionInvalidated¶
Bases:
GatewayInterrupt
The client’s session has been invalidated by the gateway.
This corresponds with the Invalid Session (9) opcode.
- class discord_ws.HeartbeatLostError¶
Bases:
ClientError
A heartbeat acknowledgement from the server was missed.