roblox_api/api/groups/
v1.rs1use 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}