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