1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
//! 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::builder`].
//!
//! Once logged in, you may add handlers to your client to dispatch [`Event`]s, such as
//! [`EventHandler::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][gateway docs]
//! 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][cache docs].
//!
//! Note that, although this documentation will try to be as up-to-date and accurate as possible,
//! Discord hosts [official documentation][docs]. If you need to be sure that some information
//! piece is sanctioned by Discord, refer to their own documentation.
//!
//! ### Full Examples
//!
//! Full examples, detailing and explaining usage of the basic functionality of the library, can be
//! found in the [`examples`] directory.
//!
//! # Installation
//!
//! Add the following to your `Cargo.toml` file:
//!
//! ```toml
//! [dependencies]
//! serenity = "0.12"
//! ```
//!
//! [`Cache`]: crate::cache::Cache
//! [`Context`]: crate::client::Context
//! [`EventHandler::message`]: crate::client::EventHandler::message
//! [`Event`]: crate::model::event::Event
//! [`Event::MessageCreate`]: crate::model::event::Event::MessageCreate
//! [`Shard`]: crate::gateway::Shard
//! [`examples`]: https://github.com/serenity-rs/serenity/blob/current/examples
//! [cache docs]: crate::cache
//! [client's module-level documentation]: crate::client
//! [docs]: https://discord.com/developers/docs/intro
//! [examples]: https://github.com/serenity-rs/serenity/tree/current/examples
//! [gateway docs]: crate::gateway
#![doc(html_root_url = "https://docs.rs/serenity/*")]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![warn(
    unused,
    rust_2018_idioms,
    clippy::unwrap_used,
    clippy::clone_on_ref_ptr,
    clippy::non_ascii_literal,
    clippy::fallible_impl_from,
    clippy::let_underscore_must_use,
    clippy::format_collect,
    clippy::format_push_string,
    clippy::pedantic
)]
#![allow(
    // Allowed to avoid breaking changes.
    clippy::module_name_repetitions,
    clippy::struct_excessive_bools,
    clippy::unused_self,
    // Allowed as they are too pedantic
    clippy::cast_possible_truncation,
    clippy::unreadable_literal,
    clippy::cast_possible_wrap,
    clippy::wildcard_imports,
    clippy::cast_sign_loss,
    clippy::too_many_lines,
    clippy::doc_markdown,
    clippy::cast_lossless,
    clippy::redundant_closure_for_method_calls,
    // Covered by other lints
    clippy::missing_panics_doc, // clippy::unwrap_used
)]
#![cfg_attr(test, allow(clippy::unwrap_used))]
#![type_length_limit = "3294819"] // needed so ShardRunner::run compiles with instrument.

#[macro_use]
extern crate serde;

#[macro_use]
mod internal;

pub mod constants;
pub mod json;
pub mod model;
pub mod prelude;

#[cfg(feature = "builder")]
pub mod builder;
#[cfg(feature = "cache")]
pub mod cache;
#[cfg(feature = "client")]
pub mod client;
#[cfg(feature = "collector")]
pub mod collector;
#[cfg(feature = "framework")]
pub mod framework;
#[cfg(feature = "gateway")]
pub mod gateway;
#[cfg(feature = "http")]
pub mod http;
#[cfg(feature = "interactions_endpoint")]
pub mod interactions_endpoint;
#[cfg(feature = "utils")]
pub mod utils;

mod error;

// For the procedural macros in `command_attr`.
pub use async_trait::async_trait;
pub use futures;
pub use futures::future::FutureExt;
#[cfg(feature = "standard_framework")]
#[doc(hidden)]
pub use static_assertions;

#[cfg(all(feature = "client", feature = "gateway"))]
pub use crate::client::Client;
pub use crate::error::{Error, Result};

#[cfg(feature = "absolute_ratelimits")]
compile_error!(
    "The absolute_ratelimits feature has been removed.\n\
    Configure absolute ratelimits via Ratelimiter::set_absolute_ratelimits.\n\
    You can set the Ratelimiter of Http via HttpBuilder::ratelimiter."
);

/// Special module that re-exports most public items from this crate.
///
/// Useful, because you don't have to remember the full paths of serenity items.
///
/// Not exported:
/// - [`crate::json`]: it's a general-purpose JSON wrapper, not intrinsic to serenity
/// - [`crate::framework::standard`]: has many standard_framework-specific items that may collide
/// with items from the rest of serenity
pub mod all {
    #[cfg(feature = "builder")]
    #[doc(no_inline)]
    pub use crate::builder::*;
    #[cfg(feature = "cache")]
    #[doc(no_inline)]
    pub use crate::cache::*;
    #[cfg(feature = "client")]
    #[doc(no_inline)]
    pub use crate::client::*;
    #[cfg(feature = "collector")]
    #[doc(no_inline)]
    pub use crate::collector::*;
    #[doc(no_inline)]
    pub use crate::constants::{close_codes::*, *};
    #[cfg(feature = "framework")]
    #[doc(no_inline)]
    pub use crate::framework::*;
    #[cfg(feature = "gateway")]
    #[doc(no_inline)]
    pub use crate::gateway::*;
    #[cfg(feature = "http")]
    #[doc(no_inline)]
    pub use crate::http::*;
    #[cfg(feature = "interactions_endpoint")]
    #[doc(no_inline)]
    pub use crate::interactions_endpoint::*;
    #[cfg(feature = "utils")]
    #[doc(no_inline)]
    pub use crate::utils::{
        token::{validate as validate_token, InvalidToken},
        *,
    };
    // #[doc(no_inline)]
    // pub use crate::*;
    #[doc(no_inline)]
    pub use crate::{
        // Need to re-export this manually or it can't be accessed for some reason
        async_trait,
        model::prelude::*,
        *,
    };
}