mostro_client/cli/
get_dm_user.rs1use 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 let mut trade_keys_hex = Order::get_all_trade_keys(&ctx.pool).await?;
14
15 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 trade_keys_hex.sort();
22 trade_keys_hex.dedup();
23
24 if trade_keys_hex.is_empty() {
26 println!("No trade keys found in orders");
27 return Ok(());
28 }
29
30 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 let mut dm_events: Vec<(Message, u64, PublicKey)> = Vec::new();
48 if direct_messages.is_empty() {
50 println!("You don't have any direct messages in your trade keys");
51 return Ok(());
52 }
53 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}