From 0649ea05038e49494eefee01d58617abf40b8130 Mon Sep 17 00:00:00 2001 From: videogame hacker Date: Mon, 29 Nov 2021 16:58:00 +0000 Subject: [PATCH] Forward image attachments from Discord to Matrix Also, there is work-in-progress work on forwarding images from encrypted Matrix rooms --- src/discord.rs | 11 +++++++++++ src/matrix.rs | 19 +++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/discord.rs b/src/discord.rs index b466665..9f237f4 100644 --- a/src/discord.rs +++ b/src/discord.rs @@ -61,6 +61,7 @@ impl EventHandler for DiscordHandler { } async fn message(&self, ctx: Context, message: Message) { + // TODO: Replace with proper management system for linking channels together if let Some(target) = message.content.strip_prefix("phoebe!link ") { if message .member(&ctx) @@ -100,6 +101,16 @@ impl EventHandler for DiscordHandler { author: get_message_author(&ctx, &message).await, replies_to, }))); + + for attachment in message.attachments.iter() { + let _ = self + .event_tx + .send(MessageEvent::SendImage(Box::new(SentImageMessage { + source: MessageReference::from(&message), + author: get_message_author(&ctx, &message).await, + image_url: attachment.proxy_url.clone(), + }))); + } } async fn message_update( diff --git a/src/matrix.rs b/src/matrix.rs index 6112598..1b2929a 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -149,6 +149,7 @@ async fn get_room_message_event( } async fn on_room_message_event( + client: Client, ctx: Arc, event: SyncMessageEvent, room: Room, @@ -157,12 +158,13 @@ async fn on_room_message_event( if let Some(Relation::Replacement(replacement)) = &event.content.relates_to { on_message_edited(ctx, &event, room, replacement).await; } else { - on_message_sent(ctx, &event, room).await; + on_message_sent(client, ctx, &event, room).await; } } } async fn on_message_sent( + client: Client, ctx: Arc, event: &SyncMessageEvent, room: Joined, @@ -226,8 +228,15 @@ async fn on_message_sent( } } - // TODO: Handle encrypted image uploads (we will have to decrypt it and upload it somewhere) - matrix_sdk::media::MediaType::Encrypted(_encrypted_file) => None, + matrix_sdk::media::MediaType::Encrypted(encrypted_file) => { + if let Some(file_data) = + client.get_file(content.clone(), true).await.ok().flatten() + { + todo!("Reupload encrypted file to publicly accessible URL") + } else { + None + } + } } } else { None @@ -461,7 +470,9 @@ pub async fn create_matrix_client( let on_msg_ctx = event_handler.clone(); client - .register_event_handler(move |ev, room| on_room_message_event(on_msg_ctx.clone(), ev, room)) + .register_event_handler(move |ev, room| { + on_room_message_event(client.clone(), on_msg_ctx.clone(), ev, room) + }) .await; let on_redact_ctx = event_handler.clone();