From dc73d1a4bad07b453a9d60a6c8f8c187a7e42450 Mon Sep 17 00:00:00 2001 From: Zeyla Hellyer Date: Tue, 20 Jun 2017 11:28:52 -0700 Subject: [PATCH] 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. --- src/builder/execute_webhook.rs | 10 +++++----- src/http/mod.rs | 27 +++++++++++++++++++++------ 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 68a39fc8f1a..e8b904236c5 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 0dce8c8bf1f..8dcc76b1dd9 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 { +pub fn execute_webhook(webhook_id: u64, token: &str, wait: bool, map: &JsonMap) + -> Result> { 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::(response).map_err(From::from) + if response.status == StatusCode::NoContent { + return Ok(None); + } + + serde_json::from_reader::(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 9f0309f17c3..a8585890c39 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 ExecuteWebhook>(&self, f: F) -> Result { - http::execute_webhook(self.id.0, &self.token, &f(ExecuteWebhook::default()).0) + pub fn execute ExecuteWebhook>(&self, wait: bool, f: F) + -> Result> { + http::execute_webhook(self.id.0, &self.token, wait, &f(ExecuteWebhook::default()).0) } /// Retrieves the latest information about the webhook, editing the