on_message.rs
1 use std::sync::Arc; 2 3 use matrix_sdk::{ 4 Client, Room, RoomState, 5 event_handler::Ctx, 6 ruma::{ 7 api::client::receipt::create_receipt::v3::ReceiptType, 8 events::{ 9 receipt::ReceiptThread, 10 room::message::{MessageType, OriginalSyncRoomMessageEvent}, 11 }, 12 }, 13 }; 14 15 use crate::{context::Context, matrix::commands}; 16 17 pub async fn handle( 18 event: OriginalSyncRoomMessageEvent, 19 client: Client, 20 room: Room, 21 context: Ctx<Arc<Context>>, 22 ) -> anyhow::Result<()> { 23 let event = event.into_full_event(room.room_id().to_owned()); 24 if room.state() != RoomState::Joined || event.sender == client.user_id().unwrap() { 25 return Ok(()); 26 } 27 28 tokio::spawn({ 29 let room = room.clone(); 30 let event_id = event.event_id.clone(); 31 async move { 32 room.send_single_receipt(ReceiptType::Read, ReceiptThread::Unthreaded, event_id) 33 .await 34 } 35 }); 36 37 let MessageType::Text(content) = &event.content.msgtype else { 38 return Ok(()); 39 }; 40 41 if content 42 .body 43 .trim() 44 .starts_with(client.user_id().unwrap().as_str()) 45 || content.formatted.as_ref().is_some_and(|f| { 46 f.body.trim().starts_with(&format!( 47 r#"<a href="{}">"#, 48 client.user_id().unwrap().matrix_to_uri(), 49 )) 50 }) 51 { 52 commands::help(&event, &room, &context.config).await?; 53 return Ok(()); 54 } 55 56 let Some(cmd) = content 57 .body 58 .strip_prefix(&context.config.matrix.command_prefix) 59 else { 60 return Ok(()); 61 }; 62 63 commands::handle(&event, room, context.0, cmd).await 64 }