From 8cc8561e6a1be4ac9840acebef1e51922e50f3a7 Mon Sep 17 00:00:00 2001 From: vanten-s Date: Wed, 28 Aug 2024 12:05:21 +0200 Subject: [PATCH] Workin --- Cargo.lock | 19 +++++++++++++++++++ Cargo.toml | 1 + src/lib.rs | 50 ++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 58 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 733cfbf..5f78cdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -196,6 +196,15 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -595,6 +604,15 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "mail-parser" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5a1335c3a964788c90cb42ae04a34b5f2628e89566949ce3bd4ada695c0bcd" +dependencies = [ + "encoding_rs", +] + [[package]] name = "mailing-list-matrix-bridge" version = "0.1.0" @@ -602,6 +620,7 @@ dependencies = [ "color-eyre", "eyre", "futures", + "mail-parser", "mlpa", "ruma-client", "ruma-client-api", diff --git a/Cargo.toml b/Cargo.toml index 53b658d..713c739 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" color-eyre = "0.6.3" eyre = "0.6.12" futures = "0.3.30" +mail-parser = "0.9.3" mlpa = "0.4.0" ruma-client = { version = "0.13.0", features = ["hyper-native-tls", "client-api"] } ruma-client-api = "0.18.0" diff --git a/src/lib.rs b/src/lib.rs index e26bc48..a1f56f4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,10 @@ use config::Config; use eyre::Result; -use std::{ffi::c_char, sync::Mutex}; +use mail_parser::MessageParser; +use std::{ + ffi::{c_char, CStr}, + sync::Mutex, +}; use mlpa::Plugin; use ruma_client::{http_client::HyperNativeTls, Client}; @@ -14,8 +18,8 @@ mod config; pub extern "C" fn get_plugin() -> Plugin { use mlpa::Optional::*; Plugin { - on_start: Some(on_start), - message_handler: Some(message_handler), + on_start: Some(on_start_wrapper), + message_handler: Some(message_handler_wrapper), } } @@ -23,14 +27,39 @@ static CLIENT: Mutex>> = Mutex::new(None); static ROOM_ID: Mutex> = Mutex::new(None); static CONFIG: Mutex> = Mutex::new(None); -extern "C" fn on_start() { +extern "C" fn on_start_wrapper() { println!("Creating körtid"); let handle = tokio::runtime::Runtime::new().expect("Couldn't skapa the körtid"); println!("Går in i körtid"); - handle.block_on(start()).unwrap(); + handle.block_on(on_start()).unwrap(); } -extern "C" fn message_handler(_message: *const c_char) {} +extern "C" fn message_handler_wrapper(message: *const c_char) { + let message = unsafe { + let message = CStr::from_ptr(message); + let message = String::from_utf8_lossy(message.to_bytes()); + message.to_string() + }; + + println!("Creating körtid"); + let handle = tokio::runtime::Runtime::new().expect("Couldn't skapa the körtid"); + println!("Går in i körtid"); + handle.block_on(message_handler(message)).unwrap(); +} + +async fn message_handler(message: String) -> Result<()> { + let message = MessageParser::default().parse(&message).unwrap(); + + let message_body = message.body_text(0).unwrap(); + let message_sender = message.sender().unwrap().as_list().unwrap()[0] + .address() + .unwrap(); + + let message = format!("New mail from {message_sender}:\n{message_body}"); + + send_message(&message).await?; + Ok(()) +} async fn create_room_id() -> Result<()> { let config = CONFIG.lock().unwrap(); @@ -94,17 +123,14 @@ async fn send_message(message: &str) -> Result<()> { let transaction_id = TransactionId::new(); let text_content = TextMessageEventContent::plain(message); let content = RoomMessageEventContent::new(MessageType::Text(text_content)); - let message = send_message_event::v3::Request::new( - room_id, - transaction_id.to_owned(), - &content, - )?; + let message = + send_message_event::v3::Request::new(room_id, transaction_id.to_owned(), &content)?; client.send_request(message).await?; Ok(()) } -async fn start() -> Result<()> { +async fn on_start() -> Result<()> { create_config().await?; create_client().await?; create_room_id().await?;