aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-06-20 11:28:52 -0700
committerZeyla Hellyer <[email protected]>2017-06-20 11:28:52 -0700
commitdc73d1a4bad07b453a9d60a6c8f8c187a7e42450 (patch)
tree8c8c4b86e371f8d3dd4262ac8d96b4cda672b9ad /src
parentFix broken docs links on Permissions struct (diff)
downloadserenity-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.rs10
-rw-r--r--src/http/mod.rs27
-rw-r--r--src/model/webhook.rs9
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