diff options
| author | Zeyla Hellyer <[email protected]> | 2017-05-22 17:02:00 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-05-22 17:02:00 -0700 |
| commit | 9969be60cf320797c37b317da24d9a08fd5eafa5 (patch) | |
| tree | f27bf7a57af95bbc11990b1edcea9cca99276964 /src/utils/builder | |
| parent | Reasonably derive Debug on items (diff) | |
| download | serenity-9969be60cf320797c37b317da24d9a08fd5eafa5.tar.xz serenity-9969be60cf320797c37b317da24d9a08fd5eafa5.zip | |
Restructure modules
Modules are now separated into a fashion where the library can be used
for most use cases, without needing to compile the rest.
The core of serenity, with no features enabled, contains only the
struct (model) definitions, constants, and prelude. Models do not have
most functions compiled in, as that is separated into the `model`
feature.
The `client` module has been split into 3 modules: `client`, `gateway`,
and `http`.
`http` contains functions to interact with the REST API. `gateway`
contains the Shard to interact with the gateway, requiring `http` for
retrieving the gateway URL. `client` requires both of the other features
and acts as an abstracted interface over both the gateway and REST APIs,
handling the event loop.
The `builder` module has been separated from `utils`, and can now be
optionally compiled in. It and the `http` feature are required by the
`model` feature due to a large number of methods requiring access to
them.
`utils` now contains a number of utilities, such as the Colour struct, the
`MessageBuilder`, and mention parsing functions.
Each of the original `ext` modules are still featured, with `cache` not
requiring any feature to be enabled, `framework` requiring the `client`,
`model`, and `utils`, and `voice` requiring `gateway`.
In total the features and their requirements are:
- `builder`: none
- `cache`: none
- `client`: `gateway`, `http`
- `framework`: `client`, `model`, `utils`
- `gateway`: `http`
- `http`: none
- `model`: `builder`, `http`
- `utils`: none
- `voice`: `gateway`
The default features are `builder`, `cache`, `client`, `framework`,
`gateway`, `model`, `http`, and `utils`.
To help with forwards compatibility, modules have been re-exported from
their original locations.
Diffstat (limited to 'src/utils/builder')
| -rw-r--r-- | src/utils/builder/create_embed.rs | 391 | ||||
| -rw-r--r-- | src/utils/builder/create_invite.rs | 84 | ||||
| -rw-r--r-- | src/utils/builder/create_message.rs | 86 | ||||
| -rw-r--r-- | src/utils/builder/edit_channel.rs | 80 | ||||
| -rw-r--r-- | src/utils/builder/edit_guild.rs | 165 | ||||
| -rw-r--r-- | src/utils/builder/edit_member.rs | 71 | ||||
| -rw-r--r-- | src/utils/builder/edit_profile.rs | 93 | ||||
| -rw-r--r-- | src/utils/builder/edit_role.rs | 125 | ||||
| -rw-r--r-- | src/utils/builder/execute_webhook.rs | 129 | ||||
| -rw-r--r-- | src/utils/builder/get_messages.rs | 75 | ||||
| -rw-r--r-- | src/utils/builder/mod.rs | 33 |
11 files changed, 0 insertions, 1332 deletions
diff --git a/src/utils/builder/create_embed.rs b/src/utils/builder/create_embed.rs deleted file mode 100644 index 457a960..0000000 --- a/src/utils/builder/create_embed.rs +++ /dev/null @@ -1,391 +0,0 @@ -//! Developer note: -//! -//! This is a set of embed builders for rich embeds. -//! -//! These are used in the [`Context::send_message`] and -//! [`ExecuteWebhook::embeds`] methods, both as part of builders. -//! -//! The only builder that should be exposed is [`CreateEmbed`]. The rest of -//! these have no real reason for being exposed, but are for completeness' sake. -//! -//! Documentation for embeds can be found [here]. -//! -//! [`Context::send_message`]: ../../client/struct.Context.html#method.send_message -//! [`CreateEmbed`]: struct.CreateEmbed.html -//! [`ExecuteWebhook::embeds`]: struct.ExecuteWebhook.html#method.embeds -//! [here]: https://discordapp.com/developers/docs/resources/channel#embed-object - -use serde_json::Value; -use std::default::Default; -use time::Tm; -use ::internal::prelude::*; -use ::model::Embed; -use ::utils::Colour; - -/// A builder to create a fake [`Embed`] object, for use with the -/// [`Context::send_message`] and [`ExecuteWebhook::embeds`] methods. -/// -/// # Examples -/// -/// Refer to the documentation for [`Context::send_message`] for a very in-depth -/// example on how to use this. -/// -/// [`Context::send_message`]: ../../client/struct.Context.html#method.send_message -/// [`Embed`]: ../../model/struct.Embed.html -/// [`ExecuteWebhook::embeds`]: struct.ExecuteWebhook.html#method.embeds -#[derive(Clone, Debug)] -pub struct CreateEmbed(pub Map<String, Value>); - -impl CreateEmbed { - /// Set the author of the embed. - /// - /// Refer to the documentation for [`CreateEmbedAuthor`] for more - /// information. - /// - /// [`CreateEmbedAuthor`]: struct.CreateEmbedAuthor.html - pub fn author<F>(mut self, f: F) -> Self - where F: FnOnce(CreateEmbedAuthor) -> CreateEmbedAuthor { - let author = f(CreateEmbedAuthor::default()).0; - - self.0.insert("author".to_owned(), Value::Object(author)); - - CreateEmbed(self.0) - } - - /// Set the colour of the left-hand side of the embed. - /// - /// This is an alias of [`colour`]. - /// - /// [`colour`]: #method.colour - pub fn color<C: Into<Colour>>(self, colour: C) -> Self { - self.colour(colour.into()) - } - - /// Set the colour of the left-hand side of the embed. - pub fn colour<C: Into<Colour>>(mut self, colour: C) -> Self { - self.0.insert("color".to_owned(), Value::Number(Number::from(colour.into().0 as u64))); - - CreateEmbed(self.0) - } - - /// Set the description of the embed. - /// - /// **Note**: This can't be longer than 2048 characters. - pub fn description(mut self, description: &str) -> Self { - self.0.insert("description".to_owned(), Value::String(description.to_owned())); - - CreateEmbed(self.0) - } - - /// Set a field. Note that this will not overwrite other fields, and will - /// add to them. - /// - /// Refer to the documentation for [`CreateEmbedField`] for more - /// information. - /// - /// **Note**: Maximum amount of characters you can put is 256 in a field - /// name and 1024 in a field value and a field is inline by default. - /// - /// [`CreateEmbedField`]: struct.CreateEmbedField.html - pub fn field<F>(mut self, f: F) -> Self - where F: FnOnce(CreateEmbedField) -> CreateEmbedField { - let field = f(CreateEmbedField::default()).0; - - { - let key = "fields".to_owned(); - - let entry = self.0.remove(&key).unwrap_or_else(|| Value::Array(vec![])); - let mut arr = match entry { - Value::Array(inner) => inner, - _ => { - // The type of `entry` should always be a `Value::Array`. - // - // Theoretically this never happens, but you never know. - // - // In the event that it does, just return the current value. - return CreateEmbed(self.0); - }, - }; - arr.push(Value::Object(field)); - - self.0.insert("fields".to_owned(), Value::Array(arr)); - } - - CreateEmbed(self.0) - } - - /// Set the footer of the embed. - /// - /// Refer to the documentation for [`CreateEmbedFooter`] for more - /// information. - /// - /// [`CreateEmbedFooter`]: struct.CreateEmbedFooter.html - pub fn footer<F>(mut self, f: F) -> Self - where F: FnOnce(CreateEmbedFooter) -> CreateEmbedFooter { - let footer = f(CreateEmbedFooter::default()).0; - - self.0.insert("footer".to_owned(), Value::Object(footer)); - - CreateEmbed(self.0) - } - - /// Set the image associated with the embed. This only supports HTTP(S). - pub fn image(mut self, url: &str) -> Self { - let image = json!({ - "url": url.to_owned() - }); - - self.0.insert("image".to_owned(), image); - - CreateEmbed(self.0) - } - - /// Set the thumbnail of the embed. This only supports HTTP(S). - pub fn thumbnail(mut self, url: &str) -> Self { - let thumbnail = json!({ - "url": url.to_owned(), - }); - - self.0.insert("thumbnail".to_owned(), thumbnail); - - CreateEmbed(self.0) - } - - /// Set the timestamp. - /// - /// **Note**: This timestamp must be in ISO-8601 format. It must also be - /// in UTC format. - /// - /// # Examples - /// - /// You may pass a direct string: - /// - /// - `2017-01-03T23:00:00` - /// - `2004-06-08T16:04:23` - /// - `2004-06-08T16:04:23` - /// - /// Or a `time::Tm`: - /// - /// ```rust,ignore - /// extern crate time; - /// - /// let now = time::now(); - /// - /// embed = embed.timestamp(now); - /// // ... - /// ``` - pub fn timestamp<T: Into<Timestamp>>(mut self, timestamp: T) -> Self { - self.0.insert("timestamp".to_owned(), Value::String(timestamp.into().ts)); - - CreateEmbed(self.0) - } - - /// Set the title of the embed. - pub fn title(mut self, title: &str) -> Self { - self.0.insert("title".to_owned(), Value::String(title.to_owned())); - - CreateEmbed(self.0) - } - - /// Set the URL to direct to when clicking on the title. - pub fn url(mut self, url: &str) -> Self { - self.0.insert("url".to_owned(), Value::String(url.to_owned())); - - CreateEmbed(self.0) - } -} - -impl Default for CreateEmbed { - /// Creates a builder with default values, setting the `type` to `rich`. - fn default() -> CreateEmbed { - let mut map = Map::new(); - map.insert("type".to_owned(), Value::String("rich".to_owned())); - - CreateEmbed(map) - } -} - -impl From<Embed> for CreateEmbed { - /// Converts the fields of an embed into the values for a new embed builder. - /// - /// Some values - such as Proxy URLs - are not preserved. - fn from(embed: Embed) -> CreateEmbed { - let mut b = CreateEmbed::default() - .colour(embed.colour); - - if let Some(author) = embed.author { - b = b.author(move |mut a| { - a = a.name(&author.name); - - if let Some(icon_url) = author.icon_url { - a = a.icon_url(&icon_url); - } - - if let Some(url) = author.url { - a = a.url(&url); - } - - a - }); - } - - if let Some(description) = embed.description { - b = b.description(&description); - } - - for field in embed.fields { - b = b.field(move |f| f - .inline(field.inline) - .name(&field.name) - .value(&field.value)); - } - - if let Some(image) = embed.image { - b = b.image(&image.url); - } - - if let Some(timestamp) = embed.timestamp { - b = b.timestamp(timestamp); - } - - if let Some(thumbnail) = embed.thumbnail { - b = b.thumbnail(&thumbnail.url); - } - - if let Some(url) = embed.url { - b = b.url(&url); - } - - if let Some(title) = embed.title { - b = b.title(&title); - } - - b - } -} - -/// A builder to create a fake [`Embed`] object's author, for use with the -/// [`CreateEmbed::author`] method. -/// -/// Requires that you specify a [`name`]. -/// -/// [`Embed`]: ../../model/struct.Embed.html -/// [`CreateEmbed::author`]: struct.CreateEmbed.html#method.author -/// [`name`]: #method.name -#[derive(Clone, Debug, Default)] -pub struct CreateEmbedAuthor(pub Map<String, Value>); - -impl CreateEmbedAuthor { - /// Set the URL of the author's icon. - pub fn icon_url(mut self, icon_url: &str) -> Self { - self.0.insert("icon_url".to_owned(), Value::String(icon_url.to_owned())); - - self - } - - /// Set the author's name. - pub fn name(mut self, name: &str) -> Self { - self.0.insert("name".to_owned(), Value::String(name.to_owned())); - - self - } - - /// Set the author's URL. - pub fn url(mut self, url: &str) -> Self { - self.0.insert("url".to_owned(), Value::String(url.to_owned())); - - self - } -} - -/// A builder to create a fake [`Embed`] object's field, for use with the -/// [`CreateEmbed::field`] method. -/// -/// This does not require any field be set. `inline` is set to `true` by -/// default. -/// -/// [`Embed`]: ../../model/struct.Embed.html -/// [`CreateEmbed::field`]: struct.CreateEmbed.html#method.field -#[derive(Clone, Debug)] -pub struct CreateEmbedField(pub Map<String, Value>); - -impl CreateEmbedField { - /// Set whether the field is inlined. Set to true by default. - pub fn inline(mut self, inline: bool) -> Self { - self.0.insert("inline".to_owned(), Value::Bool(inline)); - - self - } - - /// Set the field's name. It can't be longer than 256 characters. - pub fn name(mut self, name: &str) -> Self { - self.0.insert("name".to_owned(), Value::String(name.to_owned())); - - self - } - - /// Set the field's value. It can't be longer than 1024 characters. - pub fn value(mut self, value: &str) -> Self { - self.0.insert("value".to_owned(), Value::String(value.to_owned())); - - self - } -} - -impl Default for CreateEmbedField { - /// Creates a builder with default values, setting the value of `inline` to - /// `true`. - fn default() -> CreateEmbedField { - let mut map = Map::new(); - map.insert("inline".to_owned(), Value::Bool(true)); - - CreateEmbedField(map) - } -} - -/// A builder to create a fake [`Embed`] object's footer, for use with the -/// [`CreateEmbed::footer`] method. -/// -/// This does not require any field be set. -/// -/// [`Embed`]: ../../model/struct.Embed.html -/// [`CreateEmbed::footer`]: struct.CreateEmbed.html#method.footer -#[derive(Clone, Debug, Default)] -pub struct CreateEmbedFooter(pub Map<String, Value>); - -impl CreateEmbedFooter { - /// Set the icon URL's value. This only supports HTTP(S). - pub fn icon_url(mut self, icon_url: &str) -> Self { - self.0.insert("icon_url".to_owned(), Value::String(icon_url.to_owned())); - - self - } - - /// Set the footer's text. - pub fn text(mut self, text: &str) -> Self { - self.0.insert("text".to_owned(), Value::String(text.to_owned())); - - self - } -} - -#[derive(Clone, Debug)] -pub struct Timestamp { - pub ts: String, -} - -impl From<String> for Timestamp { - fn from(ts: String) -> Self { - Timestamp { - ts: ts, - } - } -} - -impl From<Tm> for Timestamp { - fn from(tm: Tm) -> Self { - Timestamp { - ts: tm.to_utc().rfc3339().to_string(), - } - } -} diff --git a/src/utils/builder/create_invite.rs b/src/utils/builder/create_invite.rs deleted file mode 100644 index 6ff2a67..0000000 --- a/src/utils/builder/create_invite.rs +++ /dev/null @@ -1,84 +0,0 @@ -use serde_json::Value; -use std::default::Default; -use ::internal::prelude::*; - -/// A builder to create a [`RichInvite`] for use via [`Context::create_invite`]. -/// -/// This is a structured and cleaner way of creating an invite, as all -/// parameters are optional. -/// -/// # Examples -/// -/// Create an invite with a max age of 3600 seconds and 10 max uses: -/// -/// ```rust,ignore -/// use serenity::Client; -/// use std::env; -/// -/// let mut client = Client::login(&env::var("DISCORD_BOT_TOKEN").unwrap()); -/// -/// client.on_message(|_, message| { -/// if message.content == "!invite" { -/// let invite = message.channel_id.create_invite(|i| i -/// .max_age(3600) -/// .max_uses(10)); -/// } -/// }); -/// ``` -/// -/// [`Context::create_invite`]: ../../client/struct.Context.html#method.create_invite -/// [`RichInvite`]: ../../model/struct.Invite.html -#[derive(Clone, Debug)] -pub struct CreateInvite(pub JsonMap); - -impl CreateInvite { - /// The duration that the invite will be valid for. - /// - /// Set to `0` for an invite which does not expire after an amount of time. - /// - /// Defaults to `86400`, or 24 hours. - pub fn max_age(mut self, max_age: u64) -> Self { - self.0.insert("max_age".to_owned(), Value::Number(Number::from(max_age))); - - self - } - - /// The number of uses that the invite will be valid for. - /// - /// Set to `0` for an invite which does not expire after a number of uses. - /// - /// Defaults to `0`. - pub fn max_uses(mut self, max_uses: u64) -> Self { - self.0.insert("max_uses".to_owned(), Value::Number(Number::from(max_uses))); - - self - } - - /// Whether an invite grants a temporary membership. - /// - /// Defaults to `false`. - pub fn temporary(mut self, temporary: bool) -> Self { - self.0.insert("temporary".to_owned(), Value::Bool(temporary)); - - self - } - - /// Whether or not to try to reuse a similar invite. - /// - /// Defaults to `false`. - pub fn unique(mut self, unique: bool) -> Self { - self.0.insert("unique".to_owned(), Value::Bool(unique)); - - self - } -} - -impl Default for CreateInvite { - /// Creates a builder with default values, setting `validate` to `null`. - fn default() -> CreateInvite { - let mut map = Map::new(); - map.insert("validate".to_owned(), Value::Null); - - CreateInvite(map) - } -} diff --git a/src/utils/builder/create_message.rs b/src/utils/builder/create_message.rs deleted file mode 100644 index 5c3b6eb..0000000 --- a/src/utils/builder/create_message.rs +++ /dev/null @@ -1,86 +0,0 @@ -use super::CreateEmbed; -use ::internal::prelude::*; - -/// A builder to specify the contents of an [`rest::send_message`] request, -/// primarily meant for use through [`Context::send_message`]. -/// -/// There are two situations where different field requirements are present: -/// -/// 1. When sending an [`embed`], no other field is required; -/// 2. Otherwise, [`content`] is the only required field that is required to be -/// set. -/// -/// Note that if you only need to send the content of a message, without -/// specifying other fields, then [`Context::say`] may be a more preferable -/// option. -/// -/// # Examples -/// -/// Sending a message with a content of `"test"` and applying text-to-speech: -/// -/// ```rust,no_run -/// use serenity::model::ChannelId; -/// -/// let channel_id = ChannelId(7); -/// -/// let _ = channel_id.send_message(|m| m -/// .content("test") -/// .tts(true) -/// .embed(|e| e -/// .title("This is an embed") -/// .description("With a description"))); -/// ``` -/// -/// [`Context::say`]: ../../client/struct.Context.html#method.say -/// [`Context::send_message`]: ../../client/struct.Context.html#method.send_message -/// [`content`]: #method.content -/// [`embed`]: #method.embed -/// [`rest::send_message`]: ../../client/rest/fn.send_message.html -#[derive(Clone, Debug)] -pub struct CreateMessage(pub Map<String, Value>); - -impl CreateMessage { - /// Set the content of the message. - /// - /// **Note**: Message contents must be under 2000 unicode code points. - pub fn content(mut self, content: &str) -> Self { - self.0.insert("content".to_owned(), Value::String(content.to_owned())); - - CreateMessage(self.0) - } - - /// Set an embed for the message. - pub fn embed<F>(mut self, f: F) -> Self - where F: FnOnce(CreateEmbed) -> CreateEmbed { - let embed = Value::Object(f(CreateEmbed::default()).0); - - self.0.insert("embed".to_owned(), embed); - - CreateMessage(self.0) - } - - /// Set whether the message is text-to-speech. - /// - /// Think carefully before setting this to `true`. - /// - /// Defaults to `false`. - pub fn tts(mut self, tts: bool) -> Self { - self.0.insert("tts".to_owned(), Value::Bool(tts)); - - CreateMessage(self.0) - } -} - -impl Default for CreateMessage { - /// Creates a map for sending a [`Message`], setting [`tts`] to `false` by - /// default. - /// - /// [`Message`]: ../../model/struct.Message.html - /// [`tts`]: #method.tts - fn default() -> CreateMessage { - let mut map = Map::default(); - map.insert("tts".to_owned(), Value::Bool(false)); - - CreateMessage(map) - } -} diff --git a/src/utils/builder/edit_channel.rs b/src/utils/builder/edit_channel.rs deleted file mode 100644 index 4d0955e..0000000 --- a/src/utils/builder/edit_channel.rs +++ /dev/null @@ -1,80 +0,0 @@ -use ::internal::prelude::*; - -/// A builder to edit a [`GuildChannel`] for use via one of a couple methods. -/// -/// These methods are: -/// -/// - [`Context::edit_channel`] -/// - [`GuildChannel::edit`] -/// -/// Defaults are not directly provided by the builder itself. -/// -/// # Examples -/// -/// Edit a channel, providing a new name and topic: -/// -/// ```rust,ignore -/// // assuming a channel has already been bound -/// if let Err(why) = channel::edit(|c| c.name("new name").topic("a test topic")) { -/// // properly handle the error -/// } -/// ``` -/// -/// [`Context::edit_channel`]: ../client/struct.Context.html#method.edit_channel -/// [`GuildChannel`]: ../model/struct.GuildChannel.html -/// [`GuildChannel::edit`]: ../model/struct.GuildChannel.html#method.edit -#[derive(Clone, Debug, Default)] -pub struct EditChannel(pub JsonMap); - -impl EditChannel { - /// The bitrate of the channel in bits. - /// - /// This is for [voice] channels only. - /// - /// [voice]: ../../model/enum.ChannelType.html#variant.Voice - pub fn bitrate(mut self, bitrate: u64) -> Self { - self.0.insert("bitrate".to_owned(), Value::Number(Number::from(bitrate))); - - self - } - - /// The name of the channel. - /// - /// Must be between 2 and 100 characters long. - pub fn name(mut self, name: &str) -> Self { - self.0.insert("name".to_owned(), Value::String(name.to_owned())); - - self - } - - /// The position of the channel in the channel list. - pub fn position(mut self, position: u64) -> Self { - self.0.insert("position".to_owned(), Value::Number(Number::from(position))); - - self - } - - /// The topic of the channel. Can be empty. - /// - /// Must be between 0 and 1024 characters long. - /// - /// This is for [text] channels only. - /// - /// [text]: ../../model/enum.ChannelType.html#variant.Text - pub fn topic(mut self, topic: &str) -> Self { - self.0.insert("topic".to_owned(), Value::String(topic.to_owned())); - - self - } - - /// The number of users that may be in the channel simultaneously. - /// - /// This is for [voice] channels only. - /// - /// [voice]: ../../model/enum.ChannelType.html#variant.Voice - pub fn user_limit(mut self, user_limit: u64) -> Self { - self.0.insert("user_limit".to_owned(), Value::Number(Number::from(user_limit))); - - self - } -} diff --git a/src/utils/builder/edit_guild.rs b/src/utils/builder/edit_guild.rs deleted file mode 100644 index e423fc2..0000000 --- a/src/utils/builder/edit_guild.rs +++ /dev/null @@ -1,165 +0,0 @@ -use ::internal::prelude::*; -use ::model::{ChannelId, Region, UserId, VerificationLevel}; - -/// A builder to optionally edit certain fields of a [`Guild`]. This is meant -/// for usage with [`Context::edit_guild`] and [`LiveGuild::edit`]. -/// -/// **Note**: Editing a guild requires that the current user have the -/// [Manage Guild] permission. -/// -/// [`Context::edit_guild`]: ../../client/struct.Context.html -/// [`Guild`]: ../../model/struct.Guild.html -/// [`LiveGuild::edit`]: ../../model/struct.LiveGuild.html#method.edit -/// [Manage Guild]: ../../model/permissions/constant.MANAGE_GUILD.html -#[derive(Clone, Debug, Default)] -pub struct EditGuild(pub Map<String, Value>); - -impl EditGuild { - /// Set the "AFK voice channel" that users are to move to if they have been - /// AFK for an amount of time, configurable by [`afk_timeout`]. - /// - /// The given channel must be either some valid voice channel, or `None` to - /// not set an AFK channel. The library does not check if a channel is - /// valid. - /// - /// [`afk_timeout`]: #method.afk_timeout - pub fn afk_channel<C: Into<ChannelId>>(mut self, channel: Option<C>) -> Self { - self.0.insert("afk_channel_id".to_owned(), match channel { - Some(channel) => Value::Number(Number::from(channel.into().0)), - None => Value::Null, - }); - - self - } - - /// Set the amount of time a user is to be moved to the AFK channel - - /// configured via [`afk_channel`] - after being AFK. - /// - /// [`afk_channel`]: #method.afk_channel - pub fn afk_timeout(mut self, timeout: u64) -> Self { - self.0.insert("afk_timeout".to_owned(), Value::Number(Number::from(timeout))); - - self - } - - /// Set the icon of the guild. Pass `None` to remove the icon. - /// - /// # Examples - /// - /// Using the utility function - [`utils::read_image`] - to read an image - /// from the cwd and encode it in base64 to send to Discord. - /// - /// ```rust,ignore - /// use serenity::utils; - /// - /// // assuming a `guild` has already been bound - /// - /// let base64_icon = utils::read_image("./guild_icon.png") - /// .expect("Failed to read image"); - /// - /// let _ = guild.edit(|g| g.icon(base64_icon)); - /// ``` - /// - /// [`utils::read_image`]: ../../utils/fn.read_image.html - pub fn icon(mut self, icon: Option<&str>) -> Self { - self.0.insert("icon".to_owned(), icon.map_or_else(|| Value::Null, |x| Value::String(x.to_owned()))); - - self - } - - /// Set the name of the guild. - /// - /// **Note**: Must be between (and including) 2-100 chracters. - pub fn name(mut self, name: &str) -> Self { - self.0.insert("name".to_owned(), Value::String(name.to_owned())); - - self - } - - /// Transfers the ownership of the guild to another user by Id. - /// - /// **Note**: The current user must be the owner of the guild. - pub fn owner<U: Into<UserId>>(mut self, user_id: U) -> Self { - self.0.insert("owner_id".to_owned(), Value::Number(Number::from(user_id.into().0))); - - self - } - - /// Set the voice region of the server. - /// - /// # Examples - /// - /// Setting the region to [`Region::UsWest`]: - /// - /// ```rust,ignore - /// use serenity::model::Region; - /// - /// // assuming a `guild` has already been bound - /// - /// if let Err(why) = guild.edit(|g| g.region(Region::UsWest)) { - /// println!("Error editing guild's region: {:?}", why); - /// } - /// ``` - /// - /// [`Region::UsWest`]: ../../model/enum.Region.html#variant.UsWest - pub fn region(mut self, region: Region) -> Self { - self.0.insert("region".to_owned(), Value::String(region.name().to_owned())); - - self - } - - /// Set the splash image of the guild on the invitation page. - /// - /// Requires that the guild have the [`InviteSplash`] feature enabled. - /// You can check this through a guild's [`features`] list. - /// - /// [`InviteSplash`]: ../../model/enum.Feature.html#variant.InviteSplash - /// [`features`]: ../../model/struct.LiveGuild.html#structfield.features - pub fn splash(mut self, splash: Option<&str>) -> Self { - let splash = splash.map_or(Value::Null, |x| Value::String(x.to_owned())); - - self.0.insert("splash".to_owned(), splash); - - self - } - - /// Set the verification level of the guild. This can restrict what a - /// user must have prior to being able to send messages in a guild. - /// - /// Refer to the documentation for [`VerificationLevel`] for more - /// information on each variant. - /// - /// [`VerificationLevel`]: ../../model/enum.VerificationLevel.html - /// - /// # Examples - /// - /// Setting the verification level to [`High`][`VerificationLevel::High`]: - /// - /// ```rust,ignore - /// use serenity::model::VerificationLevel; - /// - /// // assuming a `guild` has already been bound - /// - /// if let Err(why) = guild.edit(|g| g.verification_level(VerificationLevel::High)) { - /// println!("Error setting verification level: {:?}", why); - /// } - /// - /// // additionally, you may pass in just an integer of the verification - /// // level - /// - /// if let Err(why) = guild.edit(|g| g.verification_level(3)) { - /// println!("Error setting verification level: {:?}", why); - /// } - /// ``` - /// - /// [`VerificationLevel`]: ../../model/enum.VerificationLevel.html - /// [`VerificationLevel::High`]: ../../model/enum.VerificationLevel.html#variant.High - pub fn verification_level<V>(mut self, verification_level: V) -> Self - where V: Into<VerificationLevel> { - let num = Value::Number(Number::from(verification_level.into().num())); - - self.0.insert("verification_level".to_owned(), num); - - self - } -} diff --git a/src/utils/builder/edit_member.rs b/src/utils/builder/edit_member.rs deleted file mode 100644 index af35bf9..0000000 --- a/src/utils/builder/edit_member.rs +++ /dev/null @@ -1,71 +0,0 @@ -use ::model::{ChannelId, RoleId}; -use ::internal::prelude::*; - -/// A builder which edits the properties of a [`Member`], to be used in -/// conjunction with [`Context::edit_member`] and [`Member::edit`]. -/// -/// [`Context::edit_member`]: ../../client/struct.Context.html#method.edit_member -/// [`Member`]: ../../model/struct.Member.html -/// [`Member::edit`]: ../../model/struct.Member.html#method.edit -#[derive(Clone, Debug, Default)] -pub struct EditMember(pub JsonMap); - -impl EditMember { - /// Whether to deafen the member. - /// - /// Requires the [Deafen Members] permission. - /// - /// [Deafen Members]: ../../model/permissions/constant.DEAFEN_MEMBERS.html - pub fn deafen(mut self, deafen: bool) -> Self { - self.0.insert("deaf".to_owned(), Value::Bool(deafen)); - - self - } - - /// Whether to mute the member. - /// - /// Requires the [Mute Members] permission. - /// - /// [Mute Members]: ../../model/permissions/constant.MUTE_MEMBERS.html - pub fn mute(mut self, mute: bool) -> Self { - self.0.insert("mute".to_owned(), Value::Bool(mute)); - - self - } - - /// Changes the member's nickname. Pass an empty string to reset the - /// nickname. - /// - /// Requires the [Manage Nicknames] permission. - /// - /// [Manage Nicknames]: ../../model/permissions/constant.MANAGE_NICKNAMES.html - pub fn nickname(mut self, nickname: &str) -> Self { - self.0.insert("nick".to_owned(), Value::String(nickname.to_owned())); - - self - } - - /// Set the list of roles that the member should have. - /// - /// Requires the [Manage Roles] permission to modify. - /// - /// [Manage Roles]: ../../model/permissions/constant.MANAGE_ROLES.html - pub fn roles(mut self, roles: &[RoleId]) -> Self { - let role_ids = roles.iter().map(|x| Value::Number(Number::from(x.0))).collect(); - - self.0.insert("roles".to_owned(), Value::Array(role_ids)); - - self - } - - /// The Id of the voice channel to move the member to. - /// - /// Requires the [Move Members] permission. - /// - /// [Move Members]: ../../model/permissions/constant.MOVE_MEMBERS.html - pub fn voice_channel<C: Into<ChannelId>>(mut self, channel_id: C) -> Self { - self.0.insert("channel_id".to_owned(), Value::Number(Number::from(channel_id.into().0))); - - self - } -} diff --git a/src/utils/builder/edit_profile.rs b/src/utils/builder/edit_profile.rs deleted file mode 100644 index 64bd7a9..0000000 --- a/src/utils/builder/edit_profile.rs +++ /dev/null @@ -1,93 +0,0 @@ -use ::internal::prelude::*; - -/// A builder to edit the current user's settings, to be used in conjunction -/// with [`Context::edit_profile`]. -/// -/// [`Context::edit_profile`]: ../../client/struct.Context.html#method.edit_profile -#[derive(Clone, Debug, Default)] -pub struct EditProfile(pub JsonMap); - -impl EditProfile { - /// Sets the avatar of the current user. `None` can be passed to remove an - /// avatar. - /// - /// A base64-encoded string is accepted as the avatar content. - /// - /// # Examples - /// - /// A utility method - [`utils::read_image`] - is provided to read an - /// image from a file and return its contents in base64-encoded form: - /// - /// ```rust,ignore - /// use serenity::utils; - /// - /// // assuming a `context` has been bound - /// - /// let base64 = utils::read_image("./my_image.jpg") - /// .expect("Failed to read image"); - /// - /// let _ = context.edit_profile(|profile| { - /// profile.avatar(Some(&base64)) - /// }); - /// ``` - /// - /// [`utils::read_image`]: ../fn.read_image.html - pub fn avatar(mut self, avatar: Option<&str>) -> Self { - let avatar = avatar.map_or(Value::Null, |x| Value::String(x.to_owned())); - - self.0.insert("avatar".to_owned(), avatar); - - self - } - - /// Modifies the current user's email address. - /// - /// Note that when modifying the email address, the current password must - /// also be [provided]. - /// - /// No validation is performed on this by the library. - /// - /// **Note**: This can only be used by user accounts. - /// - /// [provided]: #method.password - pub fn email(mut self, email: &str) -> Self { - self.0.insert("email".to_owned(), Value::String(email.to_owned())); - - self - } - - /// Modifies the current user's password. - /// - /// Note that when modifying the password, the current password must also be - /// [provided]. - /// - /// [provided]: #method.password - pub fn new_password(mut self, new_password: &str) -> Self { - self.0.insert("new_password".to_owned(), Value::String(new_password.to_owned())); - - self - } - - /// Used for providing the current password as verification when - /// [modifying the password] or [modifying the associated email address]. - /// - /// [modifying the password]: #method.new_password - /// [modifying the associated email address]: #method.email - pub fn password(mut self, password: &str) -> Self { - self.0.insert("password".to_owned(), Value::String(password.to_owned())); - - self - } - - /// Modifies the current user's username. - /// - /// When modifying the username, if another user has the same _new_ username - /// and current discriminator, a new unique discriminator will be assigned. - /// If there are no available discriminators with the requested username, - /// an error will occur. - pub fn username(mut self, username: &str) -> Self { - self.0.insert("username".to_owned(), Value::String(username.to_owned())); - - self - } -} diff --git a/src/utils/builder/edit_role.rs b/src/utils/builder/edit_role.rs deleted file mode 100644 index 6a44912..0000000 --- a/src/utils/builder/edit_role.rs +++ /dev/null @@ -1,125 +0,0 @@ -use std::default::Default; -use ::internal::prelude::*; -use ::model::{Permissions, Role, permissions}; - -/// A builer to create or edit a [`Role`] for use via a number of model and -/// context methods. -/// -/// These are: -/// -/// - [`Context::create_role`] -/// - [`Context::edit_role`] -/// - [`Guild::create_role`] -/// - [`Role::edit`] -/// -/// Defaults are provided for each parameter on role creation. -/// -/// # Examples -/// -/// Create a hoisted, mentionable role named "a test role": -/// -/// ```rust,ignore -/// // assuming a `channel_id` and `guild_id` has been bound -/// let role = channel_id.create_role(guild_id, |r| r -/// .hoist(true) -/// .mentionable(true) -/// .name("a test role")); -/// ``` -/// -/// [`Context::create_role`]: ../../client/struct.Context.html#method.create_role -/// [`Context::edit_role`]: ../../client/struct.Context.html#method.edit_role -/// [`Guild::create_role`]: ../../model/struct.Guild.html#method.create_role -/// [`Role`]: ../../model/struct.Role.html -/// [`Role::edit`]: ../../model/struct.Role.html#method.edit -#[derive(Clone, Debug)] -pub struct EditRole(pub JsonMap); - -impl EditRole { - /// Creates a new builder with the values of the given [`Role`]. - /// - /// [`Role`]: ../../model/struct.Role.html - pub fn new(role: &Role) -> Self { - let mut map = Map::new(); - map.insert("color".to_owned(), Value::Number(Number::from(role.colour.0))); - map.insert("hoist".to_owned(), Value::Bool(role.hoist)); - map.insert("managed".to_owned(), Value::Bool(role.managed)); - map.insert("mentionable".to_owned(), Value::Bool(role.mentionable)); - map.insert("name".to_owned(), Value::String(role.name.clone())); - map.insert("permissions".to_owned(), Value::Number(Number::from(role.permissions.bits()))); - map.insert("position".to_owned(), Value::Number(Number::from(role.position))); - - EditRole(map) - } - - /// Sets the colour of the role. - pub fn colour(mut self, colour: u64) -> Self { - self.0.insert("color".to_owned(), Value::Number(Number::from(colour))); - - self - } - - /// Whether or not to hoist the role above lower-positioned role in the user - /// list. - pub fn hoist(mut self, hoist: bool) -> Self { - self.0.insert("hoist".to_owned(), Value::Bool(hoist)); - - self - } - - /// Whether or not to make the role mentionable, notifying its users. - pub fn mentionable(mut self, mentionable: bool) -> Self { - self.0.insert("mentionable".to_owned(), Value::Bool(mentionable)); - - self - } - - /// The name of the role to set. - pub fn name(mut self, name: &str) -> Self { - self.0.insert("name".to_owned(), Value::String(name.to_owned())); - - self - } - - /// The set of permissions to assign the role. - pub fn permissions(mut self, permissions: Permissions) -> Self { - self.0.insert("permissions".to_owned(), Value::Number(Number::from(permissions.bits()))); - - self - } - - /// The position to assign the role in the role list. This correlates to the - /// role's position in the user list. - pub fn position(mut self, position: u8) -> Self { - self.0.insert("position".to_owned(), Value::Number(Number::from(position))); - - self - } -} - -impl Default for EditRole { - /// Creates a builder with default parameters. - /// - /// The defaults are: - /// - /// - **color**: 10070709 - /// - **hoist**: false - /// - **mentionable**: false - /// - **name**: new role - /// - **permissions**: the [general permissions set] - /// - **position**: 1 - /// - /// [general permissions set]: ../../model/permissions/constant.PRESET_GENERAL.html - fn default() -> EditRole { - let mut map = Map::new(); - let permissions = Number::from(permissions::PRESET_GENERAL.bits()); - - map.insert("color".to_owned(), Value::Number(Number::from(10070709))); - map.insert("hoist".to_owned(), Value::Bool(false)); - map.insert("mentionable".to_owned(), Value::Bool(false)); - map.insert("name".to_owned(), Value::String("new role".to_owned())); - map.insert("permissions".to_owned(), Value::Number(permissions)); - map.insert("position".to_owned(), Value::Number(Number::from(1))); - - EditRole(map) - } -} diff --git a/src/utils/builder/execute_webhook.rs b/src/utils/builder/execute_webhook.rs deleted file mode 100644 index ee898de..0000000 --- a/src/utils/builder/execute_webhook.rs +++ /dev/null @@ -1,129 +0,0 @@ -use serde_json::Value; -use std::default::Default; -use ::internal::prelude::*; - -/// A builder to create the inner content of a [`Webhook`]'s execution. -/// -/// This is a structured way of cleanly creating the inner execution payload, -/// to reduce potential argument counts. -/// -/// Refer to the documentation for [`execute_webhook`] on restrictions with -/// execution payloads and its fields. -/// -/// # Examples -/// -/// Creating two embeds, and then sending them as part of the delivery -/// payload of [`Webhook::execute`]: -/// -/// ```rust,ignore -/// use serenity::client::rest; -/// use serenity::model::Embed; -/// use serenity::utils::Colour; -/// -/// let id = 245037420704169985; -/// let token = "ig5AO-wdVWpCBtUUMxmgsWryqgsW3DChbKYOINftJ4DCrUbnkedoYZD0VOH1QLr-S3sV"; -/// -/// let webhook = rest::get_webhook_with_token(id, token) -/// .expect("valid webhook"); -/// -/// let website = Embed::fake(|e| e -/// .title("The Rust Language Website") -/// .description("Rust is a systems programming language.") -/// .colour(Colour::from_rgb(222, 165, 132))); -/// -/// let resources = Embed::fake(|e| e -/// .title("Rust Resources") -/// .description("A few resources to help with learning Rust") -/// .colour(0xDEA584) -/// .field(|f| f -/// .inline(false) -/// .name("The Rust Book") -/// .value("A comprehensive resource for all topics related to Rust")) -/// .field(|f| f -/// .inline(false) -/// .name("Rust by Example") -/// .value("A collection of Rust examples on topics, useable in-browser"))); -/// -/// let _ = webhook.execute(|w| w -/// .content("Here's some information on Rust:") -/// .embeds(vec![website, resources])); -/// ``` -/// -/// [`Webhook`]: ../../model/struct.Webhook.html -/// [`Webhook::execute`]: ../../model/struct.Webhook.html#method.execute -/// [`execute_webhook`]: ../../client/rest/fn.execute_webhook.html -#[derive(Clone, Debug)] -pub struct ExecuteWebhook(pub JsonMap); - -impl ExecuteWebhook { - /// Override the default avatar of the webhook with an image URL. - pub fn avatar_url(mut self, avatar_url: &str) -> Self { - self.0.insert("avatar_url".to_owned(), Value::String(avatar_url.to_owned())); - - self - } - - /// Set the content of the message. - /// - /// Note that when setting at least one embed via [`embeds`], this may be - /// omitted. - /// - /// [`embeds`]: #method.embeds - pub fn content(mut self, content: &str) -> Self { - self.0.insert("content".to_owned(), Value::String(content.to_owned())); - - self - } - - /// Set the embeds associated with the message. - /// - /// This should be used in combination with [`Embed::fake`], creating one - /// or more fake embeds to send to the API. - /// - /// # Examples - /// - /// Refer to the [struct-level documentation] for an example on how to use - /// embeds. - /// - /// [`Embed::fake`]: ../../model/struct.Embed.html#method.fake - /// [`Webhook::execute`]: ../../model/struct.Webhook.html#method.execute - /// [struct-level documentation]: #examples - pub fn embeds(mut self, embeds: Vec<Value>) -> Self { - self.0.insert("embeds".to_owned(), Value::Array(embeds)); - - self - } - - /// Whether the message is a text-to-speech message. - /// - /// Think carefully before setting this to `true`. - pub fn tts(mut self, tts: bool) -> Self { - self.0.insert("tts".to_owned(), Value::Bool(tts)); - - self - } - - /// Override the default username of the webhook. - pub fn username(mut self, username: &str) -> Self { - self.0.insert("username".to_owned(), Value::String(username.to_owned())); - - self - } -} - -impl Default for ExecuteWebhook { - /// Returns a default set of values for a [`Webhook`] execution. - /// - /// The only default value is [`tts`] being set to `true`. In the event that - /// there is a bug that Discord defaults `tts` to `true`, at least - /// serenity won't be a part of it. - /// - /// [`Webhook`]: ../../model/struct.Webhook.html - /// [`tts`]: #method.tts - fn default() -> ExecuteWebhook { - let mut map = Map::new(); - map.insert("tts".to_owned(), Value::Bool(false)); - - ExecuteWebhook(map) - } -} diff --git a/src/utils/builder/get_messages.rs b/src/utils/builder/get_messages.rs deleted file mode 100644 index cc4658c..0000000 --- a/src/utils/builder/get_messages.rs +++ /dev/null @@ -1,75 +0,0 @@ -use std::collections::BTreeMap; -use ::model::MessageId; - -/// Builds a request for a request to the API to retrieve messages. -/// -/// This can have 2 different sets of parameters. The first set is around where -/// to get the messages: -/// -/// - `after` -/// - `around` -/// - `before` -/// - `most_recent` -/// -/// These can not be mixed, and the first in the list alphabetically will be -/// used. If one is not specified, `most_recent` will be used. -/// -/// The fourth parameter is to specify the number of messages to retrieve. This -/// does not _need_ to be called and defaults to a value of 50. -/// -/// This should be used only for retrieving messages; see -/// [`Client::get_messages`] for examples. -/// -/// [`Client::get_messages`]: ../../client/struct.Client.html#method.get_messages -#[derive(Clone, Debug, Default)] -pub struct GetMessages(pub BTreeMap<String, u64>); - -impl GetMessages { - /// Indicates to retrieve the messages after a specific message, given by - /// its Id. - pub fn after<M: Into<MessageId>>(mut self, message_id: M) -> Self { - self.0.insert("after".to_owned(), message_id.into().0); - - self - } - - /// Indicates to retrieve the messages _around_ a specific message in either - /// direction (before+after) the given message. - pub fn around<M: Into<MessageId>>(mut self, message_id: M) -> Self { - self.0.insert("around".to_owned(), message_id.into().0); - - self - } - - /// Indicates to retrieve the messages before a specific message, given by - /// its Id. - pub fn before<M: Into<MessageId>>(mut self, message_id: M) -> Self { - self.0.insert("before".to_owned(), message_id.into().0); - - self - } - - /// The maximum number of messages to retrieve for the query. - /// - /// If this is not specified, a default value of 50 is used. - /// - /// **Note**: This field is capped to 100 messages due to a Discord - /// limitation. If an amount larger than 100 is supplied, it will be - /// reduced. - pub fn limit(mut self, limit: u64) -> Self { - self.0.insert("limit".to_owned(), if limit > 100 { - 100 - } else { - limit - }); - - self - } - - /// This is a function that is here for completeness. You do not need to - /// call this - except to clear previous calls to `after`, `around`, and - /// `before` - as it is the default value. - pub fn most_recent(self) -> Self { - self - } -} diff --git a/src/utils/builder/mod.rs b/src/utils/builder/mod.rs deleted file mode 100644 index 3fc0f05..0000000 --- a/src/utils/builder/mod.rs +++ /dev/null @@ -1,33 +0,0 @@ -//! A set of builders used to make using methods on certain structs simpler to -//! use. -//! -//! These are used when not all parameters are required, all parameters are -//! optional, and/or sane default values for required parameters can be applied -//! by a builder. - -mod create_embed; -mod create_invite; -mod create_message; -mod edit_channel; -mod edit_guild; -mod edit_member; -mod edit_profile; -mod edit_role; -mod execute_webhook; -mod get_messages; - -pub use self::create_embed::{ - CreateEmbed, - CreateEmbedAuthor, - CreateEmbedFooter, - CreateEmbedField, -}; -pub use self::create_invite::CreateInvite; -pub use self::create_message::CreateMessage; -pub use self::edit_channel::EditChannel; -pub use self::edit_guild::EditGuild; -pub use self::edit_member::EditMember; -pub use self::edit_profile::EditProfile; -pub use self::edit_role::EditRole; -pub use self::execute_webhook::ExecuteWebhook; -pub use self::get_messages::GetMessages; |