use nostr::prelude::*;
use nostr_sdk::prelude::*;
use sentrystr::{Config, DirectMessageBuilder, Event, Level, NostrSentryClient, Result};
#[tokio::main]
async fn main() -> Result<()> {
let npub = "npub18kpn83drge7x9vz4cuhh7xta79sl4tfq55se4e554yj90s8y3f7qa49nps";
let recipient_pubkey = PublicKey::from_bech32(npub)
.map_err(|e| sentrystr::SentryStrError::Config(format!("Invalid npub: {}", e)))?;
println!("Recipient pubkey: {}", recipient_pubkey);
let keys = Keys::generate();
println!("Sender pubkey: {}", keys.public_key());
let config = Config::new(
keys.secret_key().display_secret().to_string(),
vec![
"wss://relay.damus.io".to_string(),
"wss://nos.lol".to_string(),
"wss://relay.nostr.info".to_string(),
],
);
let mut client = NostrSentryClient::new(config).await?;
println!("โ
Main client connected");
let dm_client = Client::new(keys.clone());
dm_client.add_relay("wss://relay.damus.io").await?;
dm_client.add_relay("wss://nos.lol").await?;
dm_client.add_relay("wss://relay.nostr.info").await?;
dm_client.connect().await;
println!("โ
DM client connected");
println!("\n๐งช Test 1: NIP-17 Direct Messaging");
let dm_sender_nip17 = DirectMessageBuilder::new()
.with_client(dm_client.clone())
.with_keys(keys.clone())
.with_recipient(recipient_pubkey)
.with_min_level(Level::Info)
.with_nip17(true) .build()?;
client.set_direct_messaging(dm_sender_nip17);
let test_event = Event::new()
.with_message("Test message from SentryStr - NIP-17")
.with_level(Level::Warning)
.with_tag("test", "nip17");
let event_id = client.capture_event(test_event).await?;
println!("๐จ Sent event with NIP-17 DM: {}", event_id);
client
.send_direct_message("Standalone NIP-17 test message from SentryStr")
.await?;
println!("๐จ Sent standalone NIP-17 DM");
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
println!("\n๐งช Test 2: NIP-44 Direct Messaging");
let dm_sender_nip44 = DirectMessageBuilder::new()
.with_client(dm_client.clone())
.with_keys(keys.clone())
.with_recipient(recipient_pubkey)
.with_min_level(Level::Error) .with_nip17(false) .build()?;
client.set_direct_messaging(dm_sender_nip44);
let info_event = Event::new()
.with_message("Info message - should not send DM")
.with_level(Level::Info);
let info_id = client.capture_event(info_event).await?;
println!("๐ Sent info event (no DM expected): {}", info_id);
let error_event = Event::new()
.with_message("Error message from SentryStr - NIP-44")
.with_level(Level::Error)
.with_tag("test", "nip44")
.with_extra("error_code", serde_json::json!(500));
let error_id = client.capture_event(error_event).await?;
println!("๐จ Sent error event with NIP-44 DM: {}", error_id);
client
.send_direct_message("Standalone NIP-44 test message from SentryStr")
.await?;
println!("๐จ Sent standalone NIP-44 DM");
tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;
println!("\n๐งช Test 3: Level Filtering");
let dm_sender_warning = DirectMessageBuilder::new()
.with_client(dm_client)
.with_keys(keys.clone())
.with_recipient(recipient_pubkey)
.with_min_level(Level::Warning) .with_nip17(true)
.build()?;
client.set_direct_messaging(dm_sender_warning);
client.capture_message("Debug message").await?;
println!("๐ Sent debug message (no DM expected)");
let info_event2 = Event::new()
.with_message("Info message 2")
.with_level(Level::Info);
client.capture_event(info_event2).await?;
println!("๐ Sent info message (no DM expected)");
let warning_event = Event::new()
.with_message("Warning: High CPU usage detected")
.with_level(Level::Warning);
client.capture_event(warning_event).await?;
println!("๐จ Sent warning event with DM");
client
.capture_error("Critical database connection error")
.await?;
println!("๐จ Sent error event with DM");
let fatal_event = Event::new()
.with_message("Fatal: System crash imminent")
.with_level(Level::Fatal);
client.capture_event(fatal_event).await?;
println!("๐จ Sent fatal event with DM");
tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
println!("\n๐งช Test 4: Dynamic Configuration");
client.remove_direct_messaging();
client
.capture_error("This error should NOT send a DM")
.await?;
println!("๐ Sent error with DMs disabled (no DM expected)");
let final_client = Client::new(keys.clone());
final_client.add_relay("wss://relay.damus.io").await?;
final_client.add_relay("wss://nos.lol").await?;
final_client.connect().await;
let dm_sender_final = DirectMessageBuilder::new()
.with_client(final_client)
.with_keys(keys.clone())
.with_recipient(recipient_pubkey)
.with_nip17(true)
.build()?;
client.set_direct_messaging(dm_sender_final);
client
.send_direct_message("Final test message - DMs re-enabled!")
.await?;
println!("๐จ Sent final test DM");
println!("\nโ
All tests completed!");
println!("๐ฑ Check your Nostr client for the direct messages");
println!("๐ Sender npub: {}", keys.public_key().to_bech32().unwrap());
client.disconnect().await?;
Ok(())
}