überall async entfernt, lauffähiger Zustand
This commit is contained in:
		
							parent
							
								
									9db5955c1b
								
							
						
					
					
						commit
						c026a38239
					
				
					 3 changed files with 27 additions and 33 deletions
				
			
		|  | @ -5,16 +5,15 @@ edition = "2021" | |||
| 
 | ||||
| [dependencies] | ||||
| pandoc = "0.8" | ||||
| tokio = { version = "1", features = ["full"] } | ||||
| chrono = "0.4.38" | ||||
| regex = "1.10.5" | ||||
| futures = "0.3.30" | ||||
| headers = "0.4.0" | ||||
| reqwest = "0.12.5" | ||||
| reqwest = {version = "0.12.5", features = ["blocking"]} | ||||
| lettre = "0.11.7" | ||||
| rand = "0.9.0-alpha.1" | ||||
| rusqlite = "0.31.0" | ||||
| uuid = { version = "1.10.0", features = ["v4"] } | ||||
| log = "0.4.22" | ||||
| clap = "4.5.11" | ||||
| rpassword = "7.3.1" | ||||
| rpassword = "7.3.1" | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| use reqwest::{Client,Response}; | ||||
| use reqwest::blocking::Response; | ||||
| use reqwest::blocking::Client; | ||||
| use std::error::Error; | ||||
| 
 | ||||
| // TODO: implement dry-run logic
 | ||||
|  | @ -21,28 +22,28 @@ impl HedgeDoc { | |||
|         format!( "{}/{}/{}", self.server_url, pad_name, verb ) | ||||
|     } | ||||
| 
 | ||||
|     async fn do_request( &self, url : &str ) -> Result<Response, Box<dyn Error>> { | ||||
|         Ok(self.client.get( url ).send().await?) | ||||
|     fn do_request(&self, url : &str ) -> Result<Response, Box<dyn Error>> { | ||||
|         Ok(self.client.get( url ).send().unwrap()) | ||||
|     } | ||||
| 
 | ||||
|     fn get_id_from_response( &self, res : Response ) -> String { | ||||
|         res.url().to_string().trim_start_matches( &format!( "{}/", self.server_url ) ).to_string() | ||||
|     } | ||||
| 
 | ||||
|     pub async fn download( &self, pad_name: &str ) -> Result<String, Box<dyn Error>> { | ||||
|         Ok(self.do_request( &self.format_action(pad_name, "download") ).await?.text().await?) | ||||
|     pub fn download( &self, pad_name: &str ) -> Result<String, Box<dyn Error>> { | ||||
|         Ok(self.do_request( &self.format_action(pad_name, "download"))?.text()?) | ||||
|     } | ||||
| 
 | ||||
|     pub async fn create_pad( &self ) -> Result<String, Box<dyn Error>> { | ||||
|         let res = self.do_request( &format!( "{}/new", self.server_url ) ).await?; | ||||
|     pub fn create_pad( &self ) -> Result<String, Box<dyn Error>> { | ||||
|         let res = self.do_request( &format!( "{}/new", self.server_url ) ).unwrap(); | ||||
|         if res.status().is_success() { | ||||
|             Ok(self.get_id_from_response(res)) | ||||
|         } else { | ||||
|             Err( format!("Failed to create pad {}\n{}", res.status(), res.text().await?).into() ) | ||||
|             Err( format!("Failed to create pad {}", res.status()).into() ) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub async fn import_note( &self, id: Option<&str>, content: String ) -> Result<String, Box<dyn Error>> { | ||||
|     pub fn import_note( &self, id: Option<&str>, content: String ) -> Result<String, Box<dyn Error>> { | ||||
|         let url = match id { | ||||
|             Some(id) => self.format_url( &format!( "new/{id}" ) ), | ||||
|             None => self.format_url("new"), | ||||
|  | @ -51,13 +52,12 @@ impl HedgeDoc { | |||
|         let res = self.client.post(&url) | ||||
|             .header( "Content-Type", "text/markdown" ) | ||||
|             .body(content) | ||||
|             .send() | ||||
|             .await?; | ||||
|             .send()?; | ||||
| 
 | ||||
|         if res.status().is_success() { | ||||
|             Ok(self.get_id_from_response(res)) | ||||
|         } else { | ||||
|             Err( format!("Failed to import note: {}\n{}", res.status(), res.text().await?).into() ) | ||||
|             Err( format!("Failed to import note: {}", res.status()).into() ) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										31
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								src/main.rs
									
										
									
									
									
								
							|  | @ -50,7 +50,6 @@ use uuid::Uuid; | |||
| use lettre::{Message, SmtpTransport, Transport}; | ||||
| use lettre::message::{header, SinglePart}; | ||||
| use lettre::transport::smtp::authentication::Credentials; | ||||
| use reqwest; | ||||
| 
 | ||||
| const FALLBACK_TEMPLATE: &str = variables_and_settings::FALLBACK_TEMPLATE; | ||||
| 
 | ||||
|  | @ -96,8 +95,7 @@ fn parse_args() -> Args { | |||
| 
 | ||||
| /* ***** Main ***** */ | ||||
| 
 | ||||
| #[tokio::main] | ||||
| async fn main() -> Result<(), Box<dyn Error>> { | ||||
| fn main() -> Result<(), Box<dyn Error>> { | ||||
|     // set up config file access
 | ||||
|     let args = parse_args(); | ||||
|     let config_file = args.config_file.as_str(); | ||||
|  | @ -164,7 +162,7 @@ async fn main() -> Result<(), Box<dyn Error>> { | |||
| 
 | ||||
|     let top_anzahl: i32 = 0; // Muss noch gecodet werden
 | ||||
|     let yesterday_was_plenum = true; // Das ist nur zu Testzwecken, kommt noch weg
 | ||||
|     let pad_content = hedgedoc.download(¤t_pad_id).await.expect("Fehler beim Download des Pads!"); | ||||
|     let pad_content = hedgedoc.download(¤t_pad_id).expect("Fehler beim Download des Pads!"); | ||||
|     let pad_content_without_top_instructions = try_to_remove_top_instructions(pad_content); | ||||
|     println!("Pad-content geladen!"); | ||||
|     let current_pad_link = hedgedoc.format_url(¤t_pad_id); | ||||
|  | @ -181,7 +179,7 @@ async fn main() -> Result<(), Box<dyn Error>> { | |||
|         } | ||||
|         if number_of_tops(&pad_content_without_top_instructions) != 0 { | ||||
|             // Mail an alle senden, findet statt
 | ||||
|             let betreff = format!("Morgen ist Plenum!"); // ADJ_TIMEYWIMEY
 | ||||
|             let betreff = "Morgen ist Plenum!".to_string(); // ADJ_TIMEYWIMEY
 | ||||
|             let message: String = format!(r#"{email_greeting}
 | ||||
| 
 | ||||
| Es gibt Themen, deshalb wird das morgige Plenum statt finden. Anbei das Plenumspad: | ||||
|  | @ -198,17 +196,17 @@ Bis morgen, 20 Uhr! | |||
|             message_id = Some(mail_versenden(&config, betreff, message).expect("Plenum findet statt. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")) | ||||
|         } else { | ||||
|             // Mail an alle senden und absagen
 | ||||
|             let betreff = format!("Plenum am {nächster_plenumtermin} fällt mangels Themen aus"); | ||||
|             let betreff = format!("Plenum am {} fällt mangels Themen aus", nächster_plenumtermin); | ||||
|             let message: String = format!(r#"{email_greeting}
 | ||||
| 
 | ||||
| Es gibt keine Themen, deshalb wird das morgige Plenum leider nicht statt finden. | ||||
| 
 | ||||
| Hier ist der Link zum Pad vom nächsten Plenum, das am {nächster_plenumtermin} statt finden wird: | ||||
| Hier ist der Link zum Pad vom nächsten Plenum, das am {} statt finden wird: | ||||
|   {future_pad_link} | ||||
| 
 | ||||
| Bis zum nächsten Plenum. | ||||
| 
 | ||||
| {email_signature}"#);
 | ||||
| {email_signature}"#, nächster_plenumtermin);
 | ||||
|             println!("---E-Mail:---\n{}\n-----------", message); | ||||
|             // XXX option x expect
 | ||||
|             message_id = Some(mail_versenden(&config, betreff, message).expect("Plenum wird abgesagt. Mail wurde versucht zu senden, konnte aber nicht gesendet werden!")) | ||||
|  | @ -217,7 +215,7 @@ Bis zum nächsten Plenum. | |||
|         println!("In 3 Tagen ist Plenum, deshalb wird eine Erinnerung raus geschickt!"); | ||||
|         if number_of_tops(&pad_content_without_top_instructions) == 0 { | ||||
|             // Mail an alle senden und sagen, dass es noch keine Themen gibt
 | ||||
|             let betreff = format!("Plenum vom {nächster_plenumtermin}: Bisher noch keine Themen"); | ||||
|             let betreff = format!("Plenum vom {}: Bisher noch keine Themen", nächster_plenumtermin); | ||||
|             let message: String = format!(r#"{email_greeting}
 | ||||
| 
 | ||||
| Es sind bisher leider keine Themen zusammengekommen.  Wenn es bis Sonntag Abend keine Themen gibt, wird das Plenum voraussichtlich nicht statt finden. | ||||
|  | @ -232,7 +230,7 @@ Hier ist der Link zum Pad, wo ihr noch Themen eintragen könnt: | |||
|         } | ||||
|     } else if yesterday_was_plenum { | ||||
|         // This logic breaks on 02/2034, but on every other month it works
 | ||||
|         let old_pad_content = hedgedoc.download(¤t_pad_id).await.expect("Fehler beim Download des Pads!"); | ||||
|         let old_pad_content = hedgedoc.download(¤t_pad_id).expect("Fehler beim Hedgedoc-Pad-Download!"); | ||||
|         // MUSS WIEDER REIN NACH DEM TESTEN: generate_new_pad_for_following_date(übernächster_plenumtermin, überübernächster_plenumtermin, &config).await.expect("Fehler! Plenumspad konnte nicht generiert werden!");
 | ||||
|         println!("DATENBANK: aktuelles-plenumspad: {:?} und zukünftiges plenumspad: {:?}", &config.get("hedgedoc-last-id"), &config.get("hedgedoc-next-id")); | ||||
| 
 | ||||
|  | @ -355,25 +353,22 @@ fn mail_versenden(config: &KV, betreff: String, inhalt: String) -> std::result:: | |||
|     } | ||||
| } | ||||
| 
 | ||||
| async fn generate_new_pad_for_following_date(config : KV, hedgedoc : HedgeDoc, übernächster_plenumtermin: &String, überübernächster_plenumtermin: &String, kv: &KV) -> Result<(), Box<dyn Error>> { | ||||
| fn generate_new_pad_for_following_date(config : KV, hedgedoc : HedgeDoc, übernächster_plenumtermin: &String, überübernächster_plenumtermin: &String, kv: &KV) -> Result<(), Box<dyn Error>> { | ||||
| 
 | ||||
|     match hedgedoc.create_pad( ).await { | ||||
|     match hedgedoc.create_pad( ) { | ||||
|         Err(e) => println!("Failed to create pad: {}", e), | ||||
|         Ok(pad_id) => { | ||||
|             println!("Pad created successfully with ID: {}", pad_id); | ||||
| 
 | ||||
|             // Get the most recent plenum template and replace the placeholders:
 | ||||
|             let template_content = match config.get("hedgedoc-template-name") { | ||||
|                 Ok(str) => match hedgedoc.download(&str).await { | ||||
|                     Ok(content) => content, | ||||
|                     Err(_) => FALLBACK_TEMPLATE.to_string(), | ||||
|                 } | ||||
|             let template_content: String = match config.get("hedgedoc-template-name") { | ||||
|                 Ok(content) => hedgedoc.download(&content.clone()).unwrap_or_else(|_| FALLBACK_TEMPLATE.to_string()), | ||||
|                 Err(_) => FALLBACK_TEMPLATE.to_string(), | ||||
|             }; | ||||
|             // XXX you don't just use the template as-is…
 | ||||
|             let template_modified: String = replace_placeholders(&template_content, übernächster_plenumtermin, überübernächster_plenumtermin).unwrap_or_else(|error |template_content); // Try regex, if not successful use without regex
 | ||||
| 
 | ||||
|             match hedgedoc.import_note( Some(&pad_id), template_modified ).await { | ||||
|             match hedgedoc.import_note( Some(&pad_id), template_modified ) { | ||||
|                 Ok(_) => { | ||||
|                     println!("Pad updated successfully with template content."); | ||||
|                     rotate (&pad_id, kv); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 murmeldin
							murmeldin