Skip to content

Commit

Permalink
refactor: improve relay management code structure (#220)
Browse files Browse the repository at this point in the history
  • Loading branch information
kasugamirai committed Jun 29, 2024
1 parent 5c9b599 commit 968b1ad
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 56 deletions.
116 changes: 62 additions & 54 deletions src-tauri/src/nostr/relay.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
use std::{
fs,
io::{self, BufRead, Write},
};

use crate::Nostr;
use nostr_sdk::prelude::*;
use serde::Serialize;
use specta::Type;
use std::{
fs::OpenOptions,
io::{self, BufRead, Write},
};
use tauri::{path::BaseDirectory, Manager, State};

#[derive(Serialize, Type)]
Expand All @@ -22,13 +21,16 @@ pub struct Relays {
pub async fn get_relays(state: State<'_, Nostr>) -> Result<Relays, String> {
let client = &state.client;

// Get connected relays
let list = client.relays().await;
let connected_relays: Vec<String> = list.into_keys().map(|url| url.to_string()).collect();
let connected_relays = client
.relays()
.await
.into_keys()
.map(|url| url.to_string())
.collect::<Vec<_>>();

// Get NIP-65 relay list
let signer = client.signer().await.map_err(|e| e.to_string())?;
let public_key = signer.public_key().await.map_err(|e| e.to_string())?;

let filter = Filter::new()
.author(public_key)
.kind(Kind::RelayList)
Expand All @@ -38,22 +40,35 @@ pub async fn get_relays(state: State<'_, Nostr>) -> Result<Relays, String> {
Ok(events) => {
if let Some(event) = events.first() {
let nip65_list = nip65::extract_relay_list(event);
let read: Vec<String> = nip65_list
.clone()
.into_iter()
.filter(|i| matches!(&i.1, Some(y) if *y == RelayMetadata::Read))
.map(|(url, _)| url.to_string())
let read = nip65_list
.iter()
.filter_map(|(url, meta)| {
if let Some(RelayMetadata::Read) = meta {
Some(url.to_string())
} else {
None
}
})
.collect();
let write: Vec<String> = nip65_list
.clone()
.into_iter()
.filter(|i| matches!(&i.1, Some(y) if *y == RelayMetadata::Write))
.map(|(url, _)| url.to_string())
let write = nip65_list
.iter()
.filter_map(|(url, meta)| {
if let Some(RelayMetadata::Write) = meta {
Some(url.to_string())
} else {
None
}
})
.collect();
let both: Vec<String> = nip65_list
.into_iter()
.filter(|i| i.1.is_none())
.map(|(url, _)| url.to_string())
let both = nip65_list
.iter()
.filter_map(|(url, meta)| {
if meta.is_none() {
Some(url.to_string())
} else {
None
}
})
.collect();

Ok(Relays {
Expand All @@ -79,31 +94,30 @@ pub async fn get_relays(state: State<'_, Nostr>) -> Result<Relays, String> {
#[specta::specta]
pub async fn connect_relay(relay: &str, state: State<'_, Nostr>) -> Result<bool, String> {
let client = &state.client;
match client.add_relay(relay).await {
Ok(status) => {
if status {
println!("connecting to relay: {}", relay);
let _ = client.connect_relay(relay).await;
Ok(true)
} else {
Ok(false)
}
}
Err(e) => Err(e.to_string()),
let status = client.add_relay(relay).await.map_err(|e| e.to_string())?;
if status {
println!("Connecting to relay: {}", relay);
client
.connect_relay(relay)
.await
.map_err(|e| e.to_string())?;
}
Ok(status)
}

#[tauri::command]
#[specta::specta]
pub async fn remove_relay(relay: &str, state: State<'_, Nostr>) -> Result<bool, String> {
let client = &state.client;
match client.remove_relay(relay).await {
Ok(_) => {
let _ = client.disconnect_relay(relay).await;
Ok(true)
}
Err(e) => Err(e.to_string()),
}
client
.remove_relay(relay)
.await
.map_err(|e| e.to_string())?;
client
.disconnect_relay(relay)
.await
.map_err(|e| e.to_string())?;
Ok(true)
}

#[tauri::command]
Expand All @@ -115,15 +129,12 @@ pub fn get_bootstrap_relays(app: tauri::AppHandle) -> Result<Vec<String>, String
.map_err(|e| e.to_string())?;

let file = std::fs::File::open(relays_path).map_err(|e| e.to_string())?;
let lines = io::BufReader::new(file).lines();
let reader = io::BufReader::new(file);

let mut relays = Vec::new();

for line in lines.map_while(Result::ok) {
relays.push(line.to_string())
}

Ok(relays)
reader
.lines()
.collect::<Result<Vec<String>, io::Error>>()
.map_err(|e| e.to_string())
}

#[tauri::command]
Expand All @@ -134,13 +145,10 @@ pub fn save_bootstrap_relays(relays: &str, app: tauri::AppHandle) -> Result<(),
.resolve("resources/relays.txt", BaseDirectory::Resource)
.map_err(|e| e.to_string())?;

let mut file = fs::OpenOptions::new()
let mut file = OpenOptions::new()
.write(true)
.open(relays_path)
.map_err(|e| e.to_string())?;

match file.write_all(relays.as_bytes()) {
Ok(_) => Ok(()),
Err(e) => Err(e.to_string()),
}
file.write_all(relays.as_bytes()).map_err(|e| e.to_string())
}
4 changes: 2 additions & 2 deletions src-tauri/src/nostr/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ use std::collections::HashSet;
use std::str::FromStr;

use linkify::LinkFinder;
use nostr_sdk::{Alphabet, Event, EventId, FromBech32, PublicKey, SingleLetterTag, Tag, TagKind};
use nostr_sdk::prelude::Nip19Event;
use nostr_sdk::{Alphabet, Event, EventId, FromBech32, PublicKey, SingleLetterTag, Tag, TagKind};
use reqwest::Client;
use serde::Serialize;
use specta::Type;
Expand Down Expand Up @@ -47,7 +47,7 @@ const IMAGES: [&str; 7] = ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"];
const VIDEOS: [&str; 5] = ["mp4", "mov", "avi", "webm", "mkv"];

pub fn get_latest_event(events: &[Event]) -> Option<&Event> {
events.iter().max_by_key(|event| event.created_at())
events.iter().next()
}

pub fn dedup_event(events: &[Event]) -> Vec<Event> {
Expand Down

0 comments on commit 968b1ad

Please sign in to comment.