use log::info; use transmission_rpc::types::{BasicAuth, Id, Result, Torrent, Torrents}; use transmission_rpc::TransClient; pub struct App { client: TransClient, } impl App { pub fn new(url: &String, username: &String, password: &String) -> Self { let auth = BasicAuth { user: username.clone(), password: password.clone(), }; let client = TransClient::with_auth(url.as_str(), auth); Self { client } } pub async fn run(mut self) -> Result<()> { let response = self.client.torrent_get(None, None).await; match response { Ok(res) => self.scan_files(res.arguments).await.unwrap(), Err(e) => println!("{}", e.to_string()), } return Ok(()); } async fn scan_files(self, torrents: Torrents) -> Result<()> { let mut torrents_to_remove = Vec::new(); for torrent in torrents.torrents { match (torrent.id, torrent.is_stalled) { (Some(id), Some(true)) => { info!( "processing: (id: {}, name: {})", id, torrent .name .unwrap_or("name could not be found from torrent".to_string()) ); torrents_to_remove.push(id); } _ => { info!("did not fit criteria (everything is good for this torrent)"); continue; } } } if torrents_to_remove.len() != 0 { info!("cleaning up torrents"); self.clean_up_torrents(torrents_to_remove).await; } else { info!("nothing to cleanup") } return Ok(()); } async fn clean_up_torrents(mut self, torrent_ids: Vec) { self.client .torrent_remove(torrent_ids.iter().map(|ti| Id::Id(*ti)).collect(), true) .await .expect("to remove torrent"); } }