2024-08-05 19:29:02 +02:00
use std ::error ::Error ;
use std ::fs ::File ;
use std ::io ::Read ;
2024-08-03 17:13:31 +02:00
use pandoc ::{ PandocError , PandocOutput } ;
2024-08-03 00:11:27 +02:00
use reqwest ;
2024-08-03 17:13:31 +02:00
use reqwest ::blocking ::Client ;
use serde ::Deserialize ;
2024-08-05 19:29:02 +02:00
use crate ::config_spec ::{ CfgField , CfgGroup } ;
2024-08-05 04:45:34 +02:00
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-01 18:30:14 +02:00
2024-08-03 17:13:31 +02:00
#[ derive(Deserialize) ]
struct QueryResponse {
batchcomplete : String ,
query : QueryTokens ,
}
#[ derive(Deserialize) ]
struct QueryTokens {
tokens : Tokens ,
}
#[ derive(Deserialize) ]
struct Tokens {
logintoken : String ,
}
2024-08-01 18:30:14 +02:00
2024-08-03 17:13:31 +02:00
pub fn pad_ins_wiki ( old_pad_content : String ) {
convert_md_to_mediawiki ( old_pad_content ) ;
2024-08-01 18:30:14 +02:00
// Textdatei wieder einlesen
2024-08-03 17:13:31 +02:00
2024-08-01 18:30:14 +02:00
// Passwörter aus Datenbank lesen (ToBeDone)
2024-08-03 17:13:31 +02:00
/*
2024-08-01 18:30:14 +02:00
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! " ) ;
2024-08-02 21:19:54 +02:00
println! ( " plenum_bot_user: {plenum_bot_user} , plenum_bot_pw: {plenum_bot_pw} , login_token: {login_token} " )
2024-08-03 17:13:31 +02:00
* /
2024-08-02 21:19:54 +02:00
}
2024-08-03 17:13:31 +02:00
/// 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 > {
2024-08-02 21:19:54 +02:00
//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 ) ) ;
2024-08-03 17:13:31 +02:00
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 ( )
2024-08-02 21:19:54 +02:00
}
2024-08-01 18:30:14 +02:00
2024-08-03 17:13:31 +02:00
/// 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
2024-08-03 17:13:31 +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 {
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 )
2024-08-02 22:29:22 +02:00
}
2024-08-03 00:11:27 +02:00
/// Authenticate with username and password on http basic auth
2024-08-03 17:13:31 +02:00
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 )
2024-08-05 04:45:34 +02:00
}