X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/7b5b5776f014db0ad18fb6af909c63bbf2293c88..3d4070a13907152b312c863a2ea885ac57935365:/client/src/main.rs diff --git a/client/src/main.rs b/client/src/main.rs index 958d9d9f..f82ee237 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -1,13 +1,13 @@ use std::{path::PathBuf, time::Duration}; use clap::Parser; -use cli::Cli; -use jsonrpsee::core::client::{Subscription, SubscriptionClientT}; -use jsonrpsee::core::Error as RpcError; -use serde_json::Value; +use jsonrpsee::core::client::{Error as RpcError, Subscription, SubscriptionClientT}; +use serde_json::{Error, Value}; use tokio::{select, time::sleep}; -use crate::cli::{GroupPermission, LinkState}; +use cli::Cli; + +use crate::cli::{CliCommands, GroupPermission, LinkState}; use crate::jsonrpc::RpcClient; mod cli; @@ -38,7 +38,7 @@ async fn handle_command( client: impl SubscriptionClientT + Sync, ) -> Result { match cli.command { - cli::CliCommands::Receive { timeout } => { + CliCommands::Receive { timeout } => { let mut stream = client.subscribe_receive(cli.account).await?; { @@ -50,31 +50,36 @@ async fn handle_command( stream.unsubscribe().await?; Ok(Value::Null) } - cli::CliCommands::AddDevice { uri } => client.add_device(cli.account, uri).await, - cli::CliCommands::Block { + CliCommands::AddDevice { uri } => client.add_device(cli.account, uri).await, + CliCommands::Block { recipient, group_id, } => client.block(cli.account, recipient, group_id).await, - cli::CliCommands::DeleteLocalAccountData { ignore_registered } => { + CliCommands::DeleteLocalAccountData { ignore_registered } => { client .delete_local_account_data(cli.account, ignore_registered) .await } - cli::CliCommands::GetUserStatus { recipient } => { - client.get_user_status(cli.account, recipient).await + CliCommands::GetUserStatus { + recipient, + username, + } => { + client + .get_user_status(cli.account, recipient, username) + .await } - cli::CliCommands::JoinGroup { uri } => client.join_group(cli.account, uri).await, - cli::CliCommands::Link { name } => { + CliCommands::JoinGroup { uri } => client.join_group(cli.account, uri).await, + CliCommands::Link { name } => { let url = client .start_link(cli.account) .await .map_err(|e| RpcError::Custom(format!("JSON-RPC command startLink failed: {e:?}")))? .device_link_uri; - println!("{}", url); + println!("{url}"); client.finish_link(url, name).await } - cli::CliCommands::ListAccounts => client.list_accounts().await, - cli::CliCommands::ListContacts { + CliCommands::ListAccounts => client.list_accounts().await, + CliCommands::ListContacts { recipient, all_recipients, blocked, @@ -84,16 +89,14 @@ async fn handle_command( .list_contacts(cli.account, recipient, all_recipients, blocked, name) .await } - cli::CliCommands::ListDevices => client.list_devices(cli.account).await, - cli::CliCommands::ListGroups { + CliCommands::ListDevices => client.list_devices(cli.account).await, + CliCommands::ListGroups { detailed: _, group_id, } => client.list_groups(cli.account, group_id).await, - cli::CliCommands::ListIdentities { number } => { - client.list_identities(cli.account, number).await - } - cli::CliCommands::ListStickerPacks => client.list_sticker_packs(cli.account).await, - cli::CliCommands::QuitGroup { + CliCommands::ListIdentities { number } => client.list_identities(cli.account, number).await, + CliCommands::ListStickerPacks => client.list_sticker_packs(cli.account).await, + CliCommands::QuitGroup { group_id, delete, admin, @@ -102,17 +105,23 @@ async fn handle_command( .quit_group(cli.account, group_id, delete, admin) .await } - cli::CliCommands::Register { voice, captcha } => { + CliCommands::Register { voice, captcha } => { client.register(cli.account, voice, captcha).await } - cli::CliCommands::RemoveContact { recipient, forget } => { - client.remove_contact(cli.account, recipient, forget).await + CliCommands::RemoveContact { + recipient, + forget, + hide, + } => { + client + .remove_contact(cli.account, recipient, forget, hide) + .await } - cli::CliCommands::RemoveDevice { device_id } => { + CliCommands::RemoveDevice { device_id } => { client.remove_device(cli.account, device_id).await } - cli::CliCommands::RemovePin => client.remove_pin(cli.account).await, - cli::CliCommands::RemoteDelete { + CliCommands::RemovePin => client.remove_pin(cli.account).await, + CliCommands::RemoteDelete { target_timestamp, recipient, group_id, @@ -128,7 +137,7 @@ async fn handle_command( ) .await } - cli::CliCommands::Send { + CliCommands::Send { recipient, group_id, note_to_self, @@ -136,14 +145,21 @@ async fn handle_command( message, attachment, mention, + text_style, quote_timestamp, quote_author, quote_message, quote_mention, + quote_text_style, quote_attachment, + preview_url, + preview_title, + preview_description, + preview_image, sticker, story_timestamp, story_author, + edit_timestamp, } => { client .send( @@ -155,19 +171,26 @@ async fn handle_command( message.unwrap_or_default(), attachment, mention, + text_style, quote_timestamp, quote_author, quote_message, quote_mention, + quote_text_style, quote_attachment, + preview_url, + preview_title, + preview_description, + preview_image, sticker, story_timestamp, story_author, + edit_timestamp, ) .await } - cli::CliCommands::SendContacts => client.send_contacts(cli.account).await, - cli::CliCommands::SendPaymentNotification { + CliCommands::SendContacts => client.send_contacts(cli.account).await, + CliCommands::SendPaymentNotification { recipient, receipt, note, @@ -176,7 +199,7 @@ async fn handle_command( .send_payment_notification(cli.account, recipient, receipt, note) .await } - cli::CliCommands::SendReaction { + CliCommands::SendReaction { recipient, group_id, note_to_self, @@ -200,7 +223,7 @@ async fn handle_command( ) .await } - cli::CliCommands::SendReceipt { + CliCommands::SendReceipt { recipient, target_timestamp, r#type, @@ -217,8 +240,8 @@ async fn handle_command( ) .await } - cli::CliCommands::SendSyncRequest => client.send_sync_request(cli.account).await, - cli::CliCommands::SendTyping { + CliCommands::SendSyncRequest => client.send_sync_request(cli.account).await, + CliCommands::SendTyping { recipient, group_id, stop, @@ -227,13 +250,13 @@ async fn handle_command( .send_typing(cli.account, recipient, group_id, stop) .await } - cli::CliCommands::SetPin { pin } => client.set_pin(cli.account, pin).await, - cli::CliCommands::SubmitRateLimitChallenge { challenge, captcha } => { + CliCommands::SetPin { pin } => client.set_pin(cli.account, pin).await, + CliCommands::SubmitRateLimitChallenge { challenge, captcha } => { client .submit_rate_limit_challenge(cli.account, challenge, captcha) .await } - cli::CliCommands::Trust { + CliCommands::Trust { recipient, trust_all_known_keys, verified_safety_number, @@ -247,17 +270,30 @@ async fn handle_command( ) .await } - cli::CliCommands::Unblock { + CliCommands::Unblock { recipient, group_id, } => client.unblock(cli.account, recipient, group_id).await, - cli::CliCommands::Unregister { delete_account } => { + CliCommands::Unregister { delete_account } => { client.unregister(cli.account, delete_account).await } - cli::CliCommands::UpdateAccount { device_name } => { - client.update_account(cli.account, device_name).await + CliCommands::UpdateAccount { + device_name, + unrestricted_unidentified_sender, + discoverable_by_number, + number_sharing, + } => { + client + .update_account( + cli.account, + device_name, + unrestricted_unidentified_sender, + discoverable_by_number, + number_sharing, + ) + .await } - cli::CliCommands::UpdateConfiguration { + CliCommands::UpdateConfiguration { read_receipts, unidentified_delivery_indicators, typing_indicators, @@ -273,7 +309,7 @@ async fn handle_command( ) .await } - cli::CliCommands::UpdateContact { + CliCommands::UpdateContact { recipient, expiration, name, @@ -282,7 +318,7 @@ async fn handle_command( .update_contact(cli.account, recipient, name, expiration) .await } - cli::CliCommands::UpdateGroup { + CliCommands::UpdateGroup { group_id, name, description, @@ -335,7 +371,7 @@ async fn handle_command( ) .await } - cli::CliCommands::UpdateProfile { + CliCommands::UpdateProfile { given_name, family_name, about, @@ -357,14 +393,72 @@ async fn handle_command( ) .await } - cli::CliCommands::UploadStickerPack { path } => { + CliCommands::UploadStickerPack { path } => { client.upload_sticker_pack(cli.account, path).await } - cli::CliCommands::Verify { + CliCommands::Verify { verification_code, pin, } => client.verify(cli.account, verification_code, pin).await, - cli::CliCommands::Version => client.version().await, + CliCommands::Version => client.version().await, + CliCommands::AddStickerPack { uri } => client.add_sticker_pack(cli.account, uri).await, + CliCommands::FinishChangeNumber { + number, + verification_code, + pin, + } => { + client + .finish_change_number(cli.account, number, verification_code, pin) + .await + } + CliCommands::GetAttachment { + id, + recipient, + group_id, + } => { + client + .get_attachment(cli.account, id, recipient, group_id) + .await + } + CliCommands::GetAvatar { + contact, + profile, + group_id, + } => { + client + .get_avatar(cli.account, contact, profile, group_id) + .await + } + CliCommands::GetSticker { + pack_id, + sticker_id, + } => client.get_sticker(cli.account, pack_id, sticker_id).await, + CliCommands::StartChangeNumber { + number, + voice, + captcha, + } => { + client + .start_change_number(cli.account, number, voice, captcha) + .await + } + CliCommands::SendMessageRequestResponse { + recipient, + group_id, + r#type, + } => { + client + .send_message_request_response( + cli.account, + recipient, + group_id, + match r#type { + cli::MessageRequestResponseType::Accept => "accept".to_owned(), + cli::MessageRequestResponseType::Delete => "delete".to_owned(), + }, + ) + .await + } } } @@ -388,30 +482,37 @@ async fn connect(cli: Cli) -> Result { handle_command(cli, client).await } else { - let socket_path = cli - .json_rpc_socket - .clone() - .unwrap_or(None) - .or_else(|| { - std::env::var_os("XDG_RUNTIME_DIR").map(|runtime_dir| { - PathBuf::from(runtime_dir) - .join(DEFAULT_SOCKET_SUFFIX) - .into() + #[cfg(windows)] + { + Err(RpcError::Custom("Invalid socket".into())) + } + #[cfg(unix)] + { + let socket_path = cli + .json_rpc_socket + .clone() + .unwrap_or(None) + .or_else(|| { + std::env::var_os("XDG_RUNTIME_DIR").map(|runtime_dir| { + PathBuf::from(runtime_dir) + .join(DEFAULT_SOCKET_SUFFIX) + .into() + }) }) - }) - .unwrap_or_else(|| ("/run".to_owned() + DEFAULT_SOCKET_SUFFIX).into()); - let client = jsonrpc::connect_unix(socket_path) - .await - .map_err(|e| RpcError::Custom(format!("Failed to connect to socket: {e}")))?; + .unwrap_or_else(|| ("/run".to_owned() + DEFAULT_SOCKET_SUFFIX).into()); + let client = jsonrpc::connect_unix(socket_path) + .await + .map_err(|e| RpcError::Custom(format!("Failed to connect to socket: {e}")))?; - handle_command(cli, client).await + handle_command(cli, client).await + } } } async fn stream_next( timeout: f64, stream: &mut Subscription, -) -> Option> { +) -> Option> { if timeout < 0.0 { stream.next().await } else {