mostro_client/cli/
get_dm_user.rs

1use crate::cli::Context;
2use crate::db::Order;
3use crate::parser::common::{
4    print_info_line, print_key_value, print_no_data_message, print_section_header,
5};
6use crate::parser::dms::print_direct_messages;
7use crate::util::{fetch_events_list, Event, ListKind};
8use anyhow::Result;
9use mostro_core::prelude::*;
10use nostr_sdk::prelude::*;
11
12pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
13    // Get all trade keys from orders
14    let mut trade_keys_hex = Order::get_all_trade_keys(&ctx.pool).await?;
15
16    // Include admin pubkey so we also fetch messages sent TO admin
17    let admin_pubkey_hex = ctx.mostro_pubkey.to_hex();
18    if !trade_keys_hex.iter().any(|k| k == &admin_pubkey_hex) {
19        trade_keys_hex.push(admin_pubkey_hex);
20    }
21    // De-duplicate any repeated keys coming from DB/admin
22    trade_keys_hex.sort();
23    trade_keys_hex.dedup();
24
25    // Check if the trade keys are empty
26    if trade_keys_hex.is_empty() {
27        print_no_data_message("No trade keys found in orders");
28        return Ok(());
29    }
30
31    print_section_header("📨 Fetch User Direct Messages");
32    print_key_value(
33        "🔍",
34        "Searching for DMs in trade keys",
35        &format!("{}", trade_keys_hex.len()),
36    );
37    print_key_value("⏰", "Since", &format!("{} minutes ago", since));
38    print_info_line("💡", "Fetching direct messages...");
39    println!();
40
41    let direct_messages = fetch_events_list(
42        ListKind::DirectMessagesUser,
43        None,
44        None,
45        None,
46        ctx,
47        Some(since),
48    )
49    .await?;
50
51    // Extract (Message, u64) tuples from Event::MessageTuple variants
52    let mut dm_events: Vec<(Message, u64, PublicKey)> = Vec::new();
53    // Check if the direct messages are empty
54    if direct_messages.is_empty() {
55        print_no_data_message("You don't have any direct messages in your trade keys");
56        return Ok(());
57    }
58    // Extract the direct messages
59    for event in direct_messages {
60        if let Event::MessageTuple(tuple) = event {
61            dm_events.push(*tuple);
62        }
63    }
64
65    print_direct_messages(&dm_events, Some(ctx.mostro_pubkey)).await?;
66    Ok(())
67}