aboutsummaryrefslogtreecommitdiff
path: root/src/builder/execute_webhook.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/builder/execute_webhook.rs')
-rw-r--r--src/builder/execute_webhook.rs129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/builder/execute_webhook.rs b/src/builder/execute_webhook.rs
new file mode 100644
index 0000000..67e10be
--- /dev/null
+++ b/src/builder/execute_webhook.rs
@@ -0,0 +1,129 @@
+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::http;
+/// use serenity::model::Embed;
+/// use serenity::utils::Colour;
+///
+/// let id = 245037420704169985;
+/// let token = "ig5AO-wdVWpCBtUUMxmgsWryqgsW3DChbKYOINftJ4DCrUbnkedoYZD0VOH1QLr-S3sV";
+///
+/// let webhook = http::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`]: ../http/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)
+ }
+}