Added the tracks a car ist best for to the output plus the car's configuration

This commit is contained in:
Jan-Peter von Hunnius 2024-10-16 16:24:39 +02:00
parent 3a826e3903
commit abda9a3313
2 changed files with 302 additions and 12 deletions

View file

@ -1,6 +1,7 @@
use scraper::{Html, Selector};
use std::collections::HashSet;
use std::collections::{HashMap, HashSet};
use std::env;
use std::fs::read_to_string;
use std::str::FromStr;
use tokio;
@ -10,7 +11,7 @@ struct Car {
manufacturer: String,
model: String,
year: u16,
// upgrade: String,
upgrade: String,
}
async fn get_page(url: &str) -> String {
match reqwest::Client::builder()
@ -42,7 +43,7 @@ fn parse_best_car(text: String) -> Car {
manufacturer: String::from(""),
model: String::from(""),
year: 1900,
// upgrade: String::from("000"),
upgrade: String::from("000"),
};
let document = Html::parse_document(&text);
@ -86,17 +87,28 @@ fn parse_best_car(text: String) -> Car {
Some(rq) => rq.text().collect::<Vec<_>>()[0],
};
car.rq = u8::from_str(rq).unwrap();
/*
let upgrade_selector = Selector::parse(".carList__item-upgrade ").unwrap();
let upgrade_raw = match document.select(&upgrade_selector).next() {
None => "",
Some(model) => model.text().collect::<Vec<_>>()[0],
};
car.upgrade = String::from(upgrade_raw).trim().parse().unwrap();
*/
car
}
fn parse_tracks(file_name: &str) -> HashMap<u16, String> {
let mut result: HashMap<u16, String> = HashMap::new();
for line in read_to_string(file_name).unwrap().lines() {
let (index, track) = line.split_once(' ').unwrap();
result.insert(index.parse::<u16>().unwrap(), String::from(track));
}
result
}
#[tokio::main]
async fn main() {
let args: Vec<_> = env::args().collect();
@ -128,15 +140,18 @@ async fn main() {
_ => panic!("Too many arguemnts."),
}
let tracks = parse_tracks("tracks.txt");
let mut keepers: HashSet<String> = HashSet::new();
for track in min_track..max_track + 1 {
let best_car = get_best_car(track, 10).await;
let track_name = tracks[&track].clone();
let best_car = get_best_car(track, track_name.clone(), 10).await;
if best_car.len() > 10 {
for level in min_rq..max_rq + 1 {
let best_car = get_best_car(track, level).await;
let best_car = get_best_car(track, track_name.clone(), level).await;
if best_car.len() > 10 {
// println!("Best Car under RQ {} for track {}: {}", level, track, best_car);
// println!("Best Car under RQ {} for track {} ({}): {}", level, track, track_name, best_car);
keepers.insert(best_car);
}
}
@ -167,7 +182,7 @@ fn parse_argument(args: &Vec<String>, index: usize, min: u16, max: u16) -> u16 {
}
}
async fn get_best_car(track: u16, max_level: u16) -> String {
async fn get_best_car(track: u16, track_name: String, max_level: u16) -> String {
let url = format!("https://topdrives.club/ajax/load-best-vehicles?sort_by=level&sortorder=desc&prize=all&level=10%3B{}&acceleration=1%3B50&grip=40%3B110&year=1900%3B2030&seats_count=1%3B9&track={}&page=0",
max_level, track);
// println!("Getting {}", url);
@ -175,14 +190,14 @@ async fn get_best_car(track: u16, max_level: u16) -> String {
if text.len() > 10 {
let best_car = parse_best_car(text);
format!(
// "{}{} {} {} {} {}",
"{}{} {} {} {}",
"{}{} {} {} {}: {} ({})",
best_car.class,
best_car.rq,
best_car.manufacturer,
best_car.model,
best_car.year,
// best_car.upgrade,
track_name,
best_car.upgrade,
)
} else {
String::from("")