From a3441429dae611f938a2fed506b0dea9718b5903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 8 Jul 2020 20:22:50 +0200 Subject: [PATCH] matrix-sdk: Add an autojoin example. --- matrix_sdk/examples/autojoin.rs | 100 ++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 matrix_sdk/examples/autojoin.rs diff --git a/matrix_sdk/examples/autojoin.rs b/matrix_sdk/examples/autojoin.rs new file mode 100644 index 00000000..0b95c673 --- /dev/null +++ b/matrix_sdk/examples/autojoin.rs @@ -0,0 +1,100 @@ +use std::{env, process::exit}; + +use matrix_sdk::{ + self, + events::{room::member::MemberEventContent, stripped::StrippedRoomMember}, + Client, ClientConfig, EventEmitter, SyncRoom, SyncSettings, +}; +use matrix_sdk_common_macros::async_trait; +use url::Url; + +struct AutoJoinBot { + client: Client, +} + +impl AutoJoinBot { + pub fn new(client: Client) -> Self { + Self { client } + } +} + +#[async_trait] +impl EventEmitter for AutoJoinBot { + async fn on_stripped_state_member( + &self, + room: SyncRoom, + room_member: &StrippedRoomMember, + _: Option, + ) { + if room_member.state_key != self.client.user_id().await.unwrap() { + return; + } + + match room { + SyncRoom::Invited(room) => { + let room = room.read().await; + println!("Autojoining room {}", room.display_name()); + self.client + .join_room_by_id(&room.room_id) + .await + .expect("Can't join room"); + } + _ => (), + } + } +} + +async fn login_and_sync( + homeserver_url: String, + username: String, + password: String, +) -> Result<(), matrix_sdk::Error> { + let mut home = dirs::home_dir().expect("no home directory found"); + home.push("autojoin_bot"); + + let client_config = ClientConfig::new().store_path(home); + + let homeserver_url = Url::parse(&homeserver_url).expect("Couldn't parse the homeserver URL"); + let mut client = Client::new_with_config(homeserver_url, client_config).unwrap(); + + client + .login( + username.clone(), + password, + None, + Some("autojoin bot".to_string()), + ) + .await?; + + println!("logged in as {}", username); + + client + .add_event_emitter(Box::new(AutoJoinBot::new(client.clone()))) + .await; + + client + .sync_forever(SyncSettings::default(), |_| async {}) + .await; + + Ok(()) +} + +#[tokio::main] +async fn main() -> Result<(), matrix_sdk::Error> { + tracing_subscriber::fmt::init(); + + 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) + } + }; + + login_and_sync(homeserver_url, username, password).await?; + Ok(()) +}