mostro_client/cli/
get_dm.rs1use std::collections::HashSet;
2
3use anyhow::Result;
4use chrono::DateTime;
5use mostro_core::message::{Action, Message, Payload};
6use nostr_sdk::prelude::*;
7use uuid::Uuid;
8
9use crate::{
10 db::{connect, Order, User},
11 util::{get_direct_messages, send_message_sync},
12};
13
14pub async fn execute_get_dm(
15 since: &i64,
16 identity_keys: Keys,
17 trade_keys: Keys,
18 trade_index: i64,
19 mostro_key: PublicKey,
20 client: &Client,
21 from_user: bool,
22) -> Result<()> {
23 let mut dm: Vec<(Message, u64)> = Vec::new();
24 let pool = connect().await?;
25 let orders = Order::get_all(&pool).await.unwrap();
26 let trade_keys_hex = trade_keys.secret_key().to_secret_hex();
27 let order_trade_keys = orders
28 .iter()
29 .filter_map(|order| order.trade_keys.as_ref().cloned())
30 .collect::<Vec<String>>();
31 let mut unique_trade_keys = order_trade_keys
32 .iter()
33 .cloned()
34 .collect::<HashSet<String>>();
35 unique_trade_keys.insert(trade_keys_hex);
36 let final_trade_keys = unique_trade_keys.iter().cloned().collect::<Vec<String>>();
37 for keys in final_trade_keys.iter() {
38 let trade_keys =
39 Keys::parse(keys).map_err(|e| anyhow::anyhow!("Failed to parse trade keys: {}", e))?;
40 let dm_temp = get_direct_messages(client, &trade_keys, *since, from_user).await;
41 dm.extend(dm_temp);
42 }
43
44 if dm.is_empty() {
45 println!();
46 println!("No new messages");
47 println!();
48 } else {
49 for m in dm.iter() {
50 let message = m.0.get_inner_message_kind();
51 let date = DateTime::from_timestamp(m.1 as i64, 0).unwrap();
52 if message.id.is_some() {
53 println!(
54 "Mostro sent you this message for order id: {} at {}",
55 m.0.get_inner_message_kind().id.unwrap(),
56 date
57 );
58 }
59 if let Some(payload) = &message.payload {
60 match payload {
61 Payload::PaymentRequest(_, inv, _) => {
62 println!();
63 println!("Pay this invoice to continue --> {}", inv);
64 println!();
65 }
66 Payload::TextMessage(text) => {
67 println!();
68 println!("{text}");
69 println!();
70 }
71 Payload::CantDo(Some(cant_do_reason)) => {
72 println!();
73 println!("Error: {:?}", cant_do_reason);
74 println!();
75 }
76 Payload::Order(new_order) if message.action == Action::NewOrder => {
77 let db_order =
78 Order::get_by_id(&pool, &new_order.id.unwrap().to_string()).await;
79 if db_order.is_err() {
80 let _ = Order::new(&pool, new_order.clone(), &trade_keys, None)
81 .await
82 .map_err(|e| {
83 anyhow::anyhow!("Failed to create DB order: {:?}", e)
84 })?;
85 match User::get(&pool).await {
87 Ok(mut user) => {
88 user.set_last_trade_index(trade_index);
89 if let Err(e) = user.save(&pool).await {
90 println!("Failed to update user: {}", e);
91 }
92 }
93 Err(e) => println!("Failed to get user: {}", e),
94 }
95 let request_id = Uuid::new_v4().as_u128() as u64;
96 let message = Message::new_order(
99 Some(new_order.id.unwrap()),
100 Some(request_id),
101 Some(trade_index),
102 Action::TradePubkey,
103 None,
104 );
105 let _ = send_message_sync(
106 client,
107 Some(&identity_keys),
108 &trade_keys,
109 mostro_key,
110 message,
111 false,
112 false,
113 )
114 .await?;
115 }
116 println!();
117 println!("Order: {:#?}", new_order);
118 println!();
119 }
120 _ => {
121 println!();
122 println!("Action: {}", message.action);
123 println!("Payload: {:#?}", message.payload);
124 println!();
125 }
126 }
127 } else {
128 println!();
129 println!("Action: {}", message.action);
130 println!("Payload: {:#?}", message.payload);
131 println!();
132 }
133 }
134 }
135 Ok(())
136}