roblox_api/api/groups/
v1.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{DateTime, Error, Paging, client::Client};
4
5pub const URL: &str = "https://groups.roblox.com/v1";
6
7#[derive(Clone, Debug, Deserialize)]
8pub struct GroupUser {
9    #[serde(rename = "userId")]
10    pub id: u64,
11    #[serde(rename = "username")]
12    pub name: String,
13    #[serde(rename = "displayName")]
14    pub display_name: String,
15    #[serde(rename = "hasVerifiedBadge")]
16    pub is_verified: bool,
17}
18
19#[derive(Clone, Debug, Deserialize)]
20pub struct GroupRole {
21    pub id: u64,
22    pub name: String,
23    pub rank: u8,
24}
25
26#[derive(Clone, Debug, Deserialize)]
27pub struct GroupShout {
28    pub body: String,
29    pub poster: GroupUser,
30    pub created: DateTime,
31    pub updated: DateTime,
32}
33
34#[derive(Clone, Debug, Deserialize)]
35pub struct GroupInformation {
36    pub id: u64,
37    pub name: String,
38    pub description: String,
39
40    pub owner: GroupUser,
41    pub shout: Option<GroupShout>,
42
43    #[serde(rename = "memberCount")]
44    pub member_count: u64,
45    #[serde(rename = "isBuildersClubOnly")]
46    pub premium_only: bool,
47    #[serde(rename = "publicEntryAllowed")]
48    pub is_public: bool,
49    #[serde(rename = "hasVerifiedBadge")]
50    pub is_verified: bool,
51}
52
53pub struct GroupUsers {
54    pub users: Vec<(GroupUser, GroupRole)>,
55    pub next_cursor: Option<String>,
56    pub previous_cursor: Option<String>,
57}
58
59pub async fn information(client: &mut Client, id: u64) -> Result<GroupInformation, Error> {
60    let result = client
61        .requestor
62        .client
63        .get(format!("{URL}/groups/{id}"))
64        .headers(client.requestor.default_headers.clone())
65        .send()
66        .await;
67
68    let response = client.validate_response(result).await?;
69    client
70        .requestor
71        .parse_json::<GroupInformation>(response)
72        .await
73}
74
75pub async fn users(client: &mut Client, id: u64, paging: Paging<'_>) -> Result<GroupUsers, Error> {
76    let limit = paging.limit.unwrap_or(10).to_string();
77    let sort_order = paging.order.unwrap_or_default().to_string();
78    let cursor = match paging.cursor {
79        Some(cursor) => cursor.to_string(),
80        None => String::new(),
81    };
82
83    let result = client
84        .requestor
85        .client
86        .get(format!("{URL}/groups/{id}/users"))
87        .query(&[
88            ("limit", limit),
89            ("sortOrder", sort_order),
90            ("cursor", cursor),
91        ])
92        .headers(client.requestor.default_headers.clone())
93        .send()
94        .await;
95
96    #[derive(Clone, Debug, Deserialize)]
97    struct User {
98        user: GroupUser,
99        role: GroupRole,
100    }
101
102    #[derive(Clone, Debug, Deserialize)]
103    struct Response {
104        #[serde(rename = "data")]
105        users: Vec<User>,
106        #[serde(rename = "nextPageCursor")]
107        next_cursor: Option<String>,
108        #[serde(rename = "previousPageCursor")]
109        previous_cursor: Option<String>,
110    }
111
112    let response = client.validate_response(result).await?;
113    let response = client.requestor.parse_json::<Response>(response).await?;
114
115    let mut users = Vec::new();
116    for user in response.users {
117        users.push((user.user, user.role))
118    }
119
120    Ok(GroupUsers {
121        users,
122        next_cursor: response.next_cursor,
123        previous_cursor: response.previous_cursor,
124    })
125}
126
127pub async fn join(client: &mut Client, id: u64) -> Result<(), Error> {
128    #[derive(Serialize)]
129    struct Request<'a> {
130        #[serde(rename = "sessionId")]
131        session_id: &'a str,
132        #[serde(rename = "redemptionToken")]
133        redemption_token: &'a str,
134    }
135
136    let result = client
137        .requestor
138        .client
139        .post(format!("{URL}/groups/{id}/users"))
140        .headers(client.requestor.default_headers.clone())
141        .json(&Request {
142            session_id: "",
143            redemption_token: "",
144        })
145        .send()
146        .await;
147
148    client.validate_response(result).await?;
149    Ok(())
150}
151
152pub async fn remove(client: &mut Client, id: u64, user_id: u64) -> Result<(), Error> {
153    #[derive(Serialize)]
154    struct Request {}
155
156    let result = client
157        .requestor
158        .client
159        .delete(format!("{URL}/groups/{id}/users/{user_id}"))
160        .headers(client.requestor.default_headers.clone())
161        .json(&Request {})
162        .send()
163        .await;
164
165    client.validate_response(result).await?;
166    Ok(())
167}