mostro_client/cli/
send_dm.rs

1use crate::cli::Context;
2use crate::parser::common::{
3    create_emoji_field_row, create_field_value_header, create_standard_table,
4};
5use crate::{db::Order, util::send_dm};
6use anyhow::Result;
7use mostro_core::prelude::*;
8use nostr_sdk::prelude::*;
9use uuid::Uuid;
10
11pub async fn execute_send_dm(
12    receiver: PublicKey,
13    ctx: &Context,
14    order_id: &Uuid,
15    message: &str,
16) -> Result<()> {
17    println!("💬 Send Direct Message");
18    println!("═══════════════════════════════════════");
19    let mut table = create_standard_table();
20    table.set_header(create_field_value_header());
21    table.add_row(create_emoji_field_row(
22        "📋 ",
23        "Order ID",
24        &order_id.to_string(),
25    ));
26    table.add_row(create_emoji_field_row(
27        "🎯 ",
28        "Recipient",
29        &receiver.to_string(),
30    ));
31    table.add_row(create_emoji_field_row("💬 ", "Message", message));
32    println!("{table}");
33    println!("💡 Sending direct message...\n");
34
35    let message = Message::new_dm(
36        None,
37        None,
38        Action::SendDm,
39        Some(Payload::TextMessage(message.to_string())),
40    )
41    .as_json()
42    .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
43
44    let trade_keys =
45        if let Ok(order_to_vote) = Order::get_by_id(&ctx.pool, &order_id.to_string()).await {
46            match order_to_vote.trade_keys.as_ref() {
47                Some(trade_keys) => Keys::parse(trade_keys)?,
48                None => {
49                    anyhow::bail!("No trade_keys found for this order");
50                }
51            }
52        } else {
53            return Err(anyhow::anyhow!("order {} not found", order_id));
54        };
55
56    send_dm(
57        &ctx.client,
58        None,
59        &trade_keys,
60        &receiver,
61        message,
62        None,
63        false,
64    )
65    .await?;
66
67    println!("✅ Direct message sent successfully!");
68
69    Ok(())
70}