From: AsamK Date: Tue, 30 Jan 2024 17:52:43 +0000 (+0100) Subject: Add missing command to json-rpc client X-Git-Tag: v0.13.0~34 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/15c9d047033f2dd64a677aca8139a3ecd34e9472 Add missing command to json-rpc client --- diff --git a/client/src/cli.rs b/client/src/cli.rs index 0b513268..dea3a7df 100644 --- a/client/src/cli.rs +++ b/client/src/cli.rs @@ -1,9 +1,10 @@ -use clap::{crate_version, Parser, Subcommand, ValueEnum}; use std::{ffi::OsString, net::SocketAddr}; +use clap::{crate_version, Parser, Subcommand, ValueEnum}; + /// JSON-RPC client for signal-cli #[derive(Parser, Debug)] -#[command(rename_all = "kebab-case", version=crate_version!())] +#[command(rename_all = "kebab-case", version = crate_version!())] pub struct Cli { /// Account to use (for daemon in multi-account mode) #[arg(short = 'a', long)] @@ -21,9 +22,6 @@ pub struct Cli { #[arg(long, conflicts_with = "json_rpc_socket")] pub json_rpc_http: Option>, - #[arg(value_enum, long, default_value_t = OutputTypes::Json)] - pub output: OutputTypes, - #[arg(long)] pub verbose: bool, @@ -31,21 +29,18 @@ pub struct Cli { pub command: CliCommands, } -#[derive(ValueEnum, Clone, Debug)] -#[value(rename_all = "kebab-case")] -pub enum OutputTypes { - PlainText, - Json, -} - #[allow(clippy::large_enum_variant)] #[derive(Subcommand, Debug)] -#[command(rename_all = "camelCase", version=crate_version!())] +#[command(rename_all = "camelCase", version = crate_version!())] pub enum CliCommands { AddDevice { #[arg(long)] uri: String, }, + AddStickerPack { + #[arg(long)] + uri: String, + }, #[command(rename_all = "kebab-case")] Block { recipient: Vec, @@ -57,6 +52,22 @@ pub enum CliCommands { #[arg(long = "ignore-registered")] ignore_registered: Option, }, + FinishChangeNumber { + number: String, + #[arg(short = 'v', long = "verification-code")] + verification_code: String, + + #[arg(short = 'p', long)] + pin: Option, + }, + GetAttachment { + #[arg(long)] + id: String, + #[arg(long)] + recipient: Option, + #[arg(short = 'g', long = "group-id")] + group_id: Option, + }, GetUserStatus { recipient: Vec, }, @@ -112,6 +123,8 @@ pub enum CliCommands { recipient: String, #[arg(long)] forget: bool, + #[arg(long)] + hide: bool, }, RemoveDevice { #[arg(short = 'd', long = "device-id")] @@ -152,6 +165,9 @@ pub enum CliCommands { #[arg(long)] mention: Vec, + #[arg(long)] + text_style: Vec, + #[arg(long)] quote_timestamp: Option, @@ -164,9 +180,24 @@ pub enum CliCommands { #[arg(long)] quote_mention: Vec, + #[arg(long)] + quote_text_style: Vec, + #[arg(long)] quote_attachment: Vec, + #[arg(long)] + preview_url: Option, + + #[arg(long)] + preview_title: Option, + + #[arg(long)] + preview_description: Option, + + #[arg(long)] + preview_image: Option, + #[arg(long)] sticker: Option, @@ -175,6 +206,9 @@ pub enum CliCommands { #[arg(long)] story_author: Option, + + #[arg(long)] + edit_timestamp: Option, }, SendContacts, SendPaymentNotification { @@ -232,6 +266,13 @@ pub enum CliCommands { SetPin { pin: String, }, + StartChangeNumber { + number: String, + #[arg(short = 'v', long)] + voice: bool, + #[arg(long)] + captcha: Option, + }, SubmitRateLimitChallenge { challenge: String, captcha: String, @@ -259,6 +300,8 @@ pub enum CliCommands { UpdateAccount { #[arg(short = 'n', long = "device-name")] device_name: Option, + #[arg(long = "unrestricted-unidentified-sender")] + unrestricted_unidentified_sender: Option, }, UpdateConfiguration { #[arg(long = "read-receipts")] diff --git a/client/src/jsonrpc.rs b/client/src/jsonrpc.rs index e3031bf3..3a117ff4 100644 --- a/client/src/jsonrpc.rs +++ b/client/src/jsonrpc.rs @@ -18,6 +18,13 @@ pub trait Rpc { uri: String, ) -> Result; + #[method(name = "addStickerPack", param_kind = map)] + async fn add_sticker_pack( + &self, + account: Option, + uri: String, + ) -> Result; + #[method(name = "block", param_kind = map)] fn block( &self, @@ -33,6 +40,15 @@ pub trait Rpc { #[allow(non_snake_case)] ignoreRegistered: Option, ) -> Result; + #[method(name = "getAttachment", param_kind = map)] + fn get_attachment( + &self, + account: Option, + id: String, + recipient: Option, + group_id: Option, + ) -> Result; + #[method(name = "getUserStatus", param_kind = map)] fn get_user_status( &self, @@ -43,6 +59,16 @@ pub trait Rpc { #[method(name = "joinGroup", param_kind = map)] fn join_group(&self, account: Option, uri: String) -> Result; + #[allow(non_snake_case)] + #[method(name = "finishChangeNumber", param_kind = map)] + fn finish_change_number( + &self, + account: Option, + number: String, + verificationCode: String, + pin: Option, + ) -> Result; + #[method(name = "finishLink", param_kind = map)] fn finish_link( &self, @@ -106,6 +132,7 @@ pub trait Rpc { account: Option, recipient: String, forget: bool, + hide: bool, ) -> Result; #[method(name = "removeDevice", param_kind = map)] @@ -128,25 +155,33 @@ pub trait Rpc { #[allow(non_snake_case)] noteToSelf: bool, ) -> Result; + #[allow(non_snake_case)] #[method(name = "send", param_kind = map)] fn send( &self, account: Option, recipients: Vec, - #[allow(non_snake_case)] groupIds: Vec, - #[allow(non_snake_case)] noteToSelf: bool, - #[allow(non_snake_case)] endSession: bool, + groupIds: Vec, + noteToSelf: bool, + endSession: bool, message: String, attachments: Vec, mentions: Vec, - #[allow(non_snake_case)] quoteTimestamp: Option, - #[allow(non_snake_case)] quoteAuthor: Option, - #[allow(non_snake_case)] quoteMessage: Option, - #[allow(non_snake_case)] quoteMention: Vec, - #[allow(non_snake_case)] quoteAttachment: Vec, + textStyle: Vec, + quoteTimestamp: Option, + quoteAuthor: Option, + quoteMessage: Option, + quoteMention: Vec, + quoteTextStyle: Vec, + quoteAttachment: Vec, + preview_url: Option, + preview_title: Option, + preview_description: Option, + preview_image: Option, sticker: Option, - #[allow(non_snake_case)] storyTimestamp: Option, - #[allow(non_snake_case)] storyAuthor: Option, + storyTimestamp: Option, + storyAuthor: Option, + editTimestamp: Option, ) -> Result; #[method(name = "sendContacts", param_kind = map)] @@ -207,6 +242,15 @@ pub trait Rpc { captcha: String, ) -> Result; + #[method(name = "startChangeNumber", param_kind = map)] + fn start_change_number( + &self, + account: Option, + number: String, + voice: bool, + captcha: Option, + ) -> Result; + #[method(name = "startLink", param_kind = map)] fn start_link(&self, account: Option) -> Result; @@ -234,18 +278,20 @@ pub trait Rpc { #[allow(non_snake_case)] deleteAccount: bool, ) -> Result; + #[allow(non_snake_case)] #[method(name = "updateAccount", param_kind = map)] fn update_account( &self, account: Option, - #[allow(non_snake_case)] deviceName: Option, + deviceName: Option, + unrestrictedUnidentifiedSender: Option, ) -> Result; #[method(name = "updateConfiguration", param_kind = map)] fn update_configuration( &self, account: Option, - #[allow(non_snake_case)] readReceiptes: Option, + #[allow(non_snake_case)] readReceipts: Option, #[allow(non_snake_case)] unidentifiedDeliveryIndicators: Option, #[allow(non_snake_case)] typingIndicators: Option, #[allow(non_snake_case)] linkPreviews: Option, diff --git a/client/src/main.rs b/client/src/main.rs index 958d9d9f..03aff481 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -1,13 +1,14 @@ 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 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 +39,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,21 +51,21 @@ 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 } => { + CliCommands::GetUserStatus { recipient } => { client.get_user_status(cli.account, recipient).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 @@ -73,8 +74,8 @@ async fn handle_command( 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 +85,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 +101,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 +133,7 @@ async fn handle_command( ) .await } - cli::CliCommands::Send { + CliCommands::Send { recipient, group_id, note_to_self, @@ -136,14 +141,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 +167,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 +195,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 +219,7 @@ async fn handle_command( ) .await } - cli::CliCommands::SendReceipt { + CliCommands::SendReceipt { recipient, target_timestamp, r#type, @@ -217,8 +236,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 +246,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 +266,22 @@ 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, + } => { + client + .update_account(cli.account, device_name, unrestricted_unidentified_sender) + .await } - cli::CliCommands::UpdateConfiguration { + CliCommands::UpdateConfiguration { read_receipts, unidentified_delivery_indicators, typing_indicators, @@ -273,7 +297,7 @@ async fn handle_command( ) .await } - cli::CliCommands::UpdateContact { + CliCommands::UpdateContact { recipient, expiration, name, @@ -282,7 +306,7 @@ async fn handle_command( .update_contact(cli.account, recipient, name, expiration) .await } - cli::CliCommands::UpdateGroup { + CliCommands::UpdateGroup { group_id, name, description, @@ -335,7 +359,7 @@ async fn handle_command( ) .await } - cli::CliCommands::UpdateProfile { + CliCommands::UpdateProfile { given_name, family_name, about, @@ -357,14 +381,42 @@ 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::StartChangeNumber { + number, + voice, + captcha, + } => { + client + .start_change_number(cli.account, number, voice, captcha) + .await + } } }