refactor: improve relay management code structure (#220)

This commit is contained in:
XIAO YU 2024-06-29 09:41:16 +09:00 committed by GitHub
parent 5c9b599b1e
commit 968b1ada94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 64 additions and 56 deletions

View File

@ -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)]
@ -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)
@ -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 {
@ -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]
@ -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]
@ -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())
}

View File

@ -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;
@ -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> {