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