]> nmode's Git Repositories - signal-cli/blob - client/src/cli.rs
a64ab51173661d9fe73eff8f40d2b0d19268587c
[signal-cli] / client / src / cli.rs
1 use std::{ffi::OsString, net::SocketAddr};
2
3 use clap::{crate_version, Parser, Subcommand, ValueEnum};
4
5 /// JSON-RPC client for signal-cli
6 #[derive(Parser, Debug)]
7 #[command(rename_all = "kebab-case", version = crate_version!())]
8 pub struct Cli {
9 /// Account to use (for daemon in multi-account mode)
10 #[arg(short = 'a', long)]
11 pub account: Option<String>,
12
13 /// TCP host and port of signal-cli daemon
14 #[arg(long, conflicts_with = "json_rpc_http")]
15 pub json_rpc_tcp: Option<Option<SocketAddr>>,
16
17 /// UNIX socket address and port of signal-cli daemon
18 #[arg(long, conflicts_with = "json_rpc_tcp")]
19 pub json_rpc_socket: Option<Option<OsString>>,
20
21 /// HTTP URL of signal-cli daemon
22 #[arg(long, conflicts_with = "json_rpc_socket")]
23 pub json_rpc_http: Option<Option<String>>,
24
25 #[arg(long)]
26 pub verbose: bool,
27
28 #[command(subcommand)]
29 pub command: CliCommands,
30 }
31
32 #[allow(clippy::large_enum_variant)]
33 #[derive(Subcommand, Debug)]
34 #[command(rename_all = "camelCase", version = crate_version!())]
35 pub enum CliCommands {
36 AddDevice {
37 #[arg(long)]
38 uri: String,
39 },
40 AddStickerPack {
41 #[arg(long)]
42 uri: String,
43 },
44 #[command(rename_all = "kebab-case")]
45 Block {
46 recipient: Vec<String>,
47
48 #[arg(short = 'g', long)]
49 group_id: Vec<String>,
50 },
51 DeleteLocalAccountData {
52 #[arg(long = "ignore-registered")]
53 ignore_registered: Option<bool>,
54 },
55 FinishChangeNumber {
56 number: String,
57 #[arg(short = 'v', long = "verification-code")]
58 verification_code: String,
59
60 #[arg(short = 'p', long)]
61 pin: Option<String>,
62 },
63 GetAttachment {
64 #[arg(long)]
65 id: String,
66 #[arg(long)]
67 recipient: Option<String>,
68 #[arg(short = 'g', long = "group-id")]
69 group_id: Option<String>,
70 },
71 GetAvatar {
72 #[arg(long)]
73 contact: Option<String>,
74 #[arg(long)]
75 profile: Option<String>,
76 #[arg(short = 'g', long = "group-id")]
77 group_id: Option<String>,
78 },
79 GetSticker {
80 #[arg(long = "pack-id")]
81 pack_id: String,
82 #[arg(long = "sticker-id")]
83 sticker_id: u32,
84 },
85 GetUserStatus {
86 recipient: Vec<String>,
87 },
88 JoinGroup {
89 #[arg(long)]
90 uri: String,
91 },
92 Link {
93 #[arg(short = 'n', long)]
94 name: String,
95 },
96 ListAccounts,
97 ListContacts {
98 recipient: Vec<String>,
99 #[arg(short = 'a', long = "all-recipients")]
100 all_recipients: bool,
101 #[arg(long)]
102 blocked: Option<bool>,
103 #[arg(long)]
104 name: Option<String>,
105 },
106 ListDevices,
107 ListGroups {
108 #[arg(short = 'd', long)]
109 detailed: bool,
110 #[arg(short = 'g', long = "group-id")]
111 group_id: Vec<String>,
112 },
113 ListIdentities {
114 #[arg(short = 'n', long)]
115 number: Option<String>,
116 },
117 ListStickerPacks,
118 QuitGroup {
119 #[arg(short = 'g', long = "group-id")]
120 group_id: String,
121 #[arg(long)]
122 delete: bool,
123 #[arg(long)]
124 admin: Vec<String>,
125 },
126 Receive {
127 #[arg(short = 't', long, default_value_t = 3.0)]
128 timeout: f64,
129 },
130 Register {
131 #[arg(short = 'v', long)]
132 voice: bool,
133 #[arg(long)]
134 captcha: Option<String>,
135 },
136 RemoveContact {
137 recipient: String,
138 #[arg(long)]
139 forget: bool,
140 #[arg(long)]
141 hide: bool,
142 },
143 RemoveDevice {
144 #[arg(short = 'd', long = "device-id")]
145 device_id: u32,
146 },
147 RemovePin,
148 RemoteDelete {
149 #[arg(short = 't', long = "target-timestamp")]
150 target_timestamp: u64,
151
152 recipient: Vec<String>,
153
154 #[arg(short = 'g', long = "group-id")]
155 group_id: Vec<String>,
156
157 #[arg(long = "note-to-self")]
158 note_to_self: bool,
159 },
160 #[command(rename_all = "kebab-case")]
161 Send {
162 recipient: Vec<String>,
163
164 #[arg(short = 'g', long)]
165 group_id: Vec<String>,
166
167 #[arg(long)]
168 note_to_self: bool,
169
170 #[arg(short = 'e', long)]
171 end_session: bool,
172
173 #[arg(short = 'm', long)]
174 message: Option<String>,
175
176 #[arg(short = 'a', long)]
177 attachment: Vec<String>,
178
179 #[arg(long)]
180 mention: Vec<String>,
181
182 #[arg(long)]
183 text_style: Vec<String>,
184
185 #[arg(long)]
186 quote_timestamp: Option<u64>,
187
188 #[arg(long)]
189 quote_author: Option<String>,
190
191 #[arg(long)]
192 quote_message: Option<String>,
193
194 #[arg(long)]
195 quote_mention: Vec<String>,
196
197 #[arg(long)]
198 quote_text_style: Vec<String>,
199
200 #[arg(long)]
201 quote_attachment: Vec<String>,
202
203 #[arg(long)]
204 preview_url: Option<String>,
205
206 #[arg(long)]
207 preview_title: Option<String>,
208
209 #[arg(long)]
210 preview_description: Option<String>,
211
212 #[arg(long)]
213 preview_image: Option<String>,
214
215 #[arg(long)]
216 sticker: Option<String>,
217
218 #[arg(long)]
219 story_timestamp: Option<u64>,
220
221 #[arg(long)]
222 story_author: Option<String>,
223
224 #[arg(long)]
225 edit_timestamp: Option<u64>,
226 },
227 SendContacts,
228 SendPaymentNotification {
229 recipient: String,
230
231 #[arg(long)]
232 receipt: String,
233
234 #[arg(long)]
235 note: String,
236 },
237 SendReaction {
238 recipient: Vec<String>,
239
240 #[arg(short = 'g', long = "group-id")]
241 group_id: Vec<String>,
242
243 #[arg(long = "note-to-self")]
244 note_to_self: bool,
245
246 #[arg(short = 'e', long)]
247 emoji: String,
248
249 #[arg(short = 'a', long = "target-author")]
250 target_author: String,
251
252 #[arg(short = 't', long = "target-timestamp")]
253 target_timestamp: u64,
254
255 #[arg(short = 'r', long)]
256 remove: bool,
257
258 #[arg(long)]
259 story: bool,
260 },
261 SendReceipt {
262 recipient: String,
263
264 #[arg(short = 't', long = "target-timestamp")]
265 target_timestamp: Vec<u64>,
266
267 #[arg(value_enum, long)]
268 r#type: ReceiptType,
269 },
270 SendSyncRequest,
271 SendTyping {
272 recipient: Vec<String>,
273
274 #[arg(short = 'g', long = "group-id")]
275 group_id: Vec<String>,
276
277 #[arg(short = 's', long)]
278 stop: bool,
279 },
280 SendMessageRequestResponse {
281 recipient: Vec<String>,
282
283 #[arg(short = 'g', long = "group-id")]
284 group_id: Vec<String>,
285
286 r#type: MessageRequestResponseType,
287 },
288 SetPin {
289 pin: String,
290 },
291 StartChangeNumber {
292 number: String,
293 #[arg(short = 'v', long)]
294 voice: bool,
295 #[arg(long)]
296 captcha: Option<String>,
297 },
298 SubmitRateLimitChallenge {
299 challenge: String,
300 captcha: String,
301 },
302 Trust {
303 recipient: String,
304
305 #[arg(short = 'a', long = "trust-all-known-keys")]
306 trust_all_known_keys: bool,
307
308 #[arg(short = 'v', long = "verified-safety-number")]
309 verified_safety_number: Option<String>,
310 },
311 #[command(rename_all = "kebab-case")]
312 Unblock {
313 recipient: Vec<String>,
314
315 #[arg(short = 'g', long)]
316 group_id: Vec<String>,
317 },
318 Unregister {
319 #[arg(long = "delete-account")]
320 delete_account: bool,
321 },
322 UpdateAccount {
323 #[arg(short = 'n', long = "device-name")]
324 device_name: Option<String>,
325 #[arg(long = "unrestricted-unidentified-sender")]
326 unrestricted_unidentified_sender: Option<bool>,
327 #[arg(long = "discoverable-by-number")]
328 discoverable_by_number: Option<bool>,
329 #[arg(long = "number-sharing")]
330 number_sharing: Option<bool>,
331 },
332 UpdateConfiguration {
333 #[arg(long = "read-receipts")]
334 read_receipts: Option<bool>,
335
336 #[arg(long = "unidentified-delivery-indicators")]
337 unidentified_delivery_indicators: Option<bool>,
338
339 #[arg(long = "typing-indicators")]
340 typing_indicators: Option<bool>,
341
342 #[arg(long = "link-previews")]
343 link_previews: Option<bool>,
344 },
345 UpdateContact {
346 recipient: String,
347
348 #[arg(short = 'e', long)]
349 expiration: Option<u32>,
350
351 #[arg(short = 'n', long)]
352 name: Option<String>,
353 },
354 UpdateGroup {
355 #[arg(short = 'g', long = "group-id")]
356 group_id: Option<String>,
357
358 #[arg(short = 'n', long)]
359 name: Option<String>,
360
361 #[arg(short = 'd', long)]
362 description: Option<String>,
363
364 #[arg(short = 'a', long)]
365 avatar: Option<String>,
366
367 #[arg(short = 'm', long)]
368 member: Vec<String>,
369
370 #[arg(short = 'r', long = "remove-member")]
371 remove_member: Vec<String>,
372
373 #[arg(long)]
374 admin: Vec<String>,
375
376 #[arg(long = "remove-admin")]
377 remove_admin: Vec<String>,
378
379 #[arg(long)]
380 ban: Vec<String>,
381
382 #[arg(long)]
383 unban: Vec<String>,
384
385 #[arg(long = "reset-link")]
386 reset_link: bool,
387
388 #[arg(value_enum, long)]
389 link: Option<LinkState>,
390
391 #[arg(value_enum, long = "set-permission-add-member")]
392 set_permission_add_member: Option<GroupPermission>,
393
394 #[arg(value_enum, long = "set-permission-edit-details")]
395 set_permission_edit_details: Option<GroupPermission>,
396
397 #[arg(value_enum, long = "set-permission-send-messages")]
398 set_permission_send_messages: Option<GroupPermission>,
399
400 #[arg(short = 'e', long)]
401 expiration: Option<u32>,
402 },
403 UpdateProfile {
404 #[arg(long = "given-name")]
405 given_name: Option<String>,
406
407 #[arg(long = "family-name")]
408 family_name: Option<String>,
409
410 #[arg(long)]
411 about: Option<String>,
412
413 #[arg(long = "about-emoji")]
414 about_emoji: Option<String>,
415
416 #[arg(long = "mobile-coin-address")]
417 mobile_coin_address: Option<String>,
418
419 #[arg(long)]
420 avatar: Option<String>,
421
422 #[arg(long = "remove-avatar")]
423 remove_avatar: bool,
424 },
425 UploadStickerPack {
426 path: String,
427 },
428 Verify {
429 verification_code: String,
430
431 #[arg(short = 'p', long)]
432 pin: Option<String>,
433 },
434 Version,
435 }
436
437 #[derive(ValueEnum, Clone, Debug)]
438 #[value(rename_all = "kebab-case")]
439 pub enum ReceiptType {
440 Read,
441 Viewed,
442 }
443
444 #[derive(ValueEnum, Clone, Debug)]
445 #[value(rename_all = "kebab-case")]
446 pub enum LinkState {
447 Enabled,
448 EnabledWithApproval,
449 Disabled,
450 }
451
452 #[derive(ValueEnum, Clone, Debug)]
453 #[value(rename_all = "kebab-case")]
454 pub enum GroupPermission {
455 EveryMember,
456 OnlyAdmins,
457 }
458
459 #[derive(ValueEnum, Clone, Debug)]
460 #[value(rename_all = "kebab-case")]
461 pub enum MessageRequestResponseType {
462 Accept,
463 Delete,
464 }