tcloud_im_api/api/
account.rs1use std::time::Duration;
2
3use serde::{Serialize, Deserialize};
4
5use crate::{client::Client, error::Error};
6
7#[derive(Debug, Serialize, Deserialize)]
8#[serde(rename_all = "PascalCase")]
9pub struct Account {
10 pub identifier: String,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 pub nick: Option<String>,
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub face_url: Option<String>
15}
16
17
18#[derive(Debug, Serialize, Deserialize)]
19#[serde(rename_all = "PascalCase")]
20pub struct Accounts {
21 pub accounts: Vec<String>
22}
23impl From<Vec<String>> for Accounts {
24 fn from(source: Vec<String>) -> Self {
25 Self {accounts: source}
26 }
27}
28
29#[derive(Debug, Deserialize)]
30#[serde(rename_all = "PascalCase")]
31pub struct AccountsResp {
32 fail_accounts: Vec<String>
33}
34
35#[derive(Debug, Serialize, Deserialize)]
36struct UserIdItem {
37 #[serde(rename = "UserID")]
38 user_id: String
39}
40#[derive(Debug, Serialize, Deserialize)]
41#[serde(rename_all = "PascalCase")]
42pub struct DeleteAccounts {
43 delete_item: Vec<UserIdItem>
44}
45impl From<Vec<String>> for DeleteAccounts {
46 fn from(source: Vec<String>) -> Self {
47 let delete_item = source.into_iter()
48 .map(|user_id| UserIdItem{user_id})
49 .collect();
50 Self {delete_item}
51 }
52}
53
54#[derive(Debug, Deserialize)]
55#[serde(rename_all = "PascalCase")]
56pub struct DeleteRespItem {
57 result_code: u32,
58 result_info: String,
59 #[serde(rename = "UserID")]
60 user_id: String
61}
62
63#[derive(Debug, Deserialize)]
64pub struct DeleteResp {
65 #[serde(rename = "ResultItem")]
66 items: Vec<DeleteRespItem>
67}
68
69#[derive(Debug, Serialize, Deserialize)]
70pub struct CheckUsers {
71 #[serde(rename = "CheckItem")]
72 user_item: Vec<UserIdItem>
73}
74impl From<Vec<String>> for CheckUsers {
75 fn from(source: Vec<String>) -> Self {
76 let user_item = source.into_iter()
77 .map(|user_id| UserIdItem{user_id})
78 .collect();
79 Self {user_item}
80 }
81}
82#[derive(Debug, Deserialize)]
83#[serde(rename_all = "PascalCase")]
84pub struct CheckRespItem {
85 result_code: u32,
86 result_info: String,
87 #[serde(rename = "UserID")]
88 user_id: String,
89 account_status: String
90}
91
92#[derive(Debug, Deserialize)]
93pub struct CheckResp {
94 #[serde(rename = "ResultItem")]
95 items: Vec<CheckRespItem>
96}
97
98#[derive(Debug, Serialize, Deserialize)]
99#[serde(rename_all = "PascalCase")]
100pub struct Kick {
101 identifier: String
102}
103
104impl From<String> for Kick {
105 fn from(source: String) -> Self {
106 Kick {identifier: source}
107 }
108}
109
110#[derive(Debug, Serialize, Deserialize)]
111pub struct OnlineStatus {
112 #[serde(rename = "IsNeedDetail")]
113 need_detail: u32,
114 #[serde(rename = "To_Account")]
115 to_account: Vec<String>
116}
117
118impl OnlineStatus {
119 pub fn new(need_detail: bool, accounts: Vec<String>) -> Self {
120 Self {need_detail: if need_detail {1} else {0}, to_account: accounts}
121 }
122}
123
124#[derive(Debug, Deserialize)]
125#[serde(rename_all = "PascalCase")]
126pub struct OnlineDetail {
127 platform: String,
128 status: String
129}
130
131#[derive(Debug, Deserialize)]
132#[serde(rename_all = "PascalCase")]
133pub struct OnlineState {
134 #[serde(rename = "To_Account")]
135 account: String,
136 status: String,
137 detail: Option<OnlineDetail>
138}
139
140#[derive(Debug, Deserialize)]
141pub struct QueryError {
142 #[serde(rename = "To_Account")]
143 account: String,
144 #[serde(rename = "ErrorCode")]
145 code: u32
146}
147
148#[derive(Debug, Deserialize)]
149pub struct QueryResp {
150 #[serde(rename = "QueryResult")]
151 result: Vec<OnlineState>,
152 #[serde(rename = "ErrorList")]
153 errors: Vec<QueryError>
154}
155
156pub struct AccountApi<'a> {
157 inner: &'a Client
158}
159
160impl<'a> AccountApi<'a> {
161 define_api!(import, "/v4/im_open_login_svc/account_import", Account, ());
162 define_api!(multi_import, "/v4/im_open_login_svc/multiaccount_import",Accounts, AccountsResp);
163 define_api!(delete, "/v4/im_open_login_svc/account_delete", DeleteAccounts, DeleteResp);
164 define_api!(check, "/v4/im_open_login_svc/account_check", CheckUsers, CheckResp);
165 define_api!(kick, "/v4/im_open_login_svc/kick", Kick, ());
166 define_api!(query_online_status, "/v4/openim/query_online_status", OnlineStatus, QueryResp);
167
168 pub fn gen_sign(&self, user_id: &str, expire: Duration) -> Result<String, Error> {
169 super::usersig::gen_usersig(
170 self.inner.sdkappid,
171 self.inner.key.as_str(),
172 user_id,
173 expire
174 )
175 }
176
177 pub fn new(client: &'a Client) -> Self {
178 AccountApi{inner: client}
179 }
180}