mostro_client/cli/
get_dm_user.rs

1use crate::cli::Context;
2use crate::db::Order;
3use crate::util::{fetch_events_list, Event, ListKind};
4use anyhow::Result;
5use comfy_table::modifiers::UTF8_ROUND_CORNERS;
6use comfy_table::presets::UTF8_FULL;
7use comfy_table::Table;
8use mostro_core::prelude::*;
9use nostr_sdk::prelude::*;
10
11pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
12    // Get all trade keys from orders
13    let mut trade_keys_hex = Order::get_all_trade_keys(&ctx.pool).await?;
14
15    // Include admin pubkey so we also fetch messages sent TO admin
16    let admin_pubkey_hex = ctx.mostro_pubkey.to_hex();
17    if !trade_keys_hex.iter().any(|k| k == &admin_pubkey_hex) {
18        trade_keys_hex.push(admin_pubkey_hex);
19    }
20    // De-duplicate any repeated keys coming from DB/admin
21    trade_keys_hex.sort();
22    trade_keys_hex.dedup();
23
24    // Check if the trade keys are empty
25    if trade_keys_hex.is_empty() {
26        println!("No trade keys found in orders");
27        return Ok(());
28    }
29
30    // Print the number of trade keys
31    println!(
32        "Searching for DMs in {} trade keys...",
33        trade_keys_hex.len()
34    );
35
36    let direct_messages = fetch_events_list(
37        ListKind::DirectMessagesUser,
38        None,
39        None,
40        None,
41        ctx,
42        Some(since),
43    )
44    .await?;
45
46    // Extract (Message, u64) tuples from Event::MessageTuple variants
47    let mut dm_events: Vec<(Message, u64, PublicKey)> = Vec::new();
48    // Check if the direct messages are empty
49    if direct_messages.is_empty() {
50        println!("You don't have any direct messages in your trade keys");
51        return Ok(());
52    }
53    // Extract the direct messages
54    for event in direct_messages {
55        if let Event::MessageTuple(tuple) = event {
56            dm_events.push(*tuple);
57        }
58    }
59
60    let mut table = Table::new();
61    table
62        .load_preset(UTF8_FULL)
63        .apply_modifier(UTF8_ROUND_CORNERS)
64        .set_content_arrangement(comfy_table::ContentArrangement::Dynamic)
65        .set_header(vec!["Time", "From", "Message"]);
66
67    for (message, created_at, sender_pubkey) in dm_events.iter() {
68        let datetime = chrono::DateTime::from_timestamp(*created_at as i64, 0);
69        let formatted_date = match datetime {
70            Some(dt) => dt.format("%Y-%m-%d %H:%M:%S").to_string(),
71            None => "Invalid timestamp".to_string(),
72        };
73
74        let inner = message.get_inner_message_kind();
75        let message_str = match &inner.payload {
76            Some(Payload::TextMessage(text)) => text.clone(),
77            _ => format!("{:?}", message),
78        };
79
80        let sender_hex = sender_pubkey.to_hex();
81
82        table.add_row(vec![&formatted_date, &sender_hex, &message_str]);
83    }
84
85    println!("{table}");
86    println!();
87    Ok(())
88}