use std::error::Error; use std::fs::File; use std::io::Read; use clap::builder::Str; use pandoc::{PandocError, PandocOutput}; use reqwest; use reqwest::blocking::Client; use reqwest::tls; use serde::Deserialize; #[derive(Deserialize)] struct QueryResponse { batchcomplete: String, query: QueryTokens, } #[derive(Deserialize)] struct QueryTokens { tokens: Tokens, } #[derive(Deserialize)] struct Tokens { logintoken: String, } pub fn pad_ins_wiki(old_pad_content: String) { convert_md_to_mediawiki(old_pad_content); // Textdatei wieder einlesen // Passwörter aus Datenbank lesen (ToBeDone) /* let plenum_bot_user = String::from("PlenumBot@PlenumBot-PW1"); let plenum_bot_pw = String::from("**OLD_API_PW_REMOVED**"); let login_token = login_to_mediawiki(plenum_bot_user.clone(), plenum_bot_pw.clone()) .expect("Fehler beim Einloggen!"); println!("plenum_bot_user: {plenum_bot_user}, plenum_bot_pw: {plenum_bot_pw}, login_token: {login_token}") */ } /// Converts one file type into another using pandoc and saves the result as a txt file fn pandoc_convert(old_pad_content: String, output_filepath: &str, input_format: pandoc::InputFormat, output_format: pandoc::OutputFormat) -> Result { //Convert Markdown into Mediawiki // Vanilla pandoc Befehl: pandoc --from markdown --to mediawiki --no-highlight let mut p = pandoc::new(); p.set_input(pandoc::InputKind::Pipe(old_pad_content)); p.set_input_format(input_format, vec![]); p.set_output(pandoc::OutputKind::File(output_filepath.parse().unwrap())); p.set_output_format(output_format, vec![]); p.execute() } /// Reads a text file from a specified path and returns it as a String fn read_txt_file (filepath: &str) -> String { let mut file = File::open(filepath).expect(&*format!("Fehler beim öffnen der Textdatei mit Pfad {filepath}!")); let mut contents = String::new(); file.read_to_string(&mut contents).expect("Fehler beim auslesen der MediaWiki-Textdatei!").to_string() } /// Takes a Sting in the Markdown format and returns a String in the mediawiki Format fn convert_md_to_mediawiki (old_pad_content: String) -> String { let output_filepath: &str = "./pandoc_mediawiki.txt"; pandoc_convert(old_pad_content, output_filepath, pandoc::InputFormat::Markdown, pandoc::OutputFormat::MediaWiki).expect("Fehler beim Umwandeln des und speichern des Pads in eine mediawiki-Textdatei"); read_txt_file(output_filepath) } /// Authenticate with username and password on http basic auth pub fn get_login_token(client: &Client, http_user: &str, http_pass: &String) -> Result> { let resp = client .get("https://wiki.berlin.ccc.de/api.php?action=query&meta=tokens&type=login&format=json") .basic_auth(http_user, Some(http_pass)) .send()? .text()?; let response_deserialized: QueryResponse = serde_json::from_str(&resp)?; Ok(response_deserialized.query.tokens.logintoken) }