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