From 813f661ee2ebf800e62b197fa49d7179954bdee2 Mon Sep 17 00:00:00 2001 From: Neshura Date: Sun, 30 Jul 2023 20:34:24 +0200 Subject: [PATCH] Added Error handling for dropped connections --- src/main.rs | 58 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/src/main.rs b/src/main.rs index 6b6e8db..386666b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,36 +44,53 @@ impl Bot { } } - pub(crate) fn login(&mut self) { + /// Get JWT Token + /// + /// * `return` : Returns true if token was succesfully retrieved, false otherwise + pub(crate) fn login(&mut self) -> bool { let login_params = Login { username_or_email: self.secrets.lemmy.get_username(), password: self.secrets.lemmy.get_password(), totp_2fa_token: None, }; - let res = CLIENT + let res = match CLIENT .post(self.config.instance.clone() + "/api/v3/user/login") .json(&login_params) - .send() - .unwrap(); + .send() { + Ok(data) => data, + Err(_) => return false, + }; + if res.status() == StatusCode::OK { let data: &LoginResponse = &res.json().unwrap(); let jwt = data.jwt.clone().expect("JWT Token could not be acquired"); self.auth = jwt; + return true; } else { println!("Error Code: {:?}", res.status()); - panic!("JWT Token could not be acquired"); + return false; } } - pub(crate) fn post(&mut self, post_data: CreatePost) { - let res = CLIENT + /// Make Post to Lemmy Instance + /// + /// * `post_data` : Object of type [CreatePost] containing post info + /// * `return` : Returns true if Post was succesful, false otherwise + pub(crate) fn post(&mut self, post_data: CreatePost) -> bool { + let res = match CLIENT .post(self.config.instance.clone() + "/api/v3/post") .json(&post_data) - .send() - .unwrap(); + .send() { + Ok(data) => data, + Err(_) => return false + }; + + // TODO: process res to get info about if post was successfuly (mostly if jwt token was valid) + + return true; } pub(crate) fn run_once(&mut self, mut prev_time: NaiveTime) { @@ -91,7 +108,10 @@ impl Bot { post_queue.iter().for_each(|post| { println!("Posting: {}", post.name); - self.post(post.clone()); + loop { + if self.post(post.clone()) {break}; + println!("Post attempt failed, retrying"); + } }); } @@ -99,7 +119,10 @@ impl Bot { while Utc::now().time() - self.start_time.time() < chrono::Duration::seconds(30) { sleep(time::Duration::from_secs(10)); } - let _ = reqwest::blocking::get("https://status.neshweb.net/api/push/7s1CjPPzrV?status=up&msg=OK&ping="); + match reqwest::blocking::get("https://status.neshweb.net/api/push/7s1CjPPzrV?status=up&msg=OK&ping=") { + Ok(_) => {}, + Err(err) => println!("{}", err) + }; } pub(crate) fn print_info(&self) { @@ -136,19 +159,20 @@ fn list_posts(auth: &Sensitive, base: String) -> GetPostsResponse { } fn run_bot() { - // Get all needed auth tokens at the start - let mut old = Utc::now().time(); - let mut this = Bot::new(); - this.login(); + // Get all needed auth tokens at the start + let mut old = Utc::now().time(); + let mut this = Bot::new(); + if this.login() { this.community_ids.load(&this.auth, &this.config.instance); - + // Enter a loop (not for debugging) loop { this.idle(); this.run_once(old); this.print_info(); this.idle(); - } + } + } } fn main() -> Result<(), io::Error> { run_bot();