steam_user/services/
reports.rs1use scraper::{Html, Selector};
4use steamid::SteamID;
5
6use crate::{client::SteamUser, endpoint::steam_endpoint, error::SteamUserError};
7
8impl SteamUser {
9 #[steam_endpoint(GET, host = Community, path = "/my/reports/", kind = Read)]
19 pub async fn get_player_reports(&self) -> Result<Vec<crate::types::PlayerReport>, SteamUserError> {
20 let response = self.get_path("/my/reports/").send().await?;
21 self.check_response(&response)?;
22
23 let html = response.text().await?;
24 let document = Html::parse_document(&html);
25
26 let row_selector = Selector::parse(".report_history_row").expect("valid CSS selector");
27 let date_selector = Selector::parse(".report_date").expect("valid CSS selector");
29 let account_selector = Selector::parse(".report_account").expect("valid CSS selector");
30 let category_selector = Selector::parse(".report_category").expect("valid CSS selector");
31 let description_selector = Selector::parse(".report_description").expect("valid CSS selector");
32
33 let mut reports = Vec::new();
34
35 for row in document.select(&row_selector) {
36 let report_id = row.value().attr("data-reportid").unwrap_or("").to_string();
37
38 let date = row.select(&date_selector).next().map(|e| e.text().collect::<String>().trim().to_string()).unwrap_or_default();
39
40 let mut reported_player_name = String::new();
42 let mut reported_steam_id = None;
43
44 if let Some(account_col) = row.select(&account_selector).next() {
45 reported_player_name = account_col.text().collect::<String>().trim().to_string();
46
47 if let Some(link) = account_col.select(&Selector::parse("a").expect("valid CSS selector")).next() {
48 let href = link.value().attr("href").unwrap_or("");
49 if let Some(start) = href.find("/profiles/") {
51 let id_str = href[start + 10..].split('/').next().unwrap_or("");
52 if let Ok(id) = id_str.parse::<u64>() {
53 reported_steam_id = Some(SteamID::from(id));
54 }
55 } else if let Some(_start) = href.find("/id/") {
56 }
61 }
62 }
63
64 let reason = row.select(&category_selector).next().map(|e| e.text().collect::<String>().trim().to_string()).unwrap_or_default();
65
66 let description = row.select(&description_selector).next().map(|e| e.text().collect::<String>().trim().to_string()).unwrap_or_default();
67
68 reports.push(crate::types::PlayerReport { report_id, reported_steam_id, reported_player_name, date, reason, description });
69 }
70
71 Ok(reports)
72 }
73}