aboutsummaryrefslogtreecommitdiff
path: root/src/model/channel/attachment.rs
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-03-25 15:41:47 -0700
committerZeyla Hellyer <[email protected]>2017-03-25 15:41:47 -0700
commit9114963daf708cfaeaf54d8c788206ccfbae5df8 (patch)
tree08d6aba5b8ad40189b312865ac776bb6fa30c45d /src/model/channel/attachment.rs
parentAdd slightly more documentation (diff)
downloadserenity-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.rs92
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)
+ }
+}