1use rsb_derive::Builder;
6use rvstruct::ValueStruct;
7use serde::{Deserialize, Serialize};
8use serde_with::skip_serializing_none;
9
10use crate::models::*;
11use crate::ratectl::*;
12use crate::scroller::*;
13use crate::SlackClientSession;
14use crate::{ClientResult, SlackClientHttpConnector};
15use futures::future::{BoxFuture, FutureExt};
16
17impl<'a, SCHC> SlackClientSession<'a, SCHC>
18where
19 SCHC: SlackClientHttpConnector + Send,
20{
21 pub async fn users_conversations(
25 &self,
26 req: &SlackApiUsersConversationsRequest,
27 ) -> ClientResult<SlackApiUsersConversationsResponse> {
28 self.http_session_api
29 .http_get(
30 "users.conversations",
31 &vec![
32 ("user", req.user.as_ref().map(|x| x.value())),
33 ("cursor", req.cursor.as_ref().map(|x| x.value())),
34 ("limit", req.limit.map(|v| v.to_string()).as_ref()),
35 (
36 "exclude_archived",
37 req.exclude_archived.map(|v| v.to_string()).as_ref(),
38 ),
39 (
40 "types",
41 req.types
42 .as_ref()
43 .map(|xs| {
44 xs.iter()
45 .map(|x| x.to_string())
46 .collect::<Vec<String>>()
47 .join(",")
48 })
49 .as_ref(),
50 ),
51 ],
52 Some(&SLACK_TIER3_METHOD_CONFIG),
53 )
54 .await
55 }
56
57 pub async fn users_get_presence(
61 &self,
62 req: &SlackApiUsersGetPresenceRequest,
63 ) -> ClientResult<SlackApiUsersGetPresenceResponse> {
64 self.http_session_api
65 .http_get(
66 "users.getPresence",
67 &vec![("user", Some(req.user.value()))],
68 Some(&SLACK_TIER3_METHOD_CONFIG),
69 )
70 .await
71 }
72
73 pub async fn users_identity(&self) -> ClientResult<SlackApiUsersGetPresenceResponse> {
77 self.http_session_api
78 .http_get(
79 "users.identity",
80 &crate::client::SLACK_HTTP_EMPTY_GET_PARAMS.clone(),
81 Some(&SLACK_TIER4_METHOD_CONFIG),
82 )
83 .await
84 }
85
86 pub async fn users_info(
90 &self,
91 req: &SlackApiUsersInfoRequest,
92 ) -> ClientResult<SlackApiUsersInfoResponse> {
93 self.http_session_api
94 .http_get(
95 "users.info",
96 &vec![
97 ("user", Some(req.user.value())),
98 (
99 "include_locale",
100 req.include_locale.map(|v| v.to_string()).as_ref(),
101 ),
102 ],
103 Some(&SLACK_TIER4_METHOD_CONFIG),
104 )
105 .await
106 }
107
108 pub async fn users_list(
112 &self,
113 req: &SlackApiUsersListRequest,
114 ) -> ClientResult<SlackApiUsersListResponse> {
115 self.http_session_api
116 .http_get(
117 "users.list",
118 &vec![
119 ("cursor", req.cursor.as_ref().map(|v| v.value())),
120 ("team_id", req.team_id.as_ref().map(|v| v.value())),
121 ("limit", req.limit.map(|v| v.to_string()).as_ref()),
122 (
123 "include_locale",
124 req.include_locale.map(|v| v.to_string()).as_ref(),
125 ),
126 ],
127 Some(&SLACK_TIER2_METHOD_CONFIG),
128 )
129 .await
130 }
131
132 pub async fn users_lookup_by_email(
136 &self,
137 req: &SlackApiUsersLookupByEmailRequest,
138 ) -> ClientResult<SlackApiUsersLookupByEmailResponse> {
139 self.http_session_api
140 .http_get(
141 "users.lookupByEmail",
142 &vec![("email", Some(req.email.value()))],
143 Some(&SLACK_TIER3_METHOD_CONFIG),
144 )
145 .await
146 }
147
148 pub async fn users_set_presence(
152 &self,
153 req: &SlackApiUsersSetPresenceRequest,
154 ) -> ClientResult<SlackApiUsersSetPresenceResponse> {
155 self.http_session_api
156 .http_post("users.setPresence", req, Some(&SLACK_TIER2_METHOD_CONFIG))
157 .await
158 }
159
160 pub async fn users_profile_get(
164 &self,
165 req: &SlackApiUsersProfileGetRequest,
166 ) -> ClientResult<SlackApiUsersProfileGetResponse> {
167 self.http_session_api
168 .http_get(
169 "users.profile.get",
170 &vec![
171 ("user", req.user.as_ref().map(|v| v.value())),
172 (
173 "include_locale",
174 req.include_locale.map(|v| v.to_string()).as_ref(),
175 ),
176 ],
177 Some(&SLACK_TIER4_METHOD_CONFIG),
178 )
179 .await
180 }
181
182 pub async fn users_profile_set(
186 &self,
187 req: &SlackApiUsersProfileSetRequest,
188 ) -> ClientResult<SlackApiUsersProfileSetResponse> {
189 self.http_session_api
190 .http_post("users.profile.set", req, Some(&SLACK_TIER3_METHOD_CONFIG))
191 .await
192 }
193}
194
195#[skip_serializing_none]
196#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
197pub struct SlackApiUsersConversationsRequest {
198 pub cursor: Option<SlackCursorId>,
199 pub limit: Option<u16>,
200 pub exclude_archived: Option<bool>,
201 pub types: Option<Vec<SlackConversationType>>,
202 pub user: Option<SlackUserId>,
203}
204
205#[skip_serializing_none]
206#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
207pub struct SlackApiUsersConversationsResponse {
208 pub channels: Vec<SlackChannelInfo>,
209 pub response_metadata: Option<SlackResponseMetadata>,
210}
211
212impl<SCHC> SlackApiScrollableRequest<SCHC> for SlackApiUsersConversationsRequest
213where
214 SCHC: SlackClientHttpConnector + Send + Sync + Clone + 'static,
215{
216 type ResponseType = SlackApiUsersConversationsResponse;
217 type CursorType = SlackCursorId;
218 type ResponseItemType = SlackChannelInfo;
219
220 fn with_new_cursor(&self, new_cursor: Option<&Self::CursorType>) -> Self {
221 self.clone().opt_cursor(new_cursor.cloned())
222 }
223
224 fn scroll<'a, 's>(
225 &'a self,
226 session: &'a SlackClientSession<'s, SCHC>,
227 ) -> BoxFuture<'a, ClientResult<Self::ResponseType>> {
228 async move { session.users_conversations(self).await }.boxed()
229 }
230}
231
232impl SlackApiScrollableResponse for SlackApiUsersConversationsResponse {
233 type CursorType = SlackCursorId;
234 type ResponseItemType = SlackChannelInfo;
235
236 fn next_cursor(&self) -> Option<&Self::CursorType> {
237 self.response_metadata
238 .as_ref()
239 .and_then(|rm| rm.next_cursor.as_ref())
240 }
241
242 fn scrollable_items<'a>(&'a self) -> Box<dyn Iterator<Item = &'a Self::ResponseItemType> + 'a> {
243 Box::new(self.channels.iter())
244 }
245}
246
247#[skip_serializing_none]
248#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
249pub struct SlackApiUsersListRequest {
250 pub cursor: Option<SlackCursorId>,
251 pub include_locale: Option<bool>,
252 pub limit: Option<u16>,
253 pub team_id: Option<SlackTeamId>,
254}
255
256#[skip_serializing_none]
257#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
258pub struct SlackApiUsersListResponse {
259 pub members: Vec<SlackUser>,
260 pub response_metadata: Option<SlackResponseMetadata>,
261}
262
263impl<SCHC> SlackApiScrollableRequest<SCHC> for SlackApiUsersListRequest
264where
265 SCHC: SlackClientHttpConnector + Send + Sync + Clone + 'static,
266{
267 type ResponseType = SlackApiUsersListResponse;
268 type CursorType = SlackCursorId;
269 type ResponseItemType = SlackUser;
270
271 fn with_new_cursor(&self, new_cursor: Option<&Self::CursorType>) -> Self {
272 self.clone().opt_cursor(new_cursor.cloned())
273 }
274
275 fn scroll<'a, 's>(
276 &'a self,
277 session: &'a SlackClientSession<'s, SCHC>,
278 ) -> BoxFuture<'a, ClientResult<Self::ResponseType>> {
279 async move { session.users_list(self).await }.boxed()
280 }
281}
282
283impl SlackApiScrollableResponse for SlackApiUsersListResponse {
284 type CursorType = SlackCursorId;
285 type ResponseItemType = SlackUser;
286
287 fn next_cursor(&self) -> Option<&Self::CursorType> {
288 self.response_metadata
289 .as_ref()
290 .and_then(|rm| rm.next_cursor.as_ref())
291 }
292
293 fn scrollable_items<'a>(&'a self) -> Box<dyn Iterator<Item = &'a Self::ResponseItemType> + 'a> {
294 Box::new(self.members.iter())
295 }
296}
297
298#[skip_serializing_none]
299#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
300pub struct SlackApiUsersGetPresenceRequest {
301 pub user: SlackUserId,
302}
303
304#[skip_serializing_none]
305#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
306pub struct SlackApiUsersGetPresenceResponse {
307 pub presence: String,
308 pub online: Option<bool>,
309 pub auto_away: Option<bool>,
310 pub manual_away: Option<bool>,
311 pub connection_count: Option<u64>,
312 pub last_activity: Option<SlackDateTime>,
313}
314
315#[skip_serializing_none]
316#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
317pub struct SlackApiUsersIdentityResponse {
318 pub user: SlackUserProfile,
319 pub team: SlackBasicTeamInfo,
320}
321
322#[skip_serializing_none]
323#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
324pub struct SlackApiUsersInfoRequest {
325 pub user: SlackUserId,
326 pub include_locale: Option<bool>,
327}
328
329#[skip_serializing_none]
330#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
331pub struct SlackApiUsersInfoResponse {
332 pub user: SlackUser,
333}
334
335#[skip_serializing_none]
336#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
337pub struct SlackApiUsersLookupByEmailRequest {
338 pub email: EmailAddress,
339}
340
341#[skip_serializing_none]
342#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
343pub struct SlackApiUsersLookupByEmailResponse {
344 pub user: SlackUser,
345}
346
347#[skip_serializing_none]
348#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
349pub struct SlackApiUsersSetPresenceRequest {
350 pub presence: String,
351}
352
353#[skip_serializing_none]
354#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
355pub struct SlackApiUsersSetPresenceResponse {}
356
357#[skip_serializing_none]
358#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
359pub struct SlackApiUsersProfileGetRequest {
360 pub user: Option<SlackUserId>,
361 pub include_locale: Option<bool>,
362}
363
364#[skip_serializing_none]
365#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
366pub struct SlackApiUsersProfileGetResponse {
367 pub profile: SlackUserProfile,
368}
369
370#[skip_serializing_none]
371#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
372pub struct SlackApiUsersProfileSetRequest {
373 pub profile: SlackUserProfile,
374 pub user: Option<SlackUserId>,
375}
376
377#[skip_serializing_none]
378#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
379pub struct SlackApiUsersProfileSetResponse {
380 pub profile: SlackUserProfile,
381}