Skip to content

Commit efc0f31

Browse files
authored
Merge pull request #146 from MostroP2P/terminal-beautify
Beautified lot of terminal output
2 parents ad634a4 + 69c4ded commit efc0f31

36 files changed

Lines changed: 3314 additions & 659 deletions

Cargo.lock

Lines changed: 105 additions & 327 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ uuid = { version = "1.18.1", features = [
3838
] }
3939
dotenvy = "0.15.6"
4040
lightning-invoice = { version = "0.33.2", features = ["std"] }
41-
reqwest = { version = "0.12.23", features = ["json"] }
41+
reqwest = { version = "0.12.23", default-features = false, features = ["json","rustls-tls"] }
4242
mostro-core = "0.6.56"
43-
lnurl-rs = "0.9.0"
43+
lnurl-rs = { version = "0.9.0", default-features = false, features = ["ureq"] }
4444
pretty_env_logger = "0.5.0"
45-
openssl = { version = "0.10.73", features = ["vendored"] }
4645
sqlx = { version = "0.8.6", features = ["sqlite", "runtime-tokio-rustls"] }
4746
bip39 = { version = "2.2.0", features = ["rand"] }
4847
dirs = "6.0.0"

src/cli.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub mod last_trade_index;
88
pub mod list_disputes;
99
pub mod list_orders;
1010
pub mod new_order;
11+
pub mod orders_info;
1112
pub mod rate_user;
1213
pub mod restore;
1314
pub mod send_dm;
@@ -25,6 +26,7 @@ use crate::cli::last_trade_index::execute_last_trade_index;
2526
use crate::cli::list_disputes::execute_list_disputes;
2627
use crate::cli::list_orders::execute_list_orders;
2728
use crate::cli::new_order::execute_new_order;
29+
use crate::cli::orders_info::execute_orders_info;
2830
use crate::cli::rate_user::execute_rate_user;
2931
use crate::cli::restore::execute_restore;
3032
use crate::cli::send_dm::execute_send_dm;
@@ -295,6 +297,12 @@ pub enum Commands {
295297
},
296298
/// Get last trade index of user
297299
GetLastTradeIndex {},
300+
/// Request detailed information for specific orders
301+
OrdersInfo {
302+
/// Order IDs to request information for
303+
#[arg(short, long)]
304+
order_ids: Vec<Uuid>,
305+
},
298306
}
299307

300308
fn get_env_var(cli: &Cli) {
@@ -363,8 +371,6 @@ pub async fn run() -> Result<()> {
363371
cmd.run(&ctx).await?;
364372
}
365373

366-
println!("Bye Bye!");
367-
368374
Ok(())
369375
}
370376

@@ -512,8 +518,9 @@ impl Commands {
512518

513519
// Simple commands
514520
Commands::Restore {} => {
515-
execute_restore(&ctx.identity_keys, ctx.mostro_pubkey, &ctx.client).await
521+
execute_restore(&ctx.identity_keys, ctx.mostro_pubkey, ctx).await
516522
}
523+
Commands::OrdersInfo { order_ids } => execute_orders_info(order_ids, ctx).await,
517524
}
518525
}
519526
}

src/cli/add_invoice.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use crate::parser::common::{
2+
create_emoji_field_row, create_field_value_header, create_standard_table,
3+
};
14
use crate::util::{print_dm_events, send_dm, wait_for_dm};
25
use crate::{cli::Context, db::Order, lightning::is_valid_invoice};
36
use anyhow::Result;
@@ -17,15 +20,29 @@ pub async fn execute_add_invoice(order_id: &Uuid, invoice: &str, ctx: &Context)
1720
.ok_or(anyhow::anyhow!("Missing trade keys"))?;
1821

1922
let order_trade_keys = Keys::parse(&trade_keys)?;
20-
println!(
21-
"Order trade keys: {:?}",
22-
order_trade_keys.public_key().to_hex()
23-
);
2423

25-
println!(
26-
"Sending a lightning invoice for order {} to mostro pubId {}",
27-
order_id, ctx.mostro_pubkey
28-
);
24+
println!("⚡ Add Lightning Invoice");
25+
println!("═══════════════════════════════════════");
26+
27+
let mut table = create_standard_table();
28+
table.set_header(create_field_value_header());
29+
table.add_row(create_emoji_field_row(
30+
"📋 ",
31+
"Order ID",
32+
&order_id.to_string(),
33+
));
34+
table.add_row(create_emoji_field_row(
35+
"🔑 ",
36+
"Trade Keys",
37+
&order_trade_keys.public_key().to_hex(),
38+
));
39+
table.add_row(create_emoji_field_row(
40+
"🎯 ",
41+
"Target",
42+
&ctx.mostro_pubkey.to_string(),
43+
));
44+
println!("{table}");
45+
println!("💡 Sending lightning invoice to Mostro...\n");
2946
// Check invoice string
3047
let ln_addr = LightningAddress::from_str(invoice);
3148
let payload = if ln_addr.is_ok() {

src/cli/adm_send_dm.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
use crate::cli::Context;
2+
use crate::parser::common::{
3+
create_emoji_field_row, create_field_value_header, create_standard_table,
4+
};
25
use crate::util::send_admin_gift_wrap_dm;
36
use anyhow::Result;
47
use nostr_sdk::prelude::*;
58

69
pub async fn execute_adm_send_dm(receiver: PublicKey, ctx: &Context, message: &str) -> Result<()> {
7-
println!(
8-
"SENDING DM with admin keys: {}",
9-
ctx.context_keys.public_key().to_hex()
10-
);
10+
println!("👑 Admin Direct Message");
11+
println!("═══════════════════════════════════════");
12+
let mut table = create_standard_table();
13+
table.set_header(create_field_value_header());
14+
table.add_row(create_emoji_field_row(
15+
"🔑 ",
16+
"Admin Keys",
17+
&ctx.context_keys.public_key().to_hex(),
18+
));
19+
table.add_row(create_emoji_field_row(
20+
"🎯 ",
21+
"Recipient",
22+
&receiver.to_string(),
23+
));
24+
table.add_row(create_emoji_field_row("💬 ", "Message", message));
25+
println!("{table}");
26+
println!("💡 Sending admin gift wrap message...\n");
1127

1228
send_admin_gift_wrap_dm(&ctx.client, &ctx.context_keys, &receiver, message).await?;
1329

14-
println!("Admin gift wrap message sent to {}", receiver);
30+
println!(
31+
"✅ Admin gift wrap message sent successfully to {}",
32+
receiver
33+
);
1534

1635
Ok(())
1736
}

src/cli/conversation_key.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1+
use crate::parser::common::{
2+
print_info_line, print_key_value, print_section_header, print_success_message,
3+
};
14
use anyhow::Result;
25
use nip44::v2::ConversationKey;
36
use nostr_sdk::prelude::*;
47

58
pub async fn execute_conversation_key(trade_keys: &Keys, receiver: PublicKey) -> Result<()> {
9+
print_section_header("🔐 Conversation Key Generator");
10+
print_key_value("🔑", "Trade Keys", &trade_keys.public_key().to_hex());
11+
print_key_value("🎯", "Receiver", &receiver.to_string());
12+
print_info_line("💡", "Deriving conversation key...");
13+
println!();
14+
615
// Derive conversation key
716
let ck = ConversationKey::derive(trade_keys.secret_key(), &receiver)?;
817
let key = ck.as_bytes();
@@ -11,7 +20,12 @@ pub async fn execute_conversation_key(trade_keys: &Keys, receiver: PublicKey) ->
1120
ck_hex.push(format!("{:02x}", i));
1221
}
1322
let ck_hex = ck_hex.join("");
14-
println!("Conversation key: {:?}", ck_hex);
23+
24+
println!("🔐 Conversation Key:");
25+
println!("─────────────────────────────────────");
26+
println!("{}", ck_hex);
27+
println!("─────────────────────────────────────");
28+
print_success_message("Conversation key generated successfully!");
1529

1630
Ok(())
1731
}

src/cli/dm_to_user.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
use crate::parser::common::{
2+
print_info_line, print_key_value, print_section_header, print_success_message,
3+
};
14
use crate::{db::Order, util::send_gift_wrap_dm};
25
use anyhow::Result;
36
use nostr_sdk::prelude::*;
@@ -22,12 +25,17 @@ pub async fn execute_dm_to_user(
2225
};
2326

2427
// Send the DM
25-
println!(
26-
"SENDING DM with trade keys: {}",
27-
trade_keys.public_key().to_hex()
28-
);
28+
print_section_header("💬 Direct Message to User");
29+
print_key_value("📋", "Order ID", &order_id.to_string());
30+
print_key_value("🔑", "Trade Keys", &trade_keys.public_key().to_hex());
31+
print_key_value("🎯", "Recipient", &receiver.to_string());
32+
print_key_value("💬", "Message", message);
33+
print_info_line("💡", "Sending gift wrap message...");
34+
println!();
2935

3036
send_gift_wrap_dm(client, &trade_keys, &receiver, message).await?;
3137

38+
print_success_message("Gift wrap message sent successfully!");
39+
3240
Ok(())
3341
}

src/cli/get_dm.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use nostr_sdk::prelude::*;
44

55
use crate::{
66
cli::Context,
7+
parser::common::{print_key_value, print_section_header},
78
parser::dms::print_direct_messages,
89
util::{fetch_events_list, Event, ListKind},
910
};
@@ -14,6 +15,13 @@ pub async fn execute_get_dm(
1415
from_user: &bool,
1516
ctx: &Context,
1617
) -> 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+
1725
// Get the list kind
1826
let list_kind = match (admin, from_user) {
1927
(true, true) => ListKind::PrivateDirectMessagesUser,
@@ -34,6 +42,6 @@ pub async fn execute_get_dm(
3442
}
3543
}
3644

37-
print_direct_messages(&dm_events, &ctx.pool).await?;
45+
print_direct_messages(&dm_events, Some(ctx.mostro_pubkey)).await?;
3846
Ok(())
3947
}

src/cli/get_dm_user.rs

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use crate::cli::Context;
22
use crate::db::Order;
3+
use crate::parser::common::{
4+
print_info_line, print_key_value, print_no_data_message, print_section_header,
5+
};
6+
use crate::parser::dms::print_direct_messages;
37
use crate::util::{fetch_events_list, Event, ListKind};
48
use anyhow::Result;
5-
use comfy_table::modifiers::UTF8_ROUND_CORNERS;
6-
use comfy_table::presets::UTF8_FULL;
7-
use comfy_table::Table;
89
use mostro_core::prelude::*;
910
use nostr_sdk::prelude::*;
1011

@@ -23,15 +24,19 @@ pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
2324

2425
// Check if the trade keys are empty
2526
if trade_keys_hex.is_empty() {
26-
println!("No trade keys found in orders");
27+
print_no_data_message("No trade keys found in orders");
2728
return Ok(());
2829
}
2930

30-
// Print the number of trade keys
31-
println!(
32-
"Searching for DMs in {} trade keys...",
33-
trade_keys_hex.len()
31+
print_section_header("📨 Fetch User Direct Messages");
32+
print_key_value(
33+
"🔍",
34+
"Searching for DMs in trade keys",
35+
&format!("{}", trade_keys_hex.len()),
3436
);
37+
print_key_value("⏰", "Since", &format!("{} minutes ago", since));
38+
print_info_line("💡", "Fetching direct messages...");
39+
println!();
3540

3641
let direct_messages = fetch_events_list(
3742
ListKind::DirectMessagesUser,
@@ -47,7 +52,7 @@ pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
4752
let mut dm_events: Vec<(Message, u64, PublicKey)> = Vec::new();
4853
// Check if the direct messages are empty
4954
if direct_messages.is_empty() {
50-
println!("You don't have any direct messages in your trade keys");
55+
print_no_data_message("You don't have any direct messages in your trade keys");
5156
return Ok(());
5257
}
5358
// Extract the direct messages
@@ -57,32 +62,6 @@ pub async fn execute_get_dm_user(since: &i64, ctx: &Context) -> Result<()> {
5762
}
5863
}
5964

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!();
65+
print_direct_messages(&dm_events, Some(ctx.mostro_pubkey)).await?;
8766
Ok(())
8867
}

src/cli/last_trade_index.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use nostr_sdk::prelude::*;
44

55
use crate::{
66
cli::Context,
7+
parser::common::{print_key_value, print_section_header},
78
parser::{dms::print_commands_results, parse_dm_events},
89
util::{send_dm, wait_for_dm},
910
};
@@ -31,10 +32,11 @@ pub async fn execute_last_trade_index(
3132
);
3233

3334
// Log the sent message
34-
println!(
35-
"Sent request to Mostro to get last trade index of user {}",
36-
identity_keys.public_key()
37-
);
35+
print_section_header("🔢 Last Trade Index Request");
36+
print_key_value("👤", "User", &identity_keys.public_key().to_string());
37+
print_key_value("🎯", "Target", &mostro_key.to_string());
38+
print_key_value("💡", "Action", "Requesting last trade index from Mostro...");
39+
println!();
3840

3941
// Wait for incoming DM
4042
let recv_event = wait_for_dm(ctx, Some(identity_keys), sent_message).await?;
@@ -44,7 +46,7 @@ pub async fn execute_last_trade_index(
4446
if let Some((message, _, _)) = messages.first() {
4547
let message = message.get_inner_message_kind();
4648
if message.action == Action::LastTradeIndex {
47-
print_commands_results(message, ctx).await?
49+
print_commands_results(message, ctx).await?;
4850
} else {
4951
return Err(anyhow::anyhow!(
5052
"Received response with mismatched action. Expected: {:?}, Got: {:?}",

0 commit comments

Comments
 (0)