3 use jsonrpc_client_transports::{transports::ipc, RpcError};
4 use jsonrpc_core::serde::Deserialize;
5 use jsonrpc_derive::rpc;
6 use tokio::net::ToSocketAddrs;
8 pub type SignalCliClient = gen_client::Client;
10 #[rpc(client, params = "named")]
12 #[rpc(name = "addDevice", params = "named")]
13 fn add_device(&self, account: Option<String>, uri: String) -> Result<Value>;
15 #[rpc(name = "block", params = "named")]
18 account: Option<String>,
19 recipients: Vec<String>,
20 #[allow(non_snake_case)] groupIds: Vec<String>,
23 #[rpc(name = "deleteLocalAccountData", params = "named")]
24 fn delete_local_account_data(
26 account: Option<String>,
27 #[allow(non_snake_case)] ignoreRegistered: Option<bool>,
30 #[rpc(name = "getUserStatus", params = "named")]
31 fn get_user_status(&self, account: Option<String>, recipients: Vec<String>) -> Result<Value>;
33 #[rpc(name = "joinGroup", params = "named")]
34 fn join_group(&self, account: Option<String>, uri: String) -> Result<Value>;
36 #[rpc(name = "finishLink", params = "named")]
39 #[allow(non_snake_case)] deviceLinkUri: String,
40 #[allow(non_snake_case)] deviceName: String,
43 #[rpc(name = "listAccounts", params = "named")]
44 fn list_accounts(&self) -> Result<Value>;
46 #[rpc(name = "listContacts", params = "named")]
49 account: Option<String>,
50 recipients: Vec<String>,
51 #[allow(non_snake_case)] allRecipients: bool,
52 blocked: Option<bool>,
56 #[rpc(name = "listDevices", params = "named")]
57 fn list_devices(&self, account: Option<String>) -> Result<Value>;
59 #[rpc(name = "listGroups", params = "named")]
62 account: Option<String>,
63 #[allow(non_snake_case)] groupIds: Vec<String>,
66 #[rpc(name = "listIdentities", params = "named")]
67 fn list_identities(&self, account: Option<String>, number: Option<String>) -> Result<Value>;
69 #[rpc(name = "listStickerPacks", params = "named")]
70 fn list_sticker_packs(&self, account: Option<String>) -> Result<Value>;
72 #[rpc(name = "quitGroup", params = "named")]
75 account: Option<String>,
76 #[allow(non_snake_case)] groupId: String,
81 #[rpc(name = "register", params = "named")]
84 account: Option<String>,
86 captcha: Option<String>,
89 #[rpc(name = "removeContact", params = "named")]
92 account: Option<String>,
97 #[rpc(name = "removeDevice", params = "named")]
100 account: Option<String>,
101 #[allow(non_snake_case)] deviceId: u32,
104 #[rpc(name = "removePin", params = "named")]
105 fn remove_pin(&self, account: Option<String>) -> Result<Value>;
107 #[rpc(name = "remoteDelete", params = "named")]
110 account: Option<String>,
111 #[allow(non_snake_case)] targetTimestamp: u64,
112 recipients: Vec<String>,
113 #[allow(non_snake_case)] groupIds: Vec<String>,
114 #[allow(non_snake_case)] noteToSelf: bool,
117 #[rpc(name = "send", params = "named")]
120 account: Option<String>,
121 recipients: Vec<String>,
122 #[allow(non_snake_case)] groupIds: Vec<String>,
123 #[allow(non_snake_case)] noteToSelf: bool,
124 #[allow(non_snake_case)] endSession: bool,
126 attachments: Vec<String>,
127 mentions: Vec<String>,
128 #[allow(non_snake_case)] quoteTimestamp: Option<u64>,
129 #[allow(non_snake_case)] quoteAuthor: Option<String>,
130 #[allow(non_snake_case)] quoteMessage: Option<String>,
131 #[allow(non_snake_case)] quoteMention: Vec<String>,
132 sticker: Option<String>,
135 #[rpc(name = "sendContacts", params = "named")]
136 fn send_contacts(&self, account: Option<String>) -> Result<Value>;
138 #[rpc(name = "sendPaymentNotification", params = "named")]
139 fn send_payment_notification(
141 account: Option<String>,
147 #[rpc(name = "sendReaction", params = "named")]
150 account: Option<String>,
151 recipients: Vec<String>,
152 #[allow(non_snake_case)] groupIds: Vec<String>,
153 #[allow(non_snake_case)] noteToSelf: bool,
155 #[allow(non_snake_case)] targetAuthor: String,
156 #[allow(non_snake_case)] targetTimestamp: u64,
161 #[rpc(name = "sendReceipt", params = "named")]
164 account: Option<String>,
166 #[allow(non_snake_case)] targetTimestamps: Vec<u64>,
170 #[rpc(name = "sendSyncRequest", params = "named")]
171 fn send_sync_request(&self, account: Option<String>) -> Result<Value>;
173 #[rpc(name = "sendTyping", params = "named")]
176 account: Option<String>,
177 recipients: Vec<String>,
178 #[allow(non_snake_case)] groupIds: Vec<String>,
182 #[rpc(name = "setPin", params = "named")]
183 fn set_pin(&self, account: Option<String>, pin: String) -> Result<Value>;
185 #[rpc(name = "submitRateLimitChallenge", params = "named")]
186 fn submit_rate_limit_challenge(
188 account: Option<String>,
193 #[rpc(name = "startLink", params = "named")]
194 fn start_link(&self, account: Option<String>) -> Result<JsonLink>;
196 #[rpc(name = "trust", params = "named")]
199 account: Option<String>,
201 #[allow(non_snake_case)] trustAllKnownKeys: bool,
202 #[allow(non_snake_case)] verifiedSafetyNumber: Option<String>,
205 #[rpc(name = "unblock", params = "named")]
208 account: Option<String>,
209 recipients: Vec<String>,
210 #[allow(non_snake_case)] groupIds: Vec<String>,
213 #[rpc(name = "unregister", params = "named")]
216 account: Option<String>,
217 #[allow(non_snake_case)] deleteAccount: bool,
220 #[rpc(name = "updateAccount", params = "named")]
223 account: Option<String>,
224 #[allow(non_snake_case)] deviceName: Option<String>,
227 #[rpc(name = "updateConfiguration", params = "named")]
228 fn update_configuration(
230 account: Option<String>,
231 #[allow(non_snake_case)] readReceiptes: Option<bool>,
232 #[allow(non_snake_case)] unidentifiedDeliveryIndicators: Option<bool>,
233 #[allow(non_snake_case)] typingIndicators: Option<bool>,
234 #[allow(non_snake_case)] linkPreviews: Option<bool>,
237 #[rpc(name = "updateContact", params = "named")]
240 account: Option<String>,
242 name: Option<String>,
243 expiration: Option<u32>,
246 #[rpc(name = "updateGroup", params = "named")]
249 account: Option<String>,
250 #[allow(non_snake_case)] groupId: Option<String>,
251 name: Option<String>,
252 description: Option<String>,
253 avatar: Option<String>,
255 #[allow(non_snake_case)] removeMember: Vec<String>,
257 #[allow(non_snake_case)] removeAdmin: Vec<String>,
260 #[allow(non_snake_case)] resetLink: bool,
261 #[allow(non_snake_case)] link: Option<String>,
262 #[allow(non_snake_case)] setPermissionAddMember: Option<String>,
263 #[allow(non_snake_case)] setPermissionEditDetails: Option<String>,
264 #[allow(non_snake_case)] setPermissionSendMessages: Option<String>,
265 expiration: Option<u32>,
268 #[rpc(name = "updateProfile", params = "named")]
271 account: Option<String>,
272 #[allow(non_snake_case)] givenName: Option<String>,
273 #[allow(non_snake_case)] familyName: Option<String>,
274 about: Option<String>,
275 #[allow(non_snake_case)] aboutEmoji: Option<String>,
276 #[allow(non_snake_case)] mobileCoinAddress: Option<String>,
277 avatar: Option<String>,
278 #[allow(non_snake_case)] removeAvatar: bool,
281 #[rpc(name = "uploadStickerPack", params = "named")]
282 fn upload_sticker_pack(&self, account: Option<String>, path: String) -> Result<Value>;
284 #[rpc(name = "verify", params = "named")]
287 account: Option<String>,
288 #[allow(non_snake_case)] verificationCode: String,
293 subscription = "receive",
295 name = "subscribeReceive",
298 fn subscribe_receive(&self, _: Self::Metadata, _: Subscriber<Value>, account: Option<String>);
300 #[pubsub(subscription = "receive", unsubscribe, name = "unsubscribeReceive")]
301 fn unsubscribe_receive(&self, _: Option<Self::Metadata>, _: SubscriptionId) -> Result<bool>;
303 #[rpc(name = "version")]
304 fn version(&self) -> Result<Value>;
307 #[derive(Deserialize)]
308 #[serde(rename_all = "camelCase")]
309 pub struct JsonLink {
310 pub device_link_uri: String,
313 pub async fn connect_tcp(tcp: impl ToSocketAddrs) -> Result<SignalCliClient, RpcError> {
314 super::tcp::connect::<_, SignalCliClient>(tcp).await
317 pub async fn connect_unix(socket_path: impl AsRef<Path>) -> Result<SignalCliClient, RpcError> {
318 ipc::connect::<_, SignalCliClient>(socket_path).await