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