]> nmode's Git Repositories - signal-cli/blob - client/src/cli.rs
e0abb717b03ec731e830e8cb98190dc2e2dd5f00
[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 #[arg(long)]
88 username: Vec<String>,
89 },
90 JoinGroup {
91 #[arg(long)]
92 uri: String,
93 },
94 Link {
95 #[arg(short = 'n', long)]
96 name: String,
97 },
98 ListAccounts,
99 ListContacts {
100 recipient: Vec<String>,
101 #[arg(short = 'a', long = "all-recipients")]
102 all_recipients: bool,
103 #[arg(long)]
104 blocked: Option<bool>,
105 #[arg(long)]
106 name: Option<String>,
107 },
108 ListDevices,
109 ListGroups {
110 #[arg(short = 'd', long)]
111 detailed: bool,
112 #[arg(short = 'g', long = "group-id")]
113 group_id: Vec<String>,
114 },
115 ListIdentities {
116 #[arg(short = 'n', long)]
117 number: Option<String>,
118 },
119 ListStickerPacks,
120 QuitGroup {
121 #[arg(short = 'g', long = "group-id")]
122 group_id: String,
123 #[arg(long)]
124 delete: bool,
125 #[arg(long)]
126 admin: Vec<String>,
127 },
128 Receive {
129 #[arg(short = 't', long, default_value_t = 3.0)]
130 timeout: f64,
131 },
132 Register {
133 #[arg(short = 'v', long)]
134 voice: bool,
135 #[arg(long)]
136 captcha: Option<String>,
137 },
138 RemoveContact {
139 recipient: String,
140 #[arg(long)]
141 forget: bool,
142 #[arg(long)]
143 hide: bool,
144 },
145 RemoveDevice {
146 #[arg(short = 'd', long = "device-id")]
147 device_id: u32,
148 },
149 RemovePin,
150 RemoteDelete {
151 #[arg(short = 't', long = "target-timestamp")]
152 target_timestamp: u64,
153
154 recipient: Vec<String>,
155
156 #[arg(short = 'g', long = "group-id")]
157 group_id: Vec<String>,
158
159 #[arg(long = "note-to-self")]
160 note_to_self: bool,
161 },
162 #[command(rename_all = "kebab-case")]
163 Send {
164 recipient: Vec<String>,
165
166 #[arg(short = 'g', long)]
167 group_id: Vec<String>,
168
169 #[arg(long)]
170 note_to_self: bool,
171
172 #[arg(short = 'e', long)]
173 end_session: bool,
174
175 #[arg(short = 'm', long)]
176 message: Option<String>,
177
178 #[arg(short = 'a', long)]
179 attachment: Vec<String>,
180
181 #[arg(long)]
182 mention: Vec<String>,
183
184 #[arg(long)]
185 text_style: Vec<String>,
186
187 #[arg(long)]
188 quote_timestamp: Option<u64>,
189
190 #[arg(long)]
191 quote_author: Option<String>,
192
193 #[arg(long)]
194 quote_message: Option<String>,
195
196 #[arg(long)]
197 quote_mention: Vec<String>,
198
199 #[arg(long)]
200 quote_text_style: Vec<String>,
201
202 #[arg(long)]
203 quote_attachment: Vec<String>,
204
205 #[arg(long)]
206 preview_url: Option<String>,
207
208 #[arg(long)]
209 preview_title: Option<String>,
210
211 #[arg(long)]
212 preview_description: Option<String>,
213
214 #[arg(long)]
215 preview_image: Option<String>,
216
217 #[arg(long)]
218 sticker: Option<String>,
219
220 #[arg(long)]
221 story_timestamp: Option<u64>,
222
223 #[arg(long)]
224 story_author: Option<String>,
225
226 #[arg(long)]
227 edit_timestamp: Option<u64>,
228 },
229 SendContacts,
230 SendPaymentNotification {
231 recipient: String,
232
233 #[arg(long)]
234 receipt: String,
235
236 #[arg(long)]
237 note: String,
238 },
239 SendReaction {
240 recipient: Vec<String>,
241
242 #[arg(short = 'g', long = "group-id")]
243 group_id: Vec<String>,
244
245 #[arg(long = "note-to-self")]
246 note_to_self: bool,
247
248 #[arg(short = 'e', long)]
249 emoji: String,
250
251 #[arg(short = 'a', long = "target-author")]
252 target_author: String,
253
254 #[arg(short = 't', long = "target-timestamp")]
255 target_timestamp: u64,
256
257 #[arg(short = 'r', long)]
258 remove: bool,
259
260 #[arg(long)]
261 story: bool,
262 },
263 SendReceipt {
264 recipient: String,
265
266 #[arg(short = 't', long = "target-timestamp")]
267 target_timestamp: Vec<u64>,
268
269 #[arg(value_enum, long)]
270 r#type: ReceiptType,
271 },
272 SendSyncRequest,
273 SendTyping {
274 recipient: Vec<String>,
275
276 #[arg(short = 'g', long = "group-id")]
277 group_id: Vec<String>,
278
279 #[arg(short = 's', long)]
280 stop: bool,
281 },
282 SendMessageRequestResponse {
283 recipient: Vec<String>,
284
285 #[arg(short = 'g', long = "group-id")]
286 group_id: Vec<String>,
287
288 r#type: MessageRequestResponseType,
289 },
290 SetPin {
291 pin: String,
292 },
293 StartChangeNumber {
294 number: String,
295 #[arg(short = 'v', long)]
296 voice: bool,
297 #[arg(long)]
298 captcha: Option<String>,
299 },
300 SubmitRateLimitChallenge {
301 challenge: String,
302 captcha: String,
303 },
304 Trust {
305 recipient: String,
306
307 #[arg(short = 'a', long = "trust-all-known-keys")]
308 trust_all_known_keys: bool,
309
310 #[arg(short = 'v', long = "verified-safety-number")]
311 verified_safety_number: Option<String>,
312 },
313 #[command(rename_all = "kebab-case")]
314 Unblock {
315 recipient: Vec<String>,
316
317 #[arg(short = 'g', long)]
318 group_id: Vec<String>,
319 },
320 Unregister {
321 #[arg(long = "delete-account")]
322 delete_account: bool,
323 },
324 UpdateAccount {
325 #[arg(short = 'n', long = "device-name")]
326 device_name: Option<String>,
327 #[arg(long = "unrestricted-unidentified-sender")]
328 unrestricted_unidentified_sender: Option<bool>,
329 #[arg(long = "discoverable-by-number")]
330 discoverable_by_number: Option<bool>,
331 #[arg(long = "number-sharing")]
332 number_sharing: Option<bool>,
333 },
334 UpdateConfiguration {
335 #[arg(long = "read-receipts")]
336 read_receipts: Option<bool>,
337
338 #[arg(long = "unidentified-delivery-indicators")]
339 unidentified_delivery_indicators: Option<bool>,
340
341 #[arg(long = "typing-indicators")]
342 typing_indicators: Option<bool>,
343
344 #[arg(long = "link-previews")]
345 link_previews: Option<bool>,
346 },
347 UpdateContact {
348 recipient: String,
349
350 #[arg(short = 'e', long)]
351 expiration: Option<u32>,
352
353 #[arg(short = 'n', long)]
354 name: Option<String>,
355 },
356 UpdateGroup {
357 #[arg(short = 'g', long = "group-id")]
358 group_id: Option<String>,
359
360 #[arg(short = 'n', long)]
361 name: Option<String>,
362
363 #[arg(short = 'd', long)]
364 description: Option<String>,
365
366 #[arg(short = 'a', long)]
367 avatar: Option<String>,
368
369 #[arg(short = 'm', long)]
370 member: Vec<String>,
371
372 #[arg(short = 'r', long = "remove-member")]
373 remove_member: Vec<String>,
374
375 #[arg(long)]
376 admin: Vec<String>,
377
378 #[arg(long = "remove-admin")]
379 remove_admin: Vec<String>,
380
381 #[arg(long)]
382 ban: Vec<String>,
383
384 #[arg(long)]
385 unban: Vec<String>,
386
387 #[arg(long = "reset-link")]
388 reset_link: bool,
389
390 #[arg(value_enum, long)]
391 link: Option<LinkState>,
392
393 #[arg(value_enum, long = "set-permission-add-member")]
394 set_permission_add_member: Option<GroupPermission>,
395
396 #[arg(value_enum, long = "set-permission-edit-details")]
397 set_permission_edit_details: Option<GroupPermission>,
398
399 #[arg(value_enum, long = "set-permission-send-messages")]
400 set_permission_send_messages: Option<GroupPermission>,
401
402 #[arg(short = 'e', long)]
403 expiration: Option<u32>,
404 },
405 UpdateProfile {
406 #[arg(long = "given-name")]
407 given_name: Option<String>,
408
409 #[arg(long = "family-name")]
410 family_name: Option<String>,
411
412 #[arg(long)]
413 about: Option<String>,
414
415 #[arg(long = "about-emoji")]
416 about_emoji: Option<String>,
417
418 #[arg(long = "mobile-coin-address", visible_alias = "mobilecoin-address")]
419 mobile_coin_address: Option<String>,
420
421 #[arg(long)]
422 avatar: Option<String>,
423
424 #[arg(long = "remove-avatar")]
425 remove_avatar: bool,
426 },
427 UploadStickerPack {
428 path: String,
429 },
430 Verify {
431 verification_code: String,
432
433 #[arg(short = 'p', long)]
434 pin: Option<String>,
435 },
436 Version,
437 }
438
439 #[derive(ValueEnum, Clone, Debug)]
440 #[value(rename_all = "kebab-case")]
441 pub enum ReceiptType {
442 Read,
443 Viewed,
444 }
445
446 #[derive(ValueEnum, Clone, Debug)]
447 #[value(rename_all = "kebab-case")]
448 pub enum LinkState {
449 Enabled,
450 EnabledWithApproval,
451 Disabled,
452 }
453
454 #[derive(ValueEnum, Clone, Debug)]
455 #[value(rename_all = "kebab-case")]
456 pub enum GroupPermission {
457 EveryMember,
458 OnlyAdmins,
459 }
460
461 #[derive(ValueEnum, Clone, Debug)]
462 #[value(rename_all = "kebab-case")]
463 pub enum MessageRequestResponseType {
464 Accept,
465 Delete,
466 }