From 4c37ec5f36496960f801bb86dd8bd5c8158d4697 Mon Sep 17 00:00:00 2001 From: videogame hacker Date: Sun, 17 Apr 2022 12:34:04 +0100 Subject: [PATCH] Rework attachments & send attachments to Discord --- mid-chat/src/lib.rs | 11 +++++++++-- phoebe/src/attachments.rs | 4 ++-- services/phoebe-discord/src/handler.rs | 21 +++++++++++++-------- services/phoebe-discord/src/sender.rs | 19 ++++++++++++++++++- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/mid-chat/src/lib.rs b/mid-chat/src/lib.rs index 860c833..b59612b 100644 --- a/mid-chat/src/lib.rs +++ b/mid-chat/src/lib.rs @@ -3,8 +3,15 @@ pub use reference::*; #[derive(Debug, Clone)] pub enum ChatAttachment { - URL(String), - InMemory { file_name: String, data: Vec }, + Online { + media_type: Option, + url: String, + }, + InMemory { + media_type: Option, + file_name: String, + data: Vec, + }, } #[derive(Debug, Clone)] diff --git a/phoebe/src/attachments.rs b/phoebe/src/attachments.rs index c70349d..8339f7d 100644 --- a/phoebe/src/attachments.rs +++ b/phoebe/src/attachments.rs @@ -17,9 +17,9 @@ async fn get_base_url() -> &'static str { pub async fn attachment_to_url(attachment: &ChatAttachment) -> String { match attachment { - ChatAttachment::URL(s) => s.clone(), + ChatAttachment::Online { url, .. } => url.clone(), ChatAttachment::InMemory { .. } => { - todo!("Put in-memory attachment into webroot") + todo!("Store in-memory attachment inside webroot") } } } diff --git a/services/phoebe-discord/src/handler.rs b/services/phoebe-discord/src/handler.rs index 93bf365..00f4563 100644 --- a/services/phoebe-discord/src/handler.rs +++ b/services/phoebe-discord/src/handler.rs @@ -28,16 +28,19 @@ impl DiscordHandler { let display_color = tag_color(ctx, message).await; + let avatar_url = message + .author + .static_avatar_url() + .unwrap_or_else(|| message.author.default_avatar_url()); + ChatAuthor { reference: discord_reference(message.author.id), display_name, display_color, - avatar: ChatAttachment::URL( - message - .author - .static_avatar_url() - .unwrap_or_else(|| message.author.default_avatar_url()), - ), + avatar: ChatAttachment::Online { + media_type: None, + url: avatar_url, + }, } } } @@ -72,8 +75,10 @@ impl EventHandler for DiscordHandler { let attachments = message .attachments .into_iter() - .map(|a| a.url) - .map(ChatAttachment::URL) + .map(|a| ChatAttachment::Online { + media_type: a.content_type, + url: a.url, + }) .collect::>(); let chat_message = ChatMessage { diff --git a/services/phoebe-discord/src/sender.rs b/services/phoebe-discord/src/sender.rs index e4903ad..45130f8 100644 --- a/services/phoebe-discord/src/sender.rs +++ b/services/phoebe-discord/src/sender.rs @@ -4,7 +4,7 @@ use phoebe::{ prelude::*, }; -use serenity::{model::prelude::*, prelude::*}; +use serenity::{http::AttachmentType, model::prelude::*, prelude::*}; use crate::{chat_conv, discord_reference, DiscordService}; @@ -95,6 +95,20 @@ pub async fn send_discord_message( None }; + let files = source + .attachments + .iter() + .map(|a| match a { + phoebe::mid_chat::ChatAttachment::Online { url, .. } => AttachmentType::Image(url), + phoebe::mid_chat::ChatAttachment::InMemory { + file_name, data, .. + } => AttachmentType::Bytes { + filename: file_name.clone(), + data: data.into(), + }, + }) + .collect::>(); + if let Some(webhook) = get_or_create_webhook_for_channel(&mut *discord, &channel_id).await { let reply_embeds = if let Some((channel, message)) = discord_reply { create_webhook_reply_embeds(&discord.ctx, channel, message).await @@ -113,6 +127,7 @@ pub async fn send_discord_message( )) .avatar_url(&avatar_url) .embeds(reply_embeds) + .add_files(files.clone()) }) .await? { @@ -132,6 +147,7 @@ pub async fn send_discord_message( let sent_message = channel_id .send_message(&discord.ctx, move |m| { let m = m.content(content); + let m = m.add_files(files); if let Some(reply) = discord_reply { m.reference_message(reply) } else { @@ -139,6 +155,7 @@ pub async fn send_discord_message( } }) .await?; + Ok(ChatMessageReference::new( discord_reference(sent_message.channel_id), sent_message.id,