matrix-bot/src/commands/uwuify.rs

56 lines
1.8 KiB
Rust

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<TextMessageEventContent> {
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")
}