]> nmode's Git Repositories - signal-cli/blob - client/src/jsonrpc.rs
Implement replying to stories
[signal-cli] / client / src / jsonrpc.rs
1 use std::path::Path;
2
3 use jsonrpc_client_transports::{transports::ipc, RpcError};
4 use jsonrpc_core::serde::Deserialize;
5 use jsonrpc_derive::rpc;
6 use tokio::net::ToSocketAddrs;
7
8 pub type SignalCliClient = gen_client::Client;
9
10 #[rpc(client, params = "named")]
11 pub trait Rpc {
12 #[rpc(name = "addDevice", params = "named")]
13 fn add_device(&self, account: Option<String>, uri: String) -> Result<Value>;
14
15 #[rpc(name = "block", params = "named")]
16 fn block(
17 &self,
18 account: Option<String>,
19 recipients: Vec<String>,
20 #[allow(non_snake_case)] groupIds: Vec<String>,
21 ) -> Result<Value>;
22
23 #[rpc(name = "deleteLocalAccountData", params = "named")]
24 fn delete_local_account_data(
25 &self,
26 account: Option<String>,
27 #[allow(non_snake_case)] ignoreRegistered: Option<bool>,
28 ) -> Result<Value>;
29
30 #[rpc(name = "getUserStatus", params = "named")]
31 fn get_user_status(&self, account: Option<String>, recipients: Vec<String>) -> Result<Value>;
32
33 #[rpc(name = "joinGroup", params = "named")]
34 fn join_group(&self, account: Option<String>, uri: String) -> Result<Value>;
35
36 #[rpc(name = "finishLink", params = "named")]
37 fn finish_link(
38 &self,
39 #[allow(non_snake_case)] deviceLinkUri: String,
40 #[allow(non_snake_case)] deviceName: String,
41 ) -> Result<Value>;
42
43 #[rpc(name = "listAccounts", params = "named")]
44 fn list_accounts(&self) -> Result<Value>;
45
46 #[rpc(name = "listContacts", params = "named")]
47 fn list_contacts(
48 &self,
49 account: Option<String>,
50 recipients: Vec<String>,
51 #[allow(non_snake_case)] allRecipients: bool,
52 blocked: Option<bool>,
53 name: Option<String>,
54 ) -> Result<Value>;
55
56 #[rpc(name = "listDevices", params = "named")]
57 fn list_devices(&self, account: Option<String>) -> Result<Value>;
58
59 #[rpc(name = "listGroups", params = "named")]
60 fn list_groups(
61 &self,
62 account: Option<String>,
63 #[allow(non_snake_case)] groupIds: Vec<String>,
64 ) -> Result<Value>;
65
66 #[rpc(name = "listIdentities", params = "named")]
67 fn list_identities(&self, account: Option<String>, number: Option<String>) -> Result<Value>;
68
69 #[rpc(name = "listStickerPacks", params = "named")]
70 fn list_sticker_packs(&self, account: Option<String>) -> Result<Value>;
71
72 #[rpc(name = "quitGroup", params = "named")]
73 fn quit_group(
74 &self,
75 account: Option<String>,
76 #[allow(non_snake_case)] groupId: String,
77 delete: bool,
78 admins: Vec<String>,
79 ) -> Result<Value>;
80
81 #[rpc(name = "register", params = "named")]
82 fn register(
83 &self,
84 account: Option<String>,
85 voice: bool,
86 captcha: Option<String>,
87 ) -> Result<Value>;
88
89 #[rpc(name = "removeContact", params = "named")]
90 fn remove_contact(
91 &self,
92 account: Option<String>,
93 recipient: String,
94 forget: bool,
95 ) -> Result<Value>;
96
97 #[rpc(name = "removeDevice", params = "named")]
98 fn remove_device(
99 &self,
100 account: Option<String>,
101 #[allow(non_snake_case)] deviceId: u32,
102 ) -> Result<Value>;
103
104 #[rpc(name = "removePin", params = "named")]
105 fn remove_pin(&self, account: Option<String>) -> Result<Value>;
106
107 #[rpc(name = "remoteDelete", params = "named")]
108 fn remote_delete(
109 &self,
110 account: Option<String>,
111 #[allow(non_snake_case)] targetTimestamp: u64,
112 recipients: Vec<String>,
113 #[allow(non_snake_case)] groupIds: Vec<String>,
114 #[allow(non_snake_case)] noteToSelf: bool,
115 ) -> Result<Value>;
116
117 #[rpc(name = "send", params = "named")]
118 fn send(
119 &self,
120 account: Option<String>,
121 recipients: Vec<String>,
122 #[allow(non_snake_case)] groupIds: Vec<String>,
123 #[allow(non_snake_case)] noteToSelf: bool,
124 #[allow(non_snake_case)] endSession: bool,
125 message: String,
126 attachments: Vec<String>,
127 mentions: Vec<String>,
128 #[allow(non_snake_case)] quoteTimestamp: Option<u64>,
129 #[allow(non_snake_case)] quoteAuthor: Option<String>,
130 #[allow(non_snake_case)] quoteMessage: Option<String>,
131 #[allow(non_snake_case)] quoteMention: Vec<String>,
132 sticker: Option<String>,
133 #[allow(non_snake_case)] storyTimestamp: Option<u64>,
134 #[allow(non_snake_case)] storyAuthor: Option<String>,
135 ) -> Result<Value>;
136
137 #[rpc(name = "sendContacts", params = "named")]
138 fn send_contacts(&self, account: Option<String>) -> Result<Value>;
139
140 #[rpc(name = "sendPaymentNotification", params = "named")]
141 fn send_payment_notification(
142 &self,
143 account: Option<String>,
144 recipient: String,
145 receipt: String,
146 note: String,
147 ) -> Result<Value>;
148
149 #[rpc(name = "sendReaction", params = "named")]
150 fn send_reaction(
151 &self,
152 account: Option<String>,
153 recipients: Vec<String>,
154 #[allow(non_snake_case)] groupIds: Vec<String>,
155 #[allow(non_snake_case)] noteToSelf: bool,
156 emoji: String,
157 #[allow(non_snake_case)] targetAuthor: String,
158 #[allow(non_snake_case)] targetTimestamp: u64,
159 remove: bool,
160 story: bool,
161 ) -> Result<Value>;
162
163 #[rpc(name = "sendReceipt", params = "named")]
164 fn send_receipt(
165 &self,
166 account: Option<String>,
167 recipient: String,
168 #[allow(non_snake_case)] targetTimestamps: Vec<u64>,
169 r#type: String,
170 ) -> Result<Value>;
171
172 #[rpc(name = "sendSyncRequest", params = "named")]
173 fn send_sync_request(&self, account: Option<String>) -> Result<Value>;
174
175 #[rpc(name = "sendTyping", params = "named")]
176 fn send_typing(
177 &self,
178 account: Option<String>,
179 recipients: Vec<String>,
180 #[allow(non_snake_case)] groupIds: Vec<String>,
181 stop: bool,
182 ) -> Result<Value>;
183
184 #[rpc(name = "setPin", params = "named")]
185 fn set_pin(&self, account: Option<String>, pin: String) -> Result<Value>;
186
187 #[rpc(name = "submitRateLimitChallenge", params = "named")]
188 fn submit_rate_limit_challenge(
189 &self,
190 account: Option<String>,
191 challenge: String,
192 captcha: String,
193 ) -> Result<Value>;
194
195 #[rpc(name = "startLink", params = "named")]
196 fn start_link(&self, account: Option<String>) -> Result<JsonLink>;
197
198 #[rpc(name = "trust", params = "named")]
199 fn trust(
200 &self,
201 account: Option<String>,
202 recipient: String,
203 #[allow(non_snake_case)] trustAllKnownKeys: bool,
204 #[allow(non_snake_case)] verifiedSafetyNumber: Option<String>,
205 ) -> Result<Value>;
206
207 #[rpc(name = "unblock", params = "named")]
208 fn unblock(
209 &self,
210 account: Option<String>,
211 recipients: Vec<String>,
212 #[allow(non_snake_case)] groupIds: Vec<String>,
213 ) -> Result<Value>;
214
215 #[rpc(name = "unregister", params = "named")]
216 fn unregister(
217 &self,
218 account: Option<String>,
219 #[allow(non_snake_case)] deleteAccount: bool,
220 ) -> Result<Value>;
221
222 #[rpc(name = "updateAccount", params = "named")]
223 fn update_account(
224 &self,
225 account: Option<String>,
226 #[allow(non_snake_case)] deviceName: Option<String>,
227 ) -> Result<Value>;
228
229 #[rpc(name = "updateConfiguration", params = "named")]
230 fn update_configuration(
231 &self,
232 account: Option<String>,
233 #[allow(non_snake_case)] readReceiptes: Option<bool>,
234 #[allow(non_snake_case)] unidentifiedDeliveryIndicators: Option<bool>,
235 #[allow(non_snake_case)] typingIndicators: Option<bool>,
236 #[allow(non_snake_case)] linkPreviews: Option<bool>,
237 ) -> Result<Value>;
238
239 #[rpc(name = "updateContact", params = "named")]
240 fn update_contact(
241 &self,
242 account: Option<String>,
243 recipient: String,
244 name: Option<String>,
245 expiration: Option<u32>,
246 ) -> Result<Value>;
247
248 #[rpc(name = "updateGroup", params = "named")]
249 fn update_group(
250 &self,
251 account: Option<String>,
252 #[allow(non_snake_case)] groupId: Option<String>,
253 name: Option<String>,
254 description: Option<String>,
255 avatar: Option<String>,
256 member: Vec<String>,
257 #[allow(non_snake_case)] removeMember: Vec<String>,
258 admin: Vec<String>,
259 #[allow(non_snake_case)] removeAdmin: Vec<String>,
260 ban: Vec<String>,
261 unban: Vec<String>,
262 #[allow(non_snake_case)] resetLink: bool,
263 #[allow(non_snake_case)] link: Option<String>,
264 #[allow(non_snake_case)] setPermissionAddMember: Option<String>,
265 #[allow(non_snake_case)] setPermissionEditDetails: Option<String>,
266 #[allow(non_snake_case)] setPermissionSendMessages: Option<String>,
267 expiration: Option<u32>,
268 ) -> Result<Value>;
269
270 #[rpc(name = "updateProfile", params = "named")]
271 fn update_profile(
272 &self,
273 account: Option<String>,
274 #[allow(non_snake_case)] givenName: Option<String>,
275 #[allow(non_snake_case)] familyName: Option<String>,
276 about: Option<String>,
277 #[allow(non_snake_case)] aboutEmoji: Option<String>,
278 #[allow(non_snake_case)] mobileCoinAddress: Option<String>,
279 avatar: Option<String>,
280 #[allow(non_snake_case)] removeAvatar: bool,
281 ) -> Result<Value>;
282
283 #[rpc(name = "uploadStickerPack", params = "named")]
284 fn upload_sticker_pack(&self, account: Option<String>, path: String) -> Result<Value>;
285
286 #[rpc(name = "verify", params = "named")]
287 fn verify(
288 &self,
289 account: Option<String>,
290 #[allow(non_snake_case)] verificationCode: String,
291 pin: Option<String>,
292 ) -> Result<Value>;
293
294 #[pubsub(
295 subscription = "receive",
296 subscribe,
297 name = "subscribeReceive",
298 params = "named"
299 )]
300 fn subscribe_receive(&self, _: Self::Metadata, _: Subscriber<Value>, account: Option<String>);
301
302 #[pubsub(subscription = "receive", unsubscribe, name = "unsubscribeReceive")]
303 fn unsubscribe_receive(&self, _: Option<Self::Metadata>, _: SubscriptionId) -> Result<bool>;
304
305 #[rpc(name = "version")]
306 fn version(&self) -> Result<Value>;
307 }
308
309 #[derive(Deserialize)]
310 #[serde(rename_all = "camelCase")]
311 pub struct JsonLink {
312 pub device_link_uri: String,
313 }
314
315 pub async fn connect_tcp(tcp: impl ToSocketAddrs) -> Result<SignalCliClient, RpcError> {
316 super::tcp::connect::<_, SignalCliClient>(tcp).await
317 }
318
319 pub async fn connect_unix(socket_path: impl AsRef<Path>) -> Result<SignalCliClient, RpcError> {
320 ipc::connect::<_, SignalCliClient>(socket_path).await
321 }