Handle errors when adding and connecting relays in init_nip65 (#227)

This commit is contained in:
XIAO YU
2024-08-03 10:56:38 +09:00
committed by GitHub
parent 9b75a04f91
commit 4c6d1c768a

View File

@@ -2,52 +2,60 @@ use crate::Settings;
use nostr_sdk::prelude::*; use nostr_sdk::prelude::*;
pub async fn init_nip65(client: &Client) { pub async fn init_nip65(client: &Client) {
let signer = client.signer().await.unwrap(); let signer = match client.signer().await {
let public_key = signer.public_key().await.unwrap(); Ok(signer) => signer,
Err(e) => {
eprintln!("Failed to get signer: {:?}", e);
return;
}
};
let public_key = match signer.public_key().await {
Ok(public_key) => public_key,
Err(e) => {
eprintln!("Failed to get public key: {:?}", e);
return;
}
};
if let Ok(events) = client let filter = Filter::new()
.get_events_of(
vec![Filter::new()
.author(public_key) .author(public_key)
.kind(Kind::RelayList) .kind(Kind::RelayList)
.limit(1)], .limit(1);
None,
) if let Ok(events) = client.get_events_of(vec![filter], None).await {
.await
{
if let Some(event) = events.first() { if let Some(event) = events.first() {
let relay_list = nip65::extract_relay_list(event); let relay_list = nip65::extract_relay_list(event);
for item in relay_list.into_iter() { for (url, metadata) in relay_list {
let relay_url = item.0.to_string(); let opts = match metadata {
let opts = match item.1 { Some(RelayMetadata::Read) => RelayOptions::new().read(true).write(false),
Some(val) => { Some(_) => RelayOptions::new().write(true).read(false),
if val == &RelayMetadata::Read {
RelayOptions::new().read(true).write(false)
} else {
RelayOptions::new().write(true).read(false)
}
}
None => RelayOptions::default(), None => RelayOptions::default(),
}; };
if let Err(e) = client.add_relay_with_opts(&url.to_string(), opts).await {
// Add relay to relay pool eprintln!("Failed to add relay {}: {:?}", url, e);
let _ = client }
.add_relay_with_opts(&relay_url, opts) if let Err(e) = client.connect_relay(url.to_string()).await {
.await eprintln!("Failed to connect to relay {}: {:?}", url, e);
.unwrap_or_default(); } else {
println!("Connecting to relay: {} - {:?}", url, metadata);
// Connect relay
client.connect_relay(relay_url).await.unwrap_or_default();
println!("connecting to relay: {} - {:?}", item.0, item.1);
} }
} }
}; }
} else {
eprintln!("Failed to get events for RelayList.");
}
} }
pub async fn get_user_settings(client: &Client) -> Result<Settings, String> { pub async fn get_user_settings(client: &Client) -> Result<Settings, String> {
let ident = "lume:settings"; let ident = "lume:settings";
let signer = client.signer().await.unwrap(); let signer = client
let public_key = signer.public_key().await.unwrap(); .signer()
.await
.map_err(|e| format!("Failed to get signer: {:?}", e))?;
let public_key = signer
.public_key()
.await
.map_err(|e| format!("Failed to get public key: {:?}", e))?;
let filter = Filter::new() let filter = Filter::new()
.author(public_key) .author(public_key)
@@ -55,21 +63,24 @@ pub async fn get_user_settings(client: &Client) -> Result<Settings, String> {
.identifier(ident) .identifier(ident)
.limit(1); .limit(1);
if let Ok(events) = client.get_events_of(vec![filter], None).await { match client.get_events_of(vec![filter], None).await {
Ok(events) => {
if let Some(event) = events.first() { if let Some(event) = events.first() {
let content = event.content(); let content = event.content();
if let Ok(decrypted) = signer.nip44_decrypt(public_key, content).await { match signer.nip44_decrypt(public_key, content).await {
match serde_json::from_str(&decrypted) { Ok(decrypted) => match serde_json::from_str(&decrypted) {
Ok(parsed) => parsed, Ok(parsed) => Ok(parsed),
Err(_) => Err("Could not parse settings payload".into()), Err(_) => Err("Could not parse settings payload".into()),
} },
} else { Err(e) => Err(format!("Failed to decrypt settings content: {:?}", e)),
Err("Decrypt settings failed.".into())
} }
} else { } else {
Err("Settings not found.".into()) Err("Settings not found.".into())
} }
} else { }
Err("Settings not found.".into()) Err(e) => Err(format!(
"Failed to get events for ApplicationSpecificData: {:?}",
e
)),
} }
} }