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()
}