1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
use super::{parse_html, parse_url};
use crate::url::{canonicalize, get_original_image};
use scraper::{Html, Selector};
pub struct Enemy {
pub link: String,
pub name: String,
pub portrait: String,
pub res: Vec<u8>,
pub debuff_res: Vec<u8>,
}
fn get_enemy_portrait(html: &Html) -> String {
let selector = Selector::parse("img.pi-image-thumbnail").unwrap();
let image = parse_url(
html.select(&selector)
.next()
.unwrap()
.value()
.attr("src")
.unwrap(),
);
get_original_image(&image).unwrap().to_string()
}
pub fn index_enemies(html: String) -> Vec<Enemy> {
let html = parse_html(html);
let selector = Selector::parse("a.category-page__member-link").unwrap();
html.select(&selector)
.filter_map(|e| {
// let res = get_enemy_resistances(&html);
// let debuff_res = get_enemy_debuff_resistances(&html);
// let portrait = get_enemy_portrait(&html);
let out = Enemy {
link: canonicalize(e.value().attr("href").unwrap().to_string()),
name: e.value().attr("title").unwrap().to_string(),
portrait: String::new(),
res: vec![],
debuff_res: vec![],
};
if out.name.starts_with("Category") {
None
} else {
Some(out)
}
})
.collect()
}
// pub fn get_enemy_drops(html: String, enemy: &mut Enemy) {
// let html = parse_html(html);
// let selector = Selector::parse("div.card-container span.card-image a").unwrap();
// let image_selector = Selector::parse("img").unwrap();
// let drops = html
// .select(&selector)
// .map(|e| {
// let image = e
// .select(&image_selector)
// .next()
// .unwrap()
// .value()
// .attr("src")
// .unwrap()
// .to_string();
// let link = canonicalize(e.value().attr("href").unwrap().to_string());
// EnemyDrops { image, link }
// })
// .collect::<Vec<_>>();
// enemy.drops = Some(drops);
// }
fn get_enemy_resistances(html: &Html) -> Vec<u8> {
let table_selector = Selector::parse("table.wikitable").unwrap();
let row_selector = Selector::parse("tr").unwrap();
let col_selector = Selector::parse("td").unwrap();
select_table(0, html, &table_selector, &row_selector, &col_selector)
}
fn get_enemy_debuff_resistances(html: &Html) -> Vec<u8> {
let table_selector = Selector::parse("table.wikitable").unwrap();
let row_selector = Selector::parse("tr").unwrap();
let col_selector = Selector::parse("td").unwrap();
select_table(1, html, &table_selector, &row_selector, &col_selector)
}
fn select_table(
n: usize,
html: &Html,
table_selector: &Selector,
row_selector: &Selector,
col_selector: &Selector,
) -> Vec<u8> {
html.select(table_selector)
.nth(n)
.unwrap()
.select(row_selector)
.nth(2)
.unwrap()
.select(col_selector)
.map(|e| {
let percent = e.inner_html();
// This is weird syntax, but
// it basically strips the newline
// if it exists
if percent.ends_with('\n') {
percent.strip_suffix('\n').unwrap()
} else {
percent.as_str()
}
.strip_suffix('%')
.unwrap()
.parse::<u8>()
.unwrap()
})
.collect()
}