76 lines
2.3 KiB
Rust
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(())
|
|
}
|