Serenity is a Rust library for the Discord API.
View the examples on how to make and structure a bot.
Serenity supports bot login via the use of
You may also check your tokens prior to login via the use of
Once logged in, you may add handlers to your client to dispatch
by implementing the handlers in a trait, such as
This will cause your handler to be called when a
received. Each handler is given a
Context, giving information about the
event. See the client's module-level documentation.
Cache is also provided for you. This will be updated automatically for
you as data is received from the Discord API via events. When calling a
method on a
Context, the cache will first be searched for relevant data
to avoid unnecessary HTTP requests to the Discord API. For more information,
see the cache's module-level documentation.
Note that - although this documentation will try to be as up-to-date and accurate as possible - Discord hosts official documentation. If you need to be sure that some information piece is accurate, refer to their docs.
A basic ping-pong bot looks like:
use async_trait; use ; use Message; use ; use env; ; ; async async
Full examples, detailing and explaining usage of the basic functionality of the
library, can be found in the
Add the following to your
 = "0.9"
Serenity supports a minimum of Rust 1.40.
Features can be enabled or disabled by configuring the library through Cargo.toml:
 = false = ["pick", "your", "feature", "names", "here"] = "0.9"
The default features are:
The following is a full list of features:
- builder: The builders used in conjunction with models' methods.
- cache: The cache will store information about guilds, channels, users, and other data, to avoid performing REST requests. If you are low on RAM, do not enable this.
- collector: A collector awaits events, such as receiving a message from a user or reactions on a message, and allows for responding to the events in a convenient fashion. Collectors can be configured to enforce certain critera the events must meet.
- client: A manager for shards and event handlers, abstracting away the work of handling shard events and updating the cache, if enabled.
- framework: Enables the framework, which is a utility to allow simple command parsing, before/after command execution, prefix setting, and more.
- gateway: A Shard, used as a higher-level interface for communicating with the Discord gateway over a WebSocket client.
- http: Functions providing a wrapper over Discord's REST API at a low enough level that optional parameters can be provided at will via a JsonMap.
- model: Method implementations for models, acting as helper methods over the HTTP functions.
- standard_framework: A standard, default implementation of the Framework
- utils: Utility functions for common use cases by users.
- voice: Enables compilation of voice support, so that voice channels can be connected to and audio can be sent/received.
- default_native_tls: Default features but using
- absolute_ratelimits: Whether the library should use your system clock to avoid ratelimits, or use the interval given by Discord that might be less efficient due to latency in the network. If you turn this feature on, it is recommended to synchronise your clock with an NTP server (such as Google's).
Serenity offers two TLS-backends,
rustls_backend by default, you need to pick
one if you do not use the default features:
- rustls_backend: Uses Rustls for all platforms, a pure Rust TLS implementation.
- native_tls_backend: Uses SChannel on Windows, Secure Transport on macOS, and OpenSSL on other platforms.
If you want all of the default features except for
cache for example, you can
list all but that:
 = false = [ "builder", "client", "framework", "gateway", "http", "model", "standard_framework", "utils", "rustls_backend", ] = "0.9"
If you use the
native_tls_backend and you are not developing on macOS or Windows, you will need:
If you want to use
voice, Serenity will attempt to build these for you:
- libsodium (Arch:
- opus (Arch:
In case the automated building fails, you may report it to us, but installing should fix it.
Voice + ffmpeg:
- ffmpeg (Arch:
Voice + youtube-dl:
- youtube-dl (Arch: