matrix-lol/src/main.rs

76 lines
2.3 KiB
Rust

use matrix_sdk::{
room::Room,
ruma::events::room::message::{
MessageType, OriginalSyncRoomMessageEvent, RoomMessageEventContent
},
Error, LoopCtrl,
};
pub mod matrix;
pub mod http;
async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room) {
if let Room::Joined(room) = room {
let MessageType::Text(text_content) = event.content.msgtype else {
return;
};
if text_content.body.contains("vcxz pls spam") {
let random_words = http::random_words(5).await;
println!("Spamming for {}: \"{}\"", event.sender, random_words.join(" "));
let content = RoomMessageEventContent::text_plain(format!("{}: Ok, searching for \"{}\"", event.sender, random_words.join(" ")));
room.send(content, None).await.unwrap();
let links = http::ddg_scrape(random_words.join(" ")).await;
let mut count = 0;
for link in links {
if count > 5 { break };
let content = http::get_content(link).await;
if content.len() < 128 { continue };
let msg = RoomMessageEventContent::notice_plain(&content);
match room.send(msg, None).await {
Ok(_r) => { count += 1; },
Err(e) => eprintln!("Failed to send message: {e}")
}
}
}
}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let data_dir = dirs::data_dir()
.expect("no data_dir directory found")
.join("vcxz_bot");
let session_file = data_dir.join("session");
let (client, sync_token) = if session_file.exists() {
matrix::restore_session(&session_file).await?
} else {
(matrix::login(&data_dir, &session_file).await?, None)
};
let (client, sync_settings) = matrix::sync(client, sync_token)
.await
.unwrap();
client.add_event_handler(on_room_message);
client.sync_with_result_callback(sync_settings, |sync_result| async move {
let response = sync_result?;
matrix::persist_sync_token(response.next_batch)
.await
.map_err(|err| Error::UnknownError(err.into()))?;
Ok(LoopCtrl::Continue)
})
.await?;
Ok(())
}