0a992e2900
In preparation for separate programs, the config spec is now built in main; each module defines its own group and main combines them all.
107 lines
3.9 KiB
Rust
107 lines
3.9 KiB
Rust
use crate::config_spec::{CfgField, CfgGroup};
|
|
use pandoc::{PandocError, PandocOutput};
|
|
use reqwest;
|
|
use reqwest::blocking::Client;
|
|
use reqwest::tls;
|
|
use serde::Deserialize;
|
|
use std::error::Error;
|
|
use std::fs::File;
|
|
use std::io::Read;
|
|
|
|
pub const CONFIG: CfgGroup<'static> = CfgGroup {
|
|
name: "wiki",
|
|
description: "API Settings for Mediawiki",
|
|
fields: &[
|
|
CfgField::Default {
|
|
key: "server-url",
|
|
default: "https://wiki.berlin.ccc.de/",
|
|
description: "Server running the wiki.",
|
|
},
|
|
CfgField::Default {
|
|
key: "http-user",
|
|
default: "cccb-wiki",
|
|
description: "HTTP basic auth user name.",
|
|
},
|
|
CfgField::Password { key: "http-password", description: "HTTP basic auth password." },
|
|
CfgField::Default {
|
|
key: "api-user",
|
|
default: "PlenumBot@PlenumBot-PW1",
|
|
description: "API Username associated with the bot account used for edits.",
|
|
},
|
|
CfgField::Password {
|
|
key: "api-secret",
|
|
description: "API secret / \"password\" used for authenticating as the bot.",
|
|
},
|
|
],
|
|
};
|
|
|
|
#[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<PandocOutput, PandocError> {
|
|
//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<String, Box<dyn Error>> {
|
|
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)
|
|
}
|