plenum-bot/src/mediawiki.rs

145 lines
4.7 KiB
Rust
Raw Normal View History

2024-08-05 19:29:02 +02:00
use std::error::Error;
use std::fs::File;
use std::io::Read;
use pandoc::{PandocError, PandocOutput};
use reqwest::blocking::Client;
use serde::Deserialize;
2024-08-05 19:29:02 +02:00
use crate::config_spec::{CfgField, CfgGroup};
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.",
},
],
};
2024-08-17 21:52:54 +02:00
#[derive(Debug)]
pub struct Mediawiki {
server_url: String,
http_user: String,
http_password: String,
is_dry_run: bool,
client: Client,
}
impl Mediawiki {
pub fn new(
server_url: &str, http_auth_user: &str, http_auth_password: &str, is_dry_run: bool,
) -> Self {
Self {
server_url: server_url.to_string(),
http_user: http_auth_user.to_string(),
http_password: http_auth_password.to_string(),
is_dry_run,
client: Client::new(),
}
}
/// Authenticate with username and password on http basic auth
pub fn get_login_token(&self) -> Result<String, Box<dyn Error>> {
let url =
format!("{}/api.php?action=query&meta=tokens&type=login&format=json", self.server_url);
let resp = self
.client
.get(url)
.basic_auth(&self.http_user, Some(&self.http_password))
.send()?
.text()?;
let response_deserialized: QueryResponse = serde_json::from_str(&resp)?;
Ok(response_deserialized.query.tokens.logintoken)
}
}
#[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**");
2024-08-02 22:29:22 +02:00
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
2024-08-17 21:52:54 +02:00
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![]);
2024-08-02 22:29:22 +02:00
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()
}
2024-08-02 22:29:22 +02:00
/// 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 {
// TODO: use tempfile="3.3", make it a NamedTempFile::new()?;
// or alternatively use piped stdout to avoid files entirely
let output_filepath: &str = "./pandoc_mediawiki.txt";
2024-08-17 21:52:54 +02:00
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)
2024-08-02 22:29:22 +02:00
}