diff options
| author | Zeyla Hellyer <[email protected]> | 2017-06-20 11:28:52 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-06-20 11:28:52 -0700 |
| commit | dc73d1a4bad07b453a9d60a6c8f8c187a7e42450 (patch) | |
| tree | 8c8c4b86e371f8d3dd4262ac8d96b4cda672b9ad /src | |
| parent | Fix broken docs links on Permissions struct (diff) | |
| download | serenity-dc73d1a4bad07b453a9d60a6c8f8c187a7e42450.tar.xz serenity-dc73d1a4bad07b453a9d60a6c8f8c187a7e42450.zip | |
Add 'wait' parameter to http::execute_webhook
The 'wait' parameter allows you to specify waiting for the Message to be
sent prior to receiving a response, which will have Discord include the
JSON representation of the Message in the body.
Diffstat (limited to 'src')
| -rw-r--r-- | src/builder/execute_webhook.rs | 10 | ||||
| -rw-r--r-- | src/http/mod.rs | 27 | ||||
| -rw-r--r-- | src/model/webhook.rs | 9 |
3 files changed, 31 insertions, 15 deletions
diff --git a/src/builder/execute_webhook.rs b/src/builder/execute_webhook.rs index 68a39fc..e8b9042 100644 --- a/src/builder/execute_webhook.rs +++ b/src/builder/execute_webhook.rs @@ -44,7 +44,7 @@ use ::internal::prelude::*; /// .name("Rust by Example") /// .value("A collection of Rust examples on topics, useable in-browser"))); /// -/// let _ = webhook.execute(|w| w +/// let _ = webhook.execute(false, |w| w /// .content("Here's some information on Rust:") /// .embeds(vec![website, resources])); /// ``` @@ -69,7 +69,7 @@ impl ExecuteWebhook { /// # /// let avatar_url = "https://i.imgur.com/KTs6whd.jpg"; /// - /// let _ = webhook.execute(|w| w + /// let _ = webhook.execute(false, |w| w /// .avatar_url(avatar_url) /// .content("Here's a webhook")); /// ``` @@ -93,7 +93,7 @@ impl ExecuteWebhook { /// # /// # let webhook = rest::get_webhook_with_token(0, "").unwrap(); /// # - /// if let Err(why) = webhook.execute(|w| w.content("foo")) { + /// if let Err(why) = webhook.execute(false, |w| w.content("foo")) { /// println!("Err sending webhook: {:?}", why); /// } /// ``` @@ -135,7 +135,7 @@ impl ExecuteWebhook { /// # /// # let webhook = rest::get_webhook_with_token(0, "").unwrap(); /// # - /// if let Err(why) = webhook.execute(|w| w.content("hello").tts(true)) { + /// if let Err(why) = webhook.execute(false, |w| w.content("hello").tts(true)) { /// println!("Err sending webhook: {:?}", why); /// } /// ``` @@ -156,7 +156,7 @@ impl ExecuteWebhook { /// # /// # let webhook = rest::get_webhook_with_token(0, "").unwrap(); /// # - /// if let Err(why) = webhook.execute(|w| w.content("hello").username("hakase")) { + /// if let Err(why) = webhook.execute(false, |w| w.content("hello").username("hakase")) { /// println!("Err sending webhook: {:?}", why); /// } /// ``` diff --git a/src/http/mod.rs b/src/http/mod.rs index 0dce8c8..8dcc76b 100644 --- a/src/http/mod.rs +++ b/src/http/mod.rs @@ -37,7 +37,9 @@ use hyper::client::{ Response as HyperResponse, Request, }; +use hyper::header::ContentType; use hyper::method::Method; +use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::net::HttpsConnector; use hyper::{Error as HyperError, Result as HyperResult, Url, header}; use hyper_native_tls::NativeTlsClient; @@ -803,28 +805,41 @@ pub fn edit_webhook_with_token(webhook_id: u64, token: &str, map: &JsonMap) -> R /// let token = "ig5AO-wdVWpCBtUUMxmgsWryqgsW3DChbKYOINftJ4DCrUbnkedoYZD0VOH1QLr-S3sV"; /// let map = ObjectBuilder::new().insert("content", "test").build(); /// -/// let message = match http::execute_webhook(id, token, map) { -/// Ok(message) => message, +/// let message = match http::execute_webhook(id, token, true, map) { +/// Ok(Some(message)) => message, +/// Ok(None) => { +/// println!("Expected a webhook message"); +/// +/// return; +/// }, /// Err(why) => { /// println!("Error executing webhook: {:?}", why); /// /// return; /// }, /// }; +/// ``` /// /// [`Channel`]: ../model/enum.Channel.html /// [`Message`]: ../model/struct.Message.html /// [Discord docs]: https://discordapp.com/developers/docs/resources/webhook#querystring-params -pub fn execute_webhook(webhook_id: u64, token: &str, map: &JsonMap) -> Result<Message> { +pub fn execute_webhook(webhook_id: u64, token: &str, wait: bool, map: &JsonMap) + -> Result<Option<Message>> { let body = serde_json::to_string(map)?; + let client = request_client!(); let response = retry(|| client - .post(&format!(api!("/webhooks/{}/{}"), webhook_id, token)) - .body(&body)) + .post(&format!(api!("/webhooks/{}/{}?wait={}"), webhook_id, token, wait)) + .body(&body) + .header(ContentType(Mime(TopLevel::Application, SubLevel::Json, vec![])))) .map_err(Error::Hyper)?; - serde_json::from_reader::<HyperResponse, Message>(response).map_err(From::from) + if response.status == StatusCode::NoContent { + return Ok(None); + } + + serde_json::from_reader::<HyperResponse, Message>(response).map(Some).map_err(From::from) } /// Gets the active maintenances from Discord's Status API. diff --git a/src/model/webhook.rs b/src/model/webhook.rs index 9f0309f..a858589 100644 --- a/src/model/webhook.rs +++ b/src/model/webhook.rs @@ -148,7 +148,7 @@ impl Webhook { /// let mut webhook = http::get_webhook_with_token(id, token) /// .expect("valid webhook"); /// - /// let _ = webhook.execute(|w| w.content("test")).expect("Error executing"); + /// let _ = webhook.execute(false, |w| w.content("test")).expect("Error executing"); /// ``` /// /// Execute a webhook with message content of `test`, overriding the @@ -171,15 +171,16 @@ impl Webhook { /// thread safety.") /// .url("https://rust-lang.org")); /// - /// let _ = webhook.execute(|w| w + /// let _ = webhook.execute(false, |w| w /// .content("test") /// .username("serenity") /// .embeds(vec![embed])) /// .expect("Error executing"); /// ``` #[inline] - pub fn execute<F: FnOnce(ExecuteWebhook) -> ExecuteWebhook>(&self, f: F) -> Result<Message> { - http::execute_webhook(self.id.0, &self.token, &f(ExecuteWebhook::default()).0) + pub fn execute<F: FnOnce(ExecuteWebhook) -> ExecuteWebhook>(&self, wait: bool, f: F) + -> Result<Option<Message>> { + http::execute_webhook(self.id.0, &self.token, wait, &f(ExecuteWebhook::default()).0) } /// Retrieves the latest information about the webhook, editing the |