mostro_client/cli/
get_dm.rs

1use anyhow::Result;
2use mostro_core::prelude::Message;
3use nostr_sdk::prelude::*;
4
5use crate::{
6    cli::Context,
7    parser::common::{print_key_value, print_section_header},
8    parser::dms::print_direct_messages,
9    util::{fetch_events_list, Event, ListKind},
10};
11
12pub async fn execute_get_dm(
13    since: &i64,
14    admin: bool,
15    from_user: &bool,
16    ctx: &Context,
17) -> Result<()> {
18    print_section_header("📨 Fetch Direct Messages");
19    print_key_value("👤", "Admin Mode", if admin { "Yes" } else { "No" });
20    print_key_value("📤", "From User", if *from_user { "Yes" } else { "No" });
21    print_key_value("⏰", "Since", &format!("{} minutes ago", since));
22    print_key_value("💡", "Action", "Fetching direct messages...");
23    println!();
24
25    // Get the list kind
26    let list_kind = match (admin, from_user) {
27        (true, true) => ListKind::PrivateDirectMessagesUser,
28        (true, false) => ListKind::DirectMessagesAdmin,
29        (false, true) => ListKind::PrivateDirectMessagesUser,
30        (false, false) => ListKind::DirectMessagesUser,
31    };
32
33    // Fetch the requested events
34    let all_fetched_events =
35        fetch_events_list(list_kind, None, None, None, ctx, Some(since)).await?;
36
37    // Extract (Message, u64) tuples from Event::MessageTuple variants
38    let mut dm_events: Vec<(Message, u64, PublicKey)> = Vec::new();
39    for event in all_fetched_events {
40        if let Event::MessageTuple(tuple) = event {
41            dm_events.push(*tuple);
42        }
43    }
44
45    print_direct_messages(&dm_events, Some(ctx.mostro_pubkey)).await?;
46    Ok(())
47}