use anyhow::{Context, Result}; use matrix_sdk::room::{Joined, MessagesOptions}; use matrix_sdk::ruma::events::room::message::{ MessageType, RoomMessageEventContent, TextMessageEventContent, }; use matrix_sdk::ruma::events::{ AnyMessageLikeEvent, AnyRoomEvent, MessageLikeEvent, OriginalMessageLikeEvent, }; use uwuifier::uwuify_str_sse; pub async fn uwuify(room: Joined, message: &str) -> Result<()> { let message = if message.is_empty() { if let Ok(msg) = get_previous_message(&room).await { uwuify_str_sse(&msg.body) } else { "uwu".to_owned() } } else { uwuify_str_sse(message) }; let content = RoomMessageEventContent::text_plain(message); room.send(content, None).await?; Ok(()) } async fn get_previous_message(room: &Joined) -> Result { let last_prev_batch = (**room) .last_prev_batch() .context("No previous batch key while trying to find previous message")?; let request = MessagesOptions::backward(&last_prev_batch); let messages = room.messages(request).await?; messages .chunk .iter() .filter_map(|msg| msg.event.deserialize().ok()) .find_map(|msg| { if let AnyRoomEvent::MessageLike(AnyMessageLikeEvent::RoomMessage( MessageLikeEvent::Original(OriginalMessageLikeEvent { content: RoomMessageEventContent { msgtype: MessageType::Text(content), .. }, .. }), )) = msg { Some(content) } else { None } }) .context("Failed to find previous message") }