diff options
| author | Zeyla Hellyer <[email protected]> | 2017-03-25 15:41:47 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-03-25 15:41:47 -0700 |
| commit | 9114963daf708cfaeaf54d8c788206ccfbae5df8 (patch) | |
| tree | 08d6aba5b8ad40189b312865ac776bb6fa30c45d /src/model/channel/attachment.rs | |
| parent | Add slightly more documentation (diff) | |
| download | serenity-9114963daf708cfaeaf54d8c788206ccfbae5df8.tar.xz serenity-9114963daf708cfaeaf54d8c788206ccfbae5df8.zip | |
Rework the models directory
Diffstat (limited to 'src/model/channel/attachment.rs')
| -rw-r--r-- | src/model/channel/attachment.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/model/channel/attachment.rs b/src/model/channel/attachment.rs new file mode 100644 index 0000000..387edaf --- /dev/null +++ b/src/model/channel/attachment.rs @@ -0,0 +1,92 @@ +use hyper::Client as HyperClient; +use std::io::Read; +use ::internal::prelude::*; +use ::model::Attachment; + +impl Attachment { + /// If this attachment is an image, then a tuple of the width and height + /// in pixels is returned. + pub fn dimensions(&self) -> Option<(u64, u64)> { + if let (Some(width), Some(height)) = (self.width, self.height) { + Some((width, height)) + } else { + None + } + } + + /// Downloads the attachment, returning back a vector of bytes. + /// + /// # Examples + /// + /// Download all of the attachments associated with a [`Message`]: + /// + /// ```rust,no_run + /// use serenity::Client; + /// use std::env; + /// use std::fs::File; + /// use std::io::Write; + /// use std::path::Path; + /// + /// let token = env::var("DISCORD_TOKEN").expect("token in environment"); + /// let mut client = Client::login_bot(&token); + /// + /// client.on_message(|_, message| { + /// for attachment in message.attachments { + /// let content = match attachment.download() { + /// Ok(content) => content, + /// Err(why) => { + /// println!("Error downloading attachment: {:?}", why); + /// let _ = message.channel_id.say("Error downloading attachment"); + /// + /// return; + /// }, + /// }; + /// + /// let mut file = match File::create(&attachment.filename) { + /// Ok(file) => file, + /// Err(why) => { + /// println!("Error creating file: {:?}", why); + /// let _ = message.channel_id.say("Error creating file"); + /// + /// return; + /// }, + /// }; + /// + /// if let Err(why) = file.write(&content) { + /// println!("Error writing to file: {:?}", why); + /// + /// return; + /// } + /// + /// let _ = message.channel_id.say(&format!("Saved {:?}", attachment.filename)); + /// } + /// }); + /// + /// client.on_ready(|_context, ready| { + /// println!("{} is connected!", ready.user.name); + /// }); + /// + /// let _ = client.start(); + /// ``` + /// + /// # Errors + /// + /// Returns an [`Error::Io`] when there is a problem reading the contents + /// of the HTTP response. + /// + /// Returns an [`Error::Hyper`] when there is a problem retrieving the + /// attachment. + /// + /// [`Error::Hyper`]: ../enum.Error.html#variant.Hyper + /// [`Error::Io`]: ../enum.Error.html#variant.Io + /// [`Message`]: struct.Message.html + pub fn download(&self) -> Result<Vec<u8>> { + let hyper = HyperClient::new(); + let mut response = hyper.get(&self.url).send()?; + + let mut bytes = vec![]; + response.read_to_end(&mut bytes)?; + + Ok(bytes) + } +} |