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