Files
HDB/src/main.rs
2025-03-23 09:06:21 +01:00

316 lines
8.2 KiB
Rust

use postgres::{Client, NoTls};
use std::{
env::args,
fs::{self, File},
io::{self, BufRead, BufReader, Write},
};
fn show_usage() {
println!("Available options:");
println!("usage");
println!("generate");
println!("convert");
println!("import");
println!("add_url");
println!("add_custom_name");
}
fn run_as_cli() -> i32 {
let mut result: i32;
let mut client = Client::connect("host=192.168.0.10 port=28945 user=hentai password=h99nqaNPhpfbuuhCDwQXLpZAnoVTjSQP7taoqmQhpzc2rPLVC4JUAKxAHfuuhuU9", NoTls).unwrap();
let mut option: String = String::new();
show_usage();
println!("Please input any of these options or type \'exit\' to leave");
loop {
result = 0;
io::stdin()
.read_line(&mut option)
.expect("Failed to read input");
let option: &str = option.trim_end(); // to get rid of '\n'
match option {
"usage" => show_usage(),
"generate" => result = generate_file(&mut client, None),
"convert" => result = convert_folders(&mut client, None),
"import" => result = import_file(&mut client, None),
"add_url" => result = add_url(&mut client, None),
"add_custom_name" => result = add_artist_with_custom_name(&mut client, None),
"exit" => break,
_ => {
eprintln!("Invalid option!");
}
}
if result != 0 {
return result;
}
}
result
}
fn run_with_input(arguments: Vec<String>) -> i32 {
let mut result: i32 = 0;
if arguments[1] == "usage" {
show_usage();
return result;
}
let mut client = Client::connect("host=192.168.0.10 port=28945 user=hentai password=h99nqaNPhpfbuuhCDwQXLpZAnoVTjSQP7taoqmQhpzc2rPLVC4JUAKxAHfuuhuU9", NoTls).unwrap();
let value: String = arguments[2].clone();
match arguments[1].as_str() {
"generate" => result = generate_file(&mut client, Option::Some(value)),
"convert" => result = convert_folders(&mut client, Option::Some(value)),
"import" => result = import_file(&mut client, Option::Some(value)),
"add_url" => result = add_url(&mut client, Option::Some(value)),
"add_custom_name" => {
let values: Vec<String> = vec![arguments[2].clone(), arguments[3].clone()];
result = add_artist_with_custom_name(&mut client, Option::Some(values));
}
_ => {
eprintln!("Invalid argument");
result = 1;
}
}
result
}
fn generate_file(client: &mut postgres::Client, website: Option<String>) -> i32 {
let mut website_name: String = String::new();
match website {
Some(val) => website_name = val,
None => {
io::stdin()
.read_line(&mut website_name)
.expect("Failed to read input");
}
};
let output = client
.query_one("SELECT website_exists($1);", &[&website_name])
.unwrap();
let found: bool = output.get(0);
if !found {
eprintln!("Invalid website_name");
return 1;
}
let filename = format!("{website_name}_generated.txt");
let mut file = match File::create_new(filename) {
Ok(file) => file,
Err(error) => {
let message = error.to_string();
eprintln!("Problem creating the file: {message}");
return 1;
}
};
let output = client
.query("SELECT * FROM get_urls_and_paths($1);", &[&website_name])
.unwrap();
for row in output {
let url: String = row.get(0);
let folder_path: String = row.get(1);
writeln!(file, "{} # {}", url, folder_path).unwrap();
}
0
}
fn convert_folders(client: &mut postgres::Client, path: Option<String>) -> i32 {
let mut root_folder: String = String::new();
match path {
Some(val) => root_folder = val,
None => {
io::stdin()
.read_line(&mut root_folder)
.expect("Failed to read input");
}
};
let filename: &str = "convert_folders.log";
let mut log_file = match File::create_new(filename) {
Ok(file) => file,
Err(error) => {
let message = error.to_string();
eprintln!("Problem creating the file: {message}");
return 1;
}
};
let output = client
.query("SELECT * FROM get_all_convertable_paths();", &[])
.unwrap();
for row in output {
let old_path: String = row.get(0);
let new_path: String = row.get(1);
let old_path = format!("{}/{}", root_folder, old_path);
let new_path = format!("{}/{}", root_folder, new_path);
let old_path = urlencoding::decode(&old_path).unwrap().to_string();
dbg!(&old_path);
dbg!(&new_path);
if !fs::exists(&old_path).unwrap() {
continue;
}
fs::rename(&old_path, &new_path).unwrap();
writeln!(log_file, "Converted {} => {}", old_path, new_path).unwrap();
}
0
}
fn import_file(client: &mut postgres::Client, file: Option<String>) -> i32 {
let mut filename: String = String::new();
match file {
Some(val) => filename = val,
None => {
io::stdin()
.read_line(&mut filename)
.expect("Failed to read input");
}
};
let input_file = File::open(filename).unwrap();
let reader_iter = BufReader::new(input_file).lines();
if File::open("Fucked.txt").is_ok() {
if File::open("Fucked.txt.bak").is_ok() {
fs::remove_file("Fucked.txt.bak").unwrap();
}
fs::rename("Fucked.txt", "Fucked.txt.bak").unwrap();
}
let mut fucked_file = match File::create_new("Fucked.txt") {
Ok(file) => file,
Err(err) => {
eprintln!("Problem creating the file: {}", err);
return 1;
}
};
writeln!(fucked_file, "Them are hella fucked").unwrap();
for line in reader_iter {
let line = line.unwrap();
if line.contains("#") {
writeln!(fucked_file, "{}", line).unwrap();
continue;
}
match client.query_one("SELECT insert_url($1);", &[&line]) {
Ok(_) => (),
Err(_) => {
writeln!(fucked_file, "{}", line).unwrap();
}
};
}
0
}
fn add_url(client: &mut postgres::Client, uri: Option<String>) -> i32 {
let mut url: String = String::new();
match uri {
Some(val) => url = val,
None => {
io::stdin()
.read_line(&mut url)
.expect("Failed to read input");
}
};
let url: &str = url.trim();
let output = match client.query_one("SELECT insert_url($1);", &[&url]) {
Ok(val) => val,
Err(val) => {
eprintln!("{}", val);
return 1;
}
};
let something: String = output.get(0);
println!("{}", something);
0
}
fn add_artist_with_custom_name(
client: &mut postgres::Client,
uri_and_artist: Option<Vec<String>>,
) -> i32 {
let mut url: String = String::new();
let mut artist_name: String = String::new();
match uri_and_artist {
Some(vec) => {
url = vec[0].clone();
artist_name = vec[1].clone();
}
None => {
io::stdin()
.read_line(&mut url)
.expect("Failed to read input");
io::stdin()
.read_line(&mut artist_name)
.expect("Failed to read input");
}
};
let url: &str = url.trim();
let artist_name: &str = artist_name.trim();
let output = match client.query_one(
"SELECT insert_url_with_custom_artist($1, $2);",
&[&url, &artist_name],
) {
Ok(val) => val,
Err(val) => {
eprintln!("{}", val);
return 1;
}
};
let something: String = output.get(0);
println!("{}", something);
0
}
fn main() -> Result<(), i32> {
let args: Vec<String> = args().collect();
let result = if args.len() == 1 {
run_as_cli()
} else {
run_with_input(args)
};
if result != 0 {
return Err(result);
}
Ok(())
}