add mediawiki struct & move stuff onto it

This commit is contained in:
nobody 2024-08-07 04:17:46 +02:00 committed by murmeldin
parent a454914b1f
commit 3be7898cdb
2 changed files with 54 additions and 23 deletions

View file

@ -35,7 +35,6 @@ use chrono::{Datelike, Local, NaiveDate, Weekday};
use clap::{Arg, Command};
use colored::Colorize;
use regex::Regex;
use reqwest::blocking::Client;
use std::borrow::Cow;
use std::env;
use std::error::Error;
@ -52,6 +51,7 @@ use email::{Email, SimpleEmail};
mod hedgedoc;
use hedgedoc::HedgeDoc;
mod mediawiki;
use mediawiki::Mediawiki;
const FALLBACK_TEMPLATE: &str = variables_and_settings::FALLBACK_TEMPLATE;
@ -163,8 +163,12 @@ fn main() -> Result<(), Box<dyn Error>> {
&config["email-to"],
config.get("email-in-reply-to").ok(),
);
println!("[START]\n{}", "Aktueller Zustand der DB:".bold());
config.dump_redacting(&["email-password", "wiki-http-password", "wiki-api-secret", "matrix-password"]).ok();
let wiki = Mediawiki::new(
&config["wiki-server-url"],
&config["wiki-http-user"],
&config["wiki-http-password"],
is_dry_run(),
);
// Dienstage diesen Monat
let all_tuesdays: Vec<NaiveDate> = get_all_weekdays(0, Weekday::Tue);
@ -226,7 +230,7 @@ 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 auth_result = mediawiki::get_login_token(&Client::new(), &config.get("wiki-http-user").expect("HTTP User not found DB!"), &config.get("wiki-http-password").expect("HTTP Password not found DB!"))?;
let auth_result = wiki.get_login_token()?;
println!("---AUTH RESULT:---\n{}\n-----------", auth_result);
// TEMPORÄR ENDE

View file

@ -14,7 +14,7 @@ pub const CONFIG: CfgGroup<'static> = CfgGroup {
fields: &[
CfgField::Default {
key: "server-url",
default: "https://wiki.berlin.ccc.de/",
default: "https://wiki.berlin.ccc.de",
description: "Server running the wiki.",
},
CfgField::Default {
@ -35,6 +35,42 @@ pub const CONFIG: CfgGroup<'static> = CfgGroup {
],
};
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,
@ -55,7 +91,6 @@ 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");
@ -80,28 +115,20 @@ fn pandoc_convert(old_pad_content: String, output_filepath: &str, input_format:
}
/// 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}!"));
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()
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 {
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";
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)
}