sponsor_block/client/user/
user_info.rs1use serde::Deserialize;
3use serde_json::from_str as from_json_str;
4
5use crate::{
6 error::Result,
7 util::get_response_text,
8 Client,
9 LocalUserIdSlice,
10 PublicUserId,
11 PublicUserIdSlice,
12 SegmentUuid,
13};
14
15#[derive(Deserialize, Debug, Default)]
17#[serde(default, rename_all = "camelCase")]
18pub struct UserInfo {
19 #[serde(rename = "userID")]
21 pub public_user_id: PublicUserId,
22 pub user_name: Option<String>,
24 pub minutes_saved: f32,
26 pub segment_count: u32,
29 pub ignored_segment_count: u32,
31 pub view_count: u32,
34 pub ignored_view_count: u32,
37 pub warnings: u32,
39 pub reputation: f32,
41 pub vip: bool,
43 #[serde(rename = "lastSegmentID")]
45 pub last_segment_id: Option<SegmentUuid>,
46}
47
48impl UserInfo {
49 #[must_use]
52 pub fn total_segment_count(&self) -> u32 {
53 self.segment_count + self.ignored_segment_count
54 }
55
56 #[must_use]
59 pub fn total_view_count(&self) -> u32 {
60 self.view_count + self.ignored_view_count
61 }
62}
63
64const API_ENDPOINT: &str = "/userInfo";
66
67impl Client {
69 pub async fn fetch_user_info_public(
78 &self,
79 public_user_id: &PublicUserIdSlice,
80 ) -> Result<UserInfo> {
81 let request = self
83 .http
84 .get(format!("{}{}", &self.base_url, API_ENDPOINT))
85 .query(&[("publicUserID", public_user_id)]);
86
87 let response = get_response_text(request.send().await?).await?;
89
90 let mut result = from_json_str::<UserInfo>(response.as_str())?;
92 if result
95 .user_name
96 .as_ref()
97 .expect("userName field was not set")
98 .eq(&result.public_user_id)
99 {
100 result.user_name = None;
101 }
102 Ok(result)
103 }
104
105 pub async fn fetch_user_info_local(
114 &self,
115 local_user_id: &LocalUserIdSlice,
116 ) -> Result<UserInfo> {
117 let request = self
119 .http
120 .get(format!("{}{}", &self.base_url, API_ENDPOINT))
121 .query(&[("userID", local_user_id)]);
122
123 let response = get_response_text(request.send().await?).await?;
125
126 let mut result = from_json_str::<UserInfo>(response.as_str())?;
128 if result
131 .user_name
132 .as_ref()
133 .expect("userName field was not set")
134 .eq(&result.public_user_id)
135 {
136 result.user_name = None;
137 }
138 Ok(result)
139 }
140}