From ce46452a2f9efb7a7d8b0ae61204fdd190934888 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Thu, 11 May 2023 22:36:35 +0200 Subject: [PATCH] change message send impl --- src/api/channels/messages.rs | 67 ++++++++++++++++++++---------------- src/api/types.rs | 4 +++ 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/api/channels/messages.rs b/src/api/channels/messages.rs index 131aeaf..e914397 100644 --- a/src/api/channels/messages.rs +++ b/src/api/channels/messages.rs @@ -24,11 +24,10 @@ pub mod messages { url_api: &String, channel_id: &String, message: &mut crate::api::schemas::MessageSendSchema, - files: Option>, + files: Option<&'static Vec>, token: &String, user: &mut User<'a>, ) -> Result { - let file_attachments_static: &'static [PartialDiscordFileAttachment]; let mut requester = LimitedRequester::new().await; let user_rate_limits = &mut user.limits; let instance_rate_limits = &mut user.belongs_to.limits; @@ -62,37 +61,47 @@ pub mod messages { form = form.part("payload_json", payload_field); - if let Some(file_attachments) = files { - let boxed_attachments = file_attachments.into_boxed_slice(); - file_attachments_static = Box::leak(boxed_attachments); - for (index, attachment) in file_attachments_static.iter().enumerate() { - let part_name = format!("files[{}]", index); - let content_disposition = format!( - "form-data; name=\"{}\"'; filename=\"{}\"", - part_name, - attachment.filename.as_deref().unwrap_or("file") - ); - let mut header_map = HeaderMap::new(); - header_map - .insert(CONTENT_DISPOSITION, content_disposition.parse().unwrap()) - .unwrap(); + for (index, attachment) in files.iter().enumerate() { + let part_name = format!("files[{}]", index); + let content_disposition = format!( + "form-data; name=\"{}\"'; filename=\"{}\"", + part_name, + attachment + .get(index) + .unwrap() + .filename + .as_deref() + .unwrap_or("file") + ); + let mut header_map = HeaderMap::new(); + header_map + .insert(CONTENT_DISPOSITION, content_disposition.parse().unwrap()) + .unwrap(); - let mut part = multipart::Part::bytes(Vec::new()) - .file_name(attachment.filename.as_deref().unwrap_or("file")) + let mut part = + multipart::Part::bytes(attachment.get(index).unwrap().content.as_slice()) + .file_name( + attachment + .get(index) + .unwrap() + .filename + .as_deref() + .unwrap_or("file"), + ) .headers(header_map); - part = match part.mime_str("application/octet-stream") { - Ok(part) => part, - Err(e) => { - return Err(InstanceServerError::MultipartCreationError { - error: e.to_string(), - }) - } - }; + part = match part.mime_str("application/octet-stream") { + Ok(part) => part, + Err(e) => { + return Err(InstanceServerError::MultipartCreationError { + error: e.to_string(), + }) + } + }; - form = form.part(part_name, part); - } + form = form.part(part_name, part); } + let message_request = Client::new() .post(format!("{}/channels/{}/messages/", url_api, channel_id)) .bearer_auth(token) @@ -116,7 +125,7 @@ pub mod messages { &mut self, message: &mut crate::api::schemas::MessageSendSchema, channel_id: &String, - files: Option>, + files: Option<&'static Vec>, ) -> Result { let token = self.token().clone(); Message::send( diff --git a/src/api/types.rs b/src/api/types.rs index e52a2f8..cb46e9a 100644 --- a/src/api/types.rs +++ b/src/api/types.rs @@ -839,6 +839,8 @@ pub struct DiscordFileAttachment { ephemeral: Option, duration_secs: Option, waveform: Option, + #[serde(skip_serializing)] + content: Vec, } #[derive(Debug, Serialize, Deserialize)] @@ -856,6 +858,8 @@ pub struct PartialDiscordFileAttachment { ephemeral: Option, duration_secs: Option, waveform: Option, + #[serde(skip_serializing)] + pub content: Vec, } #[derive(Debug, Serialize, Deserialize)]