Struct Attachment

Source
#[non_exhaustive]
pub struct Attachment { pub id: AttachmentId, pub filename: String, pub description: Option<String>, pub height: Option<u32>, pub proxy_url: String, pub size: u32, pub url: String, pub width: Option<u32>, pub content_type: Option<String>, pub ephemeral: bool, pub duration_secs: Option<f64>, pub waveform: Option<Vec<u8>>, }
Expand description

A file uploaded with a message. Not to be confused with Embeds.

Discord docs.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§id: AttachmentId

The unique ID given to this attachment.

§filename: String

The filename of the file that was uploaded. This is equivalent to what the uploader had their file named.

§description: Option<String>

Description for the file (max 1024 characters).

§height: Option<u32>

If the attachment is an image, then the height of the image is provided.

§proxy_url: String

The proxy URL.

§size: u32

The size of the file in bytes.

§url: String

The URL of the uploaded attachment.

§width: Option<u32>

If the attachment is an image, then the width of the image is provided.

§content_type: Option<String>

The attachment’s media type.

§ephemeral: bool

Whether this attachment is ephemeral.

Ephemeral attachments will automatically be removed after a set period of time.

Ephemeral attachments on messages are guaranteed to be available as long as the message itself exists.

§duration_secs: Option<f64>

The duration of the audio file (present if MessageFlags::IS_VOICE_MESSAGE).

§waveform: Option<Vec<u8>>

List of bytes representing a sampled waveform (present if MessageFlags::IS_VOICE_MESSAGE).

The waveform is intended to be a preview of the entire voice message, with 1 byte per datapoint. Clients sample the recording at most once per 100 milliseconds, but will downsample so that no more than 256 datapoints are in the waveform.

The waveform details are a Discord implementation detail and may change without warning or documentation.

Implementations§

Source§

impl Attachment

Source

pub fn dimensions(&self) -> Option<(u32, u32)>

If this attachment is an image, then a tuple of the width and height in pixels is returned.

Source

pub async fn download(&self) -> Result<Vec<u8>>

Downloads the attachment, returning back a vector of bytes.

§Examples

Download all of the attachments associated with a Message:

use std::io::Write;
use std::path::Path;

use serenity::model::prelude::*;
use serenity::prelude::*;
use tokio::fs::File;
use tokio::io::AsyncWriteExt;


#[serenity::async_trait]
impl EventHandler for Handler {
    async fn message(&self, context: Context, mut message: Message) {
        for attachment in message.attachments {
            let content = match attachment.download().await {
                Ok(content) => content,
                Err(why) => {
                    println!("Error downloading attachment: {:?}", why);
                    let _ =
                        message.channel_id.say(&context, "Error downloading attachment").await;

                    return;
                },
            };

            let mut file = match File::create(&attachment.filename).await {
                Ok(file) => file,
                Err(why) => {
                    println!("Error creating file: {:?}", why);
                    let _ = message.channel_id.say(&context, "Error creating file").await;

                    return;
                },
            };

            if let Err(why) = file.write_all(&content).await {
                println!("Error writing to file: {:?}", why);

                return;
            }

            let _ = message
                .channel_id
                .say(&context, format!("Saved {:?}", attachment.filename))
                .await;
        }
    }
}
§Errors

Returns an Error::Io when there is a problem reading the contents of the HTTP response.

Returns an Error::Http when there is a problem retrieving the attachment.

Trait Implementations§

Source§

impl Clone for Attachment

Source§

fn clone(&self) -> Attachment

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Attachment

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Attachment

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for Attachment

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneDebuggableStorage for T

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> CloneableStorage for T
where T: Any + Send + Sync + Clone,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DebuggableStorage for T
where T: Any + Send + Sync + Debug,

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T