Skip to content

Commit 3fe4c33

Browse files
committed
feat: add rabbit fixes and improved other parts
1 parent 07e28ca commit 3fe4c33

10 files changed

Lines changed: 72 additions & 74 deletions

File tree

src/cli/get_dm.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use anyhow::Result;
22
use mostro_core::prelude::Message;
3+
use nostr_sdk::prelude::*;
34

45
use crate::{
56
cli::Context,
@@ -26,7 +27,7 @@ pub async fn execute_get_dm(
2627
fetch_events_list(list_kind, None, None, None, ctx, Some(since)).await?;
2728

2829
// Extract (Message, u64) tuples from Event::MessageTuple variants
29-
let mut dm_events: Vec<(Message, u64)> = Vec::new();
30+
let mut dm_events: Vec<(Message, u64, PublicKey)> = Vec::new();
3031
for event in all_fetched_events {
3132
if let Event::MessageTuple(tuple) = event {
3233
dm_events.push(*tuple);

src/cli/get_dm_user.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use crate::cli::Context;
2-
use crate::{db::Order, util::get_direct_messages_from_trade_keys};
2+
use crate::db::Order;
3+
use crate::util::{fetch_events_list, Event, ListKind};
34
use anyhow::Result;
45
use comfy_table::modifiers::UTF8_ROUND_CORNERS;
56
use comfy_table::presets::UTF8_FULL;
67
use comfy_table::Table;
78
use mostro_core::prelude::*;
9+
use nostr_sdk::prelude::*;
810

911
pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
1012
// Get all trade keys from orders
@@ -19,28 +21,41 @@ pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
1921
trade_keys_hex.sort();
2022
trade_keys_hex.dedup();
2123

24+
// Check if the trade keys are empty
2225
if trade_keys_hex.is_empty() {
2326
println!("No trade keys found in orders");
2427
return Ok(());
2528
}
2629

30+
// Print the number of trade keys
2731
println!(
2832
"Searching for DMs in {} trade keys...",
2933
trade_keys_hex.len()
3034
);
3135

32-
let direct_messages = get_direct_messages_from_trade_keys(
33-
&ctx.client,
34-
trade_keys_hex,
35-
*since,
36-
&ctx.mostro_pubkey,
36+
let direct_messages = fetch_events_list(
37+
ListKind::DirectMessagesUser,
38+
None,
39+
None,
40+
None,
41+
ctx,
42+
Some(since),
3743
)
3844
.await?;
3945

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
4049
if direct_messages.is_empty() {
4150
println!("You don't have any direct messages in your trade keys");
4251
return Ok(());
4352
}
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+
}
4459

4560
let mut table = Table::new();
4661
table
@@ -49,7 +64,7 @@ pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
4964
.set_content_arrangement(comfy_table::ContentArrangement::Dynamic)
5065
.set_header(vec!["Time", "From", "Message"]);
5166

52-
for (message, created_at, sender_pubkey) in direct_messages.iter() {
67+
for (message, created_at, sender_pubkey) in dm_events.iter() {
5368
let datetime = chrono::DateTime::from_timestamp(*created_at as i64, 0);
5469
let formatted_date = match datetime {
5570
Some(dt) => dt.format("%Y-%m-%d %H:%M:%S").to_string(),

src/cli/rate_user.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ use uuid::Uuid;
55

66
const RATING_BOUNDARIES: [u8; 5] = [1, 2, 3, 4, 5];
77

8-
use crate::{cli::Context, db::Order, util::send_dm};
8+
use crate::{
9+
cli::Context,
10+
db::Order,
11+
util::{print_dm_events, send_dm, wait_for_dm},
12+
};
913

1014
// Get the user rate
1115
fn get_user_rate(rating: &u8) -> Result<Payload> {
@@ -44,16 +48,23 @@ pub async fn execute_rate_user(order_id: &Uuid, rating: &u8, ctx: &Context) -> R
4448
.as_json()
4549
.map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
4650

47-
send_dm(
51+
let sent_message = send_dm(
4852
&ctx.client,
4953
Some(&ctx.identity_keys),
5054
&trade_keys,
5155
&ctx.mostro_pubkey,
5256
rate_message,
5357
None,
5458
false,
55-
)
56-
.await?;
59+
);
60+
61+
// Wait for incoming DM
62+
let recv_event = wait_for_dm(ctx, Some(&trade_keys), sent_message).await?;
63+
64+
// Parse the incoming DM
65+
// use a fake request id
66+
let fake_request_id = Uuid::new_v4().as_u128() as u64;
67+
print_dm_events(recv_event, fake_request_id, ctx, Some(&trade_keys)).await?;
5768

5869
Ok(())
5970
}

src/parser/dms.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,10 @@ pub async fn parse_dm_events(
316316
direct_messages
317317
}
318318

319-
pub async fn print_direct_messages(dm: &[(Message, u64)], pool: &SqlitePool) -> Result<()> {
319+
pub async fn print_direct_messages(
320+
dm: &[(Message, u64, PublicKey)],
321+
pool: &SqlitePool,
322+
) -> Result<()> {
320323
if dm.is_empty() {
321324
println!();
322325
println!("No new messages");

src/util/events.rs

Lines changed: 9 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,6 @@ const FAKE_SINCE: i64 = 2880;
1010

1111
use super::types::{Event, ListKind};
1212

13-
pub async fn get_direct_messages_from_trade_keys(
14-
client: &Client,
15-
trade_keys_hex: Vec<String>,
16-
since: i64,
17-
_mostro_pubkey: &PublicKey,
18-
) -> Result<Vec<(Message, u64, PublicKey)>> {
19-
if trade_keys_hex.is_empty() {
20-
return Ok(Vec::new());
21-
}
22-
23-
let since_time = chrono::Utc::now()
24-
.checked_sub_signed(chrono::Duration::minutes(since))
25-
.ok_or(anyhow::anyhow!("Failed to get since time"))?
26-
.timestamp();
27-
28-
let mut all_messages: Vec<(Message, u64, PublicKey)> = Vec::new();
29-
for trade_key_hex in trade_keys_hex {
30-
if let Ok(public_key) = PublicKey::from_hex(&trade_key_hex) {
31-
let filter =
32-
create_filter(ListKind::DirectMessagesUser, public_key, Some(&since_time))?;
33-
let events = client.fetch_events(filter, FETCH_EVENTS_TIMEOUT).await?;
34-
for event in events {
35-
if let Ok(message) = Message::from_json(&event.content) {
36-
if event.created_at.as_u64() < since as u64 {
37-
continue;
38-
}
39-
all_messages.push((message, event.created_at.as_u64(), event.pubkey));
40-
}
41-
}
42-
}
43-
}
44-
Ok(all_messages)
45-
}
46-
4713
fn create_fake_timestamp() -> Result<Timestamp> {
4814
let fake_since_time = chrono::Utc::now()
4915
.checked_sub_signed(chrono::Duration::minutes(FAKE_SINCE))
@@ -130,11 +96,13 @@ pub async fn fetch_events_list(
13096
parse_dm_events(fetched_events, &ctx.context_keys, since).await;
13197
Ok(direct_messages_mostro
13298
.into_iter()
133-
.map(|(message, timestamp, _)| Event::MessageTuple(Box::new((message, timestamp))))
99+
.map(|(message, timestamp, sender_pubkey)| {
100+
Event::MessageTuple(Box::new((message, timestamp, sender_pubkey)))
101+
})
134102
.collect())
135103
}
136104
ListKind::PrivateDirectMessagesUser => {
137-
let mut direct_messages: Vec<(Message, u64)> = Vec::new();
105+
let mut direct_messages: Vec<(Message, u64, PublicKey)> = Vec::new();
138106
for index in 1..=ctx.trade_index {
139107
let trade_key = User::get_trade_keys(&ctx.pool, index).await?;
140108
let filter = create_filter(
@@ -148,19 +116,16 @@ pub async fn fetch_events_list(
148116
.await?;
149117
let direct_messages_for_trade_key =
150118
parse_dm_events(fetched_user_messages, &trade_key, since).await;
151-
direct_messages.extend(
152-
direct_messages_for_trade_key
153-
.into_iter()
154-
.map(|(message, timestamp, _)| (message, timestamp)),
155-
);
119+
// Extend the direct messages
120+
direct_messages.extend(direct_messages_for_trade_key);
156121
}
157122
Ok(direct_messages
158123
.into_iter()
159124
.map(|t| Event::MessageTuple(Box::new(t)))
160125
.collect())
161126
}
162127
ListKind::DirectMessagesUser => {
163-
let mut direct_messages: Vec<(Message, u64)> = Vec::new();
128+
let mut direct_messages: Vec<(Message, u64, PublicKey)> = Vec::new();
164129
for index in 1..=ctx.trade_index {
165130
let trade_key = User::get_trade_keys(&ctx.pool, index).await?;
166131
let filter =
@@ -171,11 +136,8 @@ pub async fn fetch_events_list(
171136
.await?;
172137
let direct_messages_for_trade_key =
173138
parse_dm_events(fetched_user_messages, &trade_key, since).await;
174-
direct_messages.extend(
175-
direct_messages_for_trade_key
176-
.into_iter()
177-
.map(|(message, timestamp, _)| (message, timestamp)),
178-
);
139+
// Extend the direct messages
140+
direct_messages.extend(direct_messages_for_trade_key);
179141
}
180142
Ok(direct_messages
181143
.into_iter()

src/util/messaging.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -245,14 +245,21 @@ pub async fn print_dm_events(
245245
let messages = parse_dm_events(recv_event, trade_keys, None).await;
246246
if let Some((message, _, _)) = messages.first() {
247247
let message = message.get_inner_message_kind();
248-
if message.request_id == Some(request_id) {
249-
print_commands_results(message, ctx).await?;
250-
} else {
251-
return Err(anyhow::anyhow!(
252-
"Received response with mismatched request_id. Expected: {}, Got: {:?}",
253-
request_id,
254-
message.request_id
255-
));
248+
match message.request_id {
249+
Some(id) => {
250+
if request_id == id {
251+
print_commands_results(message, ctx).await?;
252+
}
253+
}
254+
None if message.action == Action::RateReceived => {
255+
print_commands_results(message, ctx).await?;
256+
}
257+
None => {
258+
return Err(anyhow::anyhow!(
259+
"Received response with mismatched request_id. Expected: {}, Got: Null",
260+
request_id,
261+
));
262+
}
256263
}
257264
} else {
258265
return Err(anyhow::anyhow!("No response received from Mostro"));

src/util/misc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub fn uppercase_first(s: &str) -> String {
1010

1111
pub fn get_mcli_path() -> String {
1212
let home_dir = dirs::home_dir().expect("Couldn't get home directory");
13-
let mcli_path = format!("{}/.mcli", home_dir.display());
13+
let mcli_path = format!("{}/.mcliUserA", home_dir.display());
1414
if !Path::new(&mcli_path).exists() {
1515
fs::create_dir(&mcli_path).expect("Couldn't create mostro-cli directory in HOME");
1616
println!("Directory {} created.", mcli_path);

src/util/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ pub mod storage;
66
pub mod types;
77

88
// Re-export commonly used items to preserve existing import paths
9-
pub use events::{
10-
create_filter, fetch_events_list, get_direct_messages_from_trade_keys, FETCH_EVENTS_TIMEOUT,
11-
};
9+
pub use events::{create_filter, fetch_events_list, FETCH_EVENTS_TIMEOUT};
1210
pub use messaging::{
1311
print_dm_events, send_admin_gift_wrap_dm, send_dm, send_gift_wrap_dm, wait_for_dm,
1412
};

src/util/types.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use mostro_core::prelude::*;
2+
use nostr_sdk::prelude::*;
23

34
#[derive(Clone, Debug)]
45
pub enum Event {
56
SmallOrder(SmallOrder),
67
Dispute(Dispute),
7-
MessageTuple(Box<(Message, u64)>),
8+
MessageTuple(Box<(Message, u64, PublicKey)>),
89
}
910

1011
#[derive(Clone, Debug)]

tests/parser_dms.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ async fn parse_dm_empty() {
1313
#[tokio::test]
1414
async fn print_dms_empty() {
1515
let pool = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap();
16-
let msgs: Vec<(Message, u64)> = Vec::new();
16+
let msgs: Vec<(Message, u64, PublicKey)> = Vec::new();
1717
let res = print_direct_messages(&msgs, &pool).await;
1818
assert!(res.is_ok());
1919
}

0 commit comments

Comments
 (0)