robloxapi_s/users/
mod.rs

1pub mod models;
2
3use self::models::User;
4
5use async_trait::async_trait;
6use reqwest::Method;
7use std::collections::HashMap;
8
9#[async_trait]
10pub trait UserBuilder {
11    async fn new(self, client: &mut crate::Https) -> User;
12}
13
14#[async_trait]
15impl UserBuilder for &str {
16    /// Create a new user by name
17    async fn new(self, client: &mut crate::Https) -> User {
18        let mut map = HashMap::new();
19        map.insert("usernames", vec![self]);
20
21        let data = client
22            .post(&format!("{}/usernames/users", crate::USER))
23            .await
24            .json(&map)
25            .header("content-length", serde_json::to_vec(&map).unwrap().len())
26            .send()
27            .await
28            .expect("Failed to get user info")
29            .json::<serde_json::Value>()
30            .await
31            .expect("Failed to get user json");
32
33        if let Some(users) = data.get("data") {
34            if let Some(id) = users[0].get("id") {
35                let builder = id.as_i64().unwrap() as u64;
36                builder.new(client).await
37            } else {
38                panic!("Failed to find users with given name")
39            }
40        } else {
41            panic!("Request failed")
42        }
43    }
44}
45
46#[async_trait]
47impl UserBuilder for u64 {
48    /// Create a new user with userid
49    async fn new(self, client: &mut crate::Https) -> User {
50        let user: User = client
51            .client
52            .request(Method::GET, &format!("{}/v1/users/{}", crate::USER, self))
53            .send()
54            .await
55            .expect("Failed to get user info from base")
56            .json()
57            .await
58            .expect("Failed to update struct with base");
59
60        let mut u2 = User {
61            id: Some(self),
62            username: user.username,
63            avatarfinal: user.avatarfinal,
64            avataruri: user.avataruri,
65            isonline: user.isonline,
66            ..client
67                .client
68                .request(Method::GET, &format!("{}/users/{}", crate::USER, self))
69                .send()
70                .await
71                .expect("Failed to get user info from user")
72                .json()
73                .await
74                .expect("Failed to update struct with user")
75        };
76
77        u2.client = Some(client.clone());
78        u2
79    }
80}
81
82impl User {
83    /// Get all friends of user, requires cookie
84    pub async fn friends(&mut self) -> Vec<User> {
85        if let Some(friends) = self.friends.clone() {
86            friends
87        } else {
88            let mut friends: Vec<User> = vec![];
89            let mut page: i32 = 1;
90            let mut page_string = format!("?page={}", page);
91
92            let mut data = self
93                .client
94                .as_mut()
95                .unwrap()
96                .client
97                .request(
98                    Method::GET,
99                    &format!(
100                        "{}/v1/users/{}/friends{}",
101                        crate::USER,
102                        self.id.unwrap(),
103                        page_string
104                    ),
105                )
106                .send()
107                .await
108                .expect("Failed to get friends list")
109                .json::<Vec<User>>()
110                .await
111                .expect("Failed to get friends json");
112
113            loop {
114                friends.extend_from_slice(&data[..]);
115
116                page += 1;
117                page_string = format!("?page={}", page);
118                data = self
119                    .client
120                    .as_mut()
121                    .unwrap()
122                    .client
123                    .request(
124                        Method::GET,
125                        &format!(
126                            "{}/users/{}/friends{}",
127                            crate::FRIENDS,
128                            self.id.unwrap(),
129                            page_string
130                        ),
131                    )
132                    .send()
133                    .await
134                    .expect("Failed to get friends list")
135                    .json::<Vec<User>>()
136                    .await
137                    .expect("Failed to get friends json");
138
139                if data.is_empty() {
140                    break;
141                }
142            }
143
144            self.friends = Some(friends.clone());
145            friends
146        }
147    }
148
149    // /// Check if user has asset, may require cookie
150    // pub async fn has_asset(&mut self, asset_id: u64) -> bool {
151    //     self.client
152    //         .as_mut()
153    //         .unwrap()
154    //         .client
155    //         .request(
156    //             Method::GET,
157    //             &format!(
158    //                 "{}/ownership/hasasset?userId={}&assetId={}",
159    //                 crate::BASE,
160    //                 self.id.unwrap(),
161    //                 asset_id
162    //             ),
163    //         )
164    //         .send()
165    //         .await
166    //         .expect("Failed to get ownership info")
167    //         .json::<bool>()
168    //         .await
169    //         .expect("Failed to get ownership json")
170    // }
171}