mod.rs (2817B)
1 use crate::config::Config; 2 use matrix_sdk::{Client, ClientConfig, Session as SDKSession, SyncSettings}; 3 use mrsbfh::url::Url; 4 use mrsbfh::utils::Session; 5 use std::{convert::TryFrom, error::Error, fs, path::Path, sync::Arc}; 6 use tokio::sync::Mutex; 7 use tracing::*; 8 9 mod sync; 10 11 pub async fn setup(config: Config<'_>) -> Result<Client, Box<dyn Error>> { 12 info!("Beginning Matrix Setup"); 13 let store_path_string = config.store_path.to_string(); 14 let store_path = Path::new(&store_path_string); 15 if !store_path.exists() { 16 fs::create_dir_all(store_path)?; 17 } 18 let client_config = ClientConfig::new().store_path(fs::canonicalize(&store_path)?); 19 20 let homeserver_url = 21 Url::parse(&config.homeserver_url).expect("Couldn't parse the homeserver URL"); 22 23 let client = Client::new_with_config(homeserver_url, client_config).unwrap(); 24 25 if let Some(session) = Session::load(config.session_path.parse().unwrap()) { 26 info!("Starting relogin"); 27 28 let session = SDKSession { 29 access_token: session.access_token, 30 device_id: session.device_id.into(), 31 user_id: matrix_sdk::ruma::UserId::try_from(session.user_id.as_str()).unwrap(), 32 }; 33 34 if let Err(e) = client.restore_login(session).await { 35 error!("{}", e); 36 }; 37 info!("Finished relogin"); 38 } else { 39 info!("Starting login"); 40 let login_response = client 41 .login( 42 &config.mxid, 43 &config.password, 44 None, 45 Some(&"timetracking-bot".to_string()), 46 ) 47 .await; 48 match login_response { 49 Ok(login_response) => { 50 info!("Session: {:#?}", login_response); 51 let session = Session { 52 homeserver: client.homeserver().await.to_string(), 53 user_id: login_response.user_id.to_string(), 54 access_token: login_response.access_token, 55 device_id: login_response.device_id.into(), 56 }; 57 session.save(config.session_path.parse().unwrap())?; 58 } 59 Err(e) => error!("Error while login: {}", e), 60 } 61 info!("Finished login"); 62 } 63 64 info!("logged in as {}", config.mxid); 65 66 Ok(client) 67 } 68 69 pub async fn start_sync( 70 client: &mut Client, 71 config: Config<'static>, 72 ) -> Result<(), Box<dyn Error>> { 73 client.register_event_handler(mrsbfh::sync::autojoin).await; 74 75 let config = Arc::new(Mutex::new(config)); 76 client 77 .register_event_handler(move |ev, room, client| { 78 sync::on_room_message(ev, room, client, config.clone()) 79 }) 80 .await; 81 82 info!("Starting full Sync..."); 83 client.sync(SyncSettings::default()).await; 84 85 Ok(()) 86 }