diff --git a/Cargo.lock b/Cargo.lock index 879f731..0cec74a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1522,7 +1522,7 @@ dependencies = [ [[package]] name = "mostro-cli" -version = "0.10.5" +version = "0.10.6" dependencies = [ "anyhow", "bip39", @@ -1550,9 +1550,9 @@ dependencies = [ [[package]] name = "mostro-core" -version = "0.6.16" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfa673ea01ea2e91bcfc8fa4c6557afb1f8c9795ee909ff1776ff686f6fb26b8" +checksum = "d2707fa1318b15013af06d2314f073353977e56935bb697cb2e462d1cfcade66" dependencies = [ "anyhow", "bitcoin 0.32.5", diff --git a/Cargo.toml b/Cargo.toml index 8c4db86..3be54f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mostro-cli" -version = "0.10.5" +version = "0.10.6" edition = "2021" license = "MIT" authors = [ @@ -39,7 +39,7 @@ uuid = { version = "1.3.0", features = [ dotenvy = "0.15.6" lightning-invoice = "0.23.0" reqwest = { version = "0.12.4", features = ["json"] } -mostro-core = "0.6.16" +mostro-core = "0.6.17" bitcoin_hashes = "0.15.0" lnurl-rs = "0.9.0" pretty_env_logger = "0.5.0" diff --git a/src/cli/add_invoice.rs b/src/cli/add_invoice.rs index d141318..fe29685 100644 --- a/src/cli/add_invoice.rs +++ b/src/cli/add_invoice.rs @@ -39,9 +39,7 @@ pub async fn execute_add_invoice( } // Create AddInvoice message let add_invoice_message = - Message::new_order(Some(*order_id), None, None, Action::AddInvoice, payload) - .as_json() - .unwrap(); + Message::new_order(Some(*order_id), None, None, Action::AddInvoice, payload); send_message_sync( client, diff --git a/src/cli/new_order.rs b/src/cli/new_order.rs index 1c932cd..32706ee 100644 --- a/src/cli/new_order.rs +++ b/src/cli/new_order.rs @@ -121,19 +121,17 @@ pub async fn execute_new_order( Some(trade_index), Action::NewOrder, Some(order_content), - ) - .as_json() - .unwrap(); + ); // Create order in db let pool = connect().await?; - Order::new(&pool, small_order, trade_keys, Some(request_id as i64)) + let db_order = Order::new(&pool, small_order, trade_keys, Some(request_id as i64)) .await .unwrap(); // Update last trade index let mut user = User::get(&pool).await.unwrap(); user.set_last_trade_index(trade_index); user.save(&pool).await.unwrap(); - send_message_sync( + let dm = send_message_sync( client, Some(identity_keys), trade_keys, @@ -143,5 +141,24 @@ pub async fn execute_new_order( false, ) .await?; + let order_id = dm.iter() + .find_map(|el| { + let message = el.0.get_inner_message_kind(); + message.request_id + .filter(|&id| id == request_id) + .and_then(|_| message.payload.as_ref()) + .and_then(|payload| { + if let Payload::Order(order) = payload { + order.id + } else { + None + } + }) + }) + .ok_or_else(|| anyhow::anyhow!("No matching order found in response"))?; + + println!("Order id {} created", order_id); + Order::save_new_id(&pool, db_order.id.clone().ok_or_else(|| anyhow::anyhow!("Missing order id"))?, order_id.to_string()) + .await?; Ok(()) } diff --git a/src/cli/rate_user.rs b/src/cli/rate_user.rs index 6401f47..7625991 100644 --- a/src/cli/rate_user.rs +++ b/src/cli/rate_user.rs @@ -31,9 +31,7 @@ pub async fn execute_rate_user( None, Action::RateUser, Some(rating_content), - ) - .as_json() - .unwrap(); + ); send_message_sync( client, diff --git a/src/cli/send_dm.rs b/src/cli/send_dm.rs index 1180876..9c9482d 100644 --- a/src/cli/send_dm.rs +++ b/src/cli/send_dm.rs @@ -1,5 +1,6 @@ use crate::util::send_message_sync; use anyhow::Result; +use mostro_core::message::{Action, Message, Payload}; use nostr_sdk::prelude::*; pub async fn execute_send_dm( @@ -8,16 +9,13 @@ pub async fn execute_send_dm( client: &Client, message: &str, ) -> Result<()> { - send_message_sync( - client, + let message = Message::new_dm( None, - trade_keys, - receiver, - message.to_string(), - true, - true, - ) - .await?; + None, + Action::SendDm, + Some(Payload::TextMessage(message.to_string())), + ); + send_message_sync(client, None, trade_keys, receiver, message, true, true).await?; Ok(()) } diff --git a/src/cli/send_msg.rs b/src/cli/send_msg.rs index 242aed1..f29551a 100644 --- a/src/cli/send_msg.rs +++ b/src/cli/send_msg.rs @@ -44,9 +44,7 @@ pub async fn execute_send_msg( } // Create message - let message = Message::new_order(order_id, None, None, requested_action, payload) - .as_json() - .unwrap(); + let message = Message::new_order(order_id, None, None, requested_action, payload); info!("Sending message: {:#?}", message); let pool = connect().await?; diff --git a/src/cli/take_buy.rs b/src/cli/take_buy.rs index 7db7b1d..731cc37 100644 --- a/src/cli/take_buy.rs +++ b/src/cli/take_buy.rs @@ -30,9 +30,7 @@ pub async fn execute_take_buy( Some(trade_index), Action::TakeBuy, payload, - ) - .as_json() - .unwrap(); + ); send_message_sync( client, diff --git a/src/cli/take_dispute.rs b/src/cli/take_dispute.rs index 36cfb7c..5189baf 100644 --- a/src/cli/take_dispute.rs +++ b/src/cli/take_dispute.rs @@ -24,9 +24,7 @@ pub async fn execute_take_dispute( None, Action::AdminTakeDispute, None, - ) - .as_json() - .unwrap(); + ); send_message_sync( client, diff --git a/src/cli/take_sell.rs b/src/cli/take_sell.rs index 473c570..bb7798b 100644 --- a/src/cli/take_sell.rs +++ b/src/cli/take_sell.rs @@ -56,9 +56,7 @@ pub async fn execute_take_sell( Some(trade_index), Action::TakeSell, payload, - ) - .as_json() - .unwrap(); + ); send_message_sync( client, diff --git a/src/db.rs b/src/db.rs index b56622c..227aaf9 100644 --- a/src/db.rs +++ b/src/db.rs @@ -387,6 +387,27 @@ impl Order { Ok(()) } + pub async fn save_new_id( + pool: &SqlitePool, + id: String, + new_id: String, + ) -> anyhow::Result { + let rows_affected = sqlx::query( + r#" + UPDATE orders + SET id = ? + WHERE id = ? + "#, + ) + .bind(&new_id) + .bind(&id) + .execute(pool) + .await? + .rows_affected(); + + Ok(rows_affected > 0) + } + pub async fn get_by_id( pool: &SqlitePool, id: &str, diff --git a/src/util.rs b/src/util.rs index 7d4df88..47dfa68 100644 --- a/src/util.rs +++ b/src/util.rs @@ -13,6 +13,7 @@ use mostro_core::order::{SmallOrder, Status}; use mostro_core::NOSTR_REPLACEABLE_EVENT_KIND; use nip44::v2::{decrypt_to_bytes, encrypt_to_bytes, ConversationKey}; use nostr_sdk::prelude::*; +use std::thread::sleep; use std::time::Duration; use std::{fs, path::Path}; use tokio::time::timeout; @@ -80,58 +81,46 @@ pub async fn send_message_sync( identity_keys: Option<&Keys>, trade_keys: &Keys, receiver_pubkey: PublicKey, - message: String, + message: Message, wait_for_dm_ans: bool, to_user: bool, -) -> Result<()> { +) -> Result> { + let mut dm: Vec<(Message, u64)> = Vec::new(); + let message_json = message.as_json()?; // Send dm to receiver pubkey + println!( + "SENDING DM with trade keys: {:?}", + trade_keys.public_key().to_hex() + ); send_dm( client, identity_keys, trade_keys, &receiver_pubkey, - message, + message_json, to_user, ) .await?; - - let mut notifications = client.notifications(); - while let Ok(notification) = notifications.recv().await { - if wait_for_dm_ans { - let dm = get_direct_messages(client, trade_keys, 1, to_user).await; - println!("DM: {:#?}", dm); - for el in dm.iter() { - if let Some(Payload::PaymentRequest(ord, inv, _)) = - &el.0.get_inner_message_kind().payload - { - println!("NEW MESSAGE:"); - println!( - "Mostro sent you this hold invoice for order id: {}", - ord.as_ref().unwrap().id.unwrap() - ); - println!(); - println!("Pay this invoice to continue --> {}", inv); - println!(); - } + sleep(Duration::from_secs(1)); + + if wait_for_dm_ans { + dm = get_direct_messages(client, trade_keys, 1, to_user).await; + for el in dm.iter() { + if let Some(Payload::PaymentRequest(ord, inv, _)) = + &el.0.get_inner_message_kind().payload + { + println!("NEW MESSAGE:"); + println!( + "Mostro sent you this hold invoice for order id: {}", + ord.as_ref().unwrap().id.unwrap() + ); + println!(); + println!("Pay this invoice to continue --> {}", inv); + println!(); } - break; - } else if let RelayPoolNotification::Message { - message: - RelayMessage::Ok { - event_id: _, - status: _, - message: _, - }, - .. - } = notification - { - println!( - "Message correctly sent to Mostro! Check messages with getdm or listorders command" - ); - break; } } - Ok(()) + Ok(dm) } pub async fn requests_relay(