Crate serenity[][src]

Serenity is a Rust library for the Discord API.

View the examples on how to make and structure a bot.

Serenity supports bot user authentication via the use of Client::new.

Once logged in, you may add handlers to your client to dispatch Events, such as Client::on_message. This will cause your handler to be called when a Event::MessageCreate is received. Each handler is given a Context, giving information about the event. See the client's module-level documentation.

The Shard is transparently handled by the library, removing unnecessary complexity. Sharded connections are automatically handled for you. See the gateway's documentation for more information.

A 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 sanctioned by Discord, refer to their own documentation.

Example Bot

A basic ping-pong bot looks like:

#[macro_use] extern crate serenity;

use serenity::client::{Client, EventHandler};
use serenity::framework::standard::StandardFramework;
use std::env;

struct Handler;

impl EventHandler for Handler {}

pub fn main() {
    // Login with a bot token from the environment
    let mut client = Client::new(&env::var("DISCORD_TOKEN").expect("token"), Handler)
        .expect("Error creating client");

        .configure(|c| c.prefix("~")) // set the bot's prefix to "~"
        .cmd("ping", ping));

    // start listening for events by starting a single shard
    if let Err(why) = client.start() {
        println!("An error occurred while running the client: {:?}", why);

command!(ping(_context, message) {
    let _ = message.reply("Pong!");

Full Examples

Full examples, detailing and explaining usage of the basic functionality of the library, can be found in the examples directory.


Add the following to your Cargo.toml file:

serenity = "0.5"

and to the top of your

#[macro_use] extern crate serenity;


pub use client::Client;



A set of builders used to make using methods on certain structs simpler to use.


A cache of events received over a Shard, where storing at least some data from the event is possible.


The Client contains information about a single bot or user's token, as well as event handlers. Dispatching events to configured handlers and starting the shards' connections are handled directly via the client. In addition, the http module and Cache are also automatically handled by the Client module for you.


A set of constants used by the library.


The framework is a customizable method of separating commands.


The gateway module contains the pieces - primarily the Shard - responsible for maintaing a WebSocket connection with Discord.


The HTTP module which provides functions for performing requests to endpoints in Discord's API.


Mappings of objects received from the API, with optional helper methods for ease of use.


A set of exports which can be helpful to use.


A set of utilities to help with common use cases that are not required to fully use the library.


A module for connecting to voice channels.



A convenience macro for generating a struct fulfilling the Command trait.



A mutable and lazily-initialized static binding. It can be accessed across any function and in any context.



A common error enum returned by most of the library's functionality within a custom Result.

Type Definitions


The common result type between most library functions.