fix: settings
This commit is contained in:
@@ -1,12 +1,8 @@
|
||||
use nostr_sdk::prelude::*;
|
||||
use serde::Serialize;
|
||||
use specta::Type;
|
||||
use std::{
|
||||
fs::OpenOptions,
|
||||
io::{self, BufRead, Write},
|
||||
str::FromStr,
|
||||
};
|
||||
use tauri::{path::BaseDirectory, Manager, State};
|
||||
use std::str::FromStr;
|
||||
use tauri::State;
|
||||
|
||||
use crate::{Nostr, FETCH_LIMIT};
|
||||
|
||||
@@ -20,82 +16,17 @@ pub struct Relays {
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub async fn get_relays(id: String, state: State<'_, Nostr>) -> Result<Relays, String> {
|
||||
pub async fn get_all_relays(state: State<'_, Nostr>) -> Result<Vec<String>, String> {
|
||||
let client = &state.client;
|
||||
let public_key = PublicKey::from_str(&id).map_err(|e| e.to_string())?;
|
||||
let relays = client.pool().all_relays().await;
|
||||
let v: Vec<String> = relays.iter().map(|item| item.0.to_string()).collect();
|
||||
|
||||
let connected_relays = client
|
||||
.relays()
|
||||
.await
|
||||
.into_keys()
|
||||
.map(|url| url.to_string())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let filter = Filter::new()
|
||||
.author(public_key)
|
||||
.kind(Kind::RelayList)
|
||||
.limit(1);
|
||||
|
||||
match client.database().query(vec![filter]).await {
|
||||
Ok(events) => {
|
||||
if let Some(event) = events.first() {
|
||||
let nip65_list = nip65::extract_relay_list(event).collect::<Vec<_>>();
|
||||
|
||||
let read = nip65_list
|
||||
.iter()
|
||||
.filter_map(|(url, meta)| {
|
||||
if let Some(RelayMetadata::Read) = meta {
|
||||
Some(url.to_string())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let write = nip65_list
|
||||
.iter()
|
||||
.filter_map(|(url, meta)| {
|
||||
if let Some(RelayMetadata::Write) = meta {
|
||||
Some(url.to_string())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
let both = nip65_list
|
||||
.iter()
|
||||
.filter_map(|(url, meta)| {
|
||||
if meta.is_none() {
|
||||
Some(url.to_string())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
|
||||
Ok(Relays {
|
||||
connected: connected_relays,
|
||||
read: Some(read),
|
||||
write: Some(write),
|
||||
both: Some(both),
|
||||
})
|
||||
} else {
|
||||
Ok(Relays {
|
||||
connected: connected_relays,
|
||||
read: None,
|
||||
write: None,
|
||||
both: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
Ok(v)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub async fn get_all_relays(
|
||||
pub async fn get_all_relay_lists(
|
||||
until: Option<String>,
|
||||
state: State<'_, Nostr>,
|
||||
) -> Result<Vec<String>, String> {
|
||||
@@ -149,36 +80,3 @@ pub async fn remove_relay(relay: String, state: State<'_, Nostr>) -> Result<(),
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub fn get_bootstrap_relays(app: tauri::AppHandle) -> Result<Vec<String>, String> {
|
||||
let relays_path = app
|
||||
.path()
|
||||
.resolve("resources/relays.txt", BaseDirectory::Resource)
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
let file = std::fs::File::open(relays_path).map_err(|e| e.to_string())?;
|
||||
let reader = io::BufReader::new(file);
|
||||
|
||||
reader
|
||||
.lines()
|
||||
.collect::<Result<Vec<String>, io::Error>>()
|
||||
.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub fn set_bootstrap_relays(relays: String, app: tauri::AppHandle) -> Result<(), String> {
|
||||
let relays_path = app
|
||||
.path()
|
||||
.resolve("resources/relays.txt", BaseDirectory::Resource)
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
let mut file = OpenOptions::new()
|
||||
.write(true)
|
||||
.open(relays_path)
|
||||
.map_err(|e| e.to_string())?;
|
||||
|
||||
file.write_all(relays.as_bytes()).map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ use tauri::{
|
||||
};
|
||||
use tauri_plugin_decorum::WebviewWindowExt;
|
||||
use tauri_plugin_notification::{NotificationExt, PermissionState};
|
||||
use tauri_plugin_store::StoreExt;
|
||||
use tauri_specta::{collect_commands, Builder};
|
||||
use tokio::{sync::RwLock, time::sleep};
|
||||
|
||||
@@ -42,7 +43,7 @@ pub struct Payload {
|
||||
id: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Serialize, Deserialize, Type)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, Type)]
|
||||
pub struct Settings {
|
||||
resize_service: bool,
|
||||
content_warning: bool,
|
||||
@@ -74,13 +75,11 @@ fn main() {
|
||||
tracing_subscriber::fmt::init();
|
||||
|
||||
let builder = Builder::<tauri::Wry>::new().commands(collect_commands![
|
||||
get_relays,
|
||||
get_all_relays,
|
||||
get_all_relay_lists,
|
||||
is_relay_connected,
|
||||
connect_relay,
|
||||
remove_relay,
|
||||
get_bootstrap_relays,
|
||||
set_bootstrap_relays,
|
||||
get_accounts,
|
||||
watch_account,
|
||||
import_account,
|
||||
@@ -278,11 +277,29 @@ fn main() {
|
||||
client
|
||||
});
|
||||
|
||||
// Load app settings
|
||||
let store = app.store(".data")?;
|
||||
|
||||
// Parse app settings if exist
|
||||
let settings = if let Some(data) = store.get("tanstack-query-[\"settings\"]") {
|
||||
if let Some(str) = data.as_str() {
|
||||
let v: Value = serde_json::from_str(str).unwrap();
|
||||
let data = v["state"]["data"].clone();
|
||||
let parse: Settings = serde_json::from_value(data).unwrap();
|
||||
|
||||
RwLock::new(parse)
|
||||
} else {
|
||||
RwLock::new(Settings::default())
|
||||
}
|
||||
} else {
|
||||
RwLock::new(Settings::default())
|
||||
};
|
||||
|
||||
// Create global state
|
||||
app.manage(Nostr {
|
||||
client,
|
||||
settings,
|
||||
queue: RwLock::new(HashSet::new()),
|
||||
settings: RwLock::new(Settings::default()),
|
||||
});
|
||||
|
||||
// Listen for request metadata
|
||||
|
||||
Reference in New Issue
Block a user