56 lines
1.8 KiB
Rust
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")
|
|
}
|