diff --git a/examples/message_log.rs b/examples/message_log.rs new file mode 100644 index 00000000..99a4704d --- /dev/null +++ b/examples/message_log.rs @@ -0,0 +1,59 @@ +#![feature(async_await)] + +use std::{env, process::exit}; + +use futures::stream::{StreamExt as _, TryStreamExt as _}; +use ruma_events::collections::all::RoomEvent; +use ruma_events::room::message::{MessageEvent, MessageEventContent, TextMessageEventContent}; +use url::Url; + +async fn log_messages( + homeserver_url: Url, + username: String, + password: String, +) -> Result<(), ruma_client::Error> { + let client = ruma_client::Client::new(homeserver_url, None); + + client.log_in(username, password, None).await?; + + // vvvvvvvv Skip initial sync reponse + let mut sync_stream = Box::pin(client.sync(None, None, false).skip(1)); + + while let Some(res) = sync_stream.try_next().await? { + // Only look at rooms the user hasn't left yet + for (room_id, room) in res.rooms.join { + for event in room.timeline.events { + // Filter out the text messages + if let RoomEvent::RoomMessage(MessageEvent { + content: + MessageEventContent::Text(TextMessageEventContent { body: msg_body, .. }), + sender, + .. + }) = event + { + println!("{:?} in {:?}: {}", sender, room_id, msg_body); + } + } + } + } + + Ok(()) +} + +#[tokio::main] +async fn main() -> Result<(), ruma_client::Error> { + let (homeserver_url, username, password) = + match (env::args().nth(1), env::args().nth(2), env::args().nth(3)) { + (Some(a), Some(b), Some(c)) => (a, b, c), + _ => { + eprintln!( + "Usage: {} ", + env::args().next().unwrap() + ); + exit(1) + } + }; + + let server = Url::parse(&homeserver_url).unwrap(); + log_messages(server, username, password).await +}