mostro_client/cli/
get_dm_user.rs

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