feat: upgrade to tauri v2 rc
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
use std::{str::FromStr, time::Duration};
|
||||
|
||||
use futures::future::join_all;
|
||||
use nostr_sdk::prelude::*;
|
||||
use serde::Serialize;
|
||||
use specta::Type;
|
||||
use std::{str::FromStr, time::Duration};
|
||||
use tauri::State;
|
||||
|
||||
use crate::nostr::utils::{create_event_tags, dedup_event, parse_event, Meta};
|
||||
use crate::common::{create_event_tags, dedup_event, parse_event, Meta};
|
||||
use crate::{Nostr, FETCH_LIMIT};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Type)]
|
||||
@@ -1,9 +1,7 @@
|
||||
#[cfg(target_os = "macos")]
|
||||
use crate::commands::tray::create_tray_panel;
|
||||
use crate::nostr::event::RichEvent;
|
||||
use crate::nostr::internal::{get_user_settings, init_nip65};
|
||||
use crate::nostr::utils::parse_event;
|
||||
use crate::{Nostr, NEWSFEED_NEG_LIMIT, NOTIFICATION_NEG_LIMIT};
|
||||
use crate::common::{get_user_settings, init_nip65, parse_event};
|
||||
use crate::{Nostr, RichEvent, NEWSFEED_NEG_LIMIT, NOTIFICATION_NEG_LIMIT};
|
||||
|
||||
use keyring::Entry;
|
||||
use keyring_search::{Limit, List, Search};
|
||||
@@ -1,13 +1,11 @@
|
||||
use std::{str::FromStr, time::Duration};
|
||||
|
||||
use keyring::Entry;
|
||||
use nostr_sdk::prelude::*;
|
||||
use std::{str::FromStr, time::Duration};
|
||||
use tauri::State;
|
||||
|
||||
use crate::common::get_latest_event;
|
||||
use crate::{Nostr, Settings};
|
||||
|
||||
use super::get_latest_event;
|
||||
|
||||
#[tauri::command]
|
||||
#[specta::specta]
|
||||
pub async fn get_current_profile(state: State<'_, Nostr>) -> Result<String, String> {
|
||||
@@ -1,5 +1,7 @@
|
||||
#[cfg(target_os = "macos")]
|
||||
pub mod fns;
|
||||
pub mod event;
|
||||
pub mod keys;
|
||||
pub mod metadata;
|
||||
pub mod relay;
|
||||
#[cfg(target_os = "macos")]
|
||||
pub mod tray;
|
||||
pub mod window;
|
||||
|
||||
@@ -7,7 +7,7 @@ use tauri::{
|
||||
use tauri::{AppHandle, Manager, WebviewUrl};
|
||||
use tauri_nspanel::ManagerExt;
|
||||
|
||||
use super::fns::{
|
||||
use crate::macos::{
|
||||
position_menubar_panel, set_corner_radius, setup_menubar_panel_listeners,
|
||||
swizzle_to_menubar_panel,
|
||||
};
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
use linkify::LinkFinder;
|
||||
use nostr_sdk::prelude::*;
|
||||
use reqwest::Client as ReqClient;
|
||||
use serde::Serialize;
|
||||
use specta::Type;
|
||||
use std::collections::HashSet;
|
||||
use std::str::FromStr;
|
||||
|
||||
use linkify::LinkFinder;
|
||||
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;
|
||||
use url::Url;
|
||||
use crate::Settings;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Type)]
|
||||
pub struct Meta {
|
||||
@@ -46,6 +45,90 @@ const NOSTR_MENTIONS: [&str; 10] = [
|
||||
const IMAGES: [&str; 7] = ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"];
|
||||
const VIDEOS: [&str; 5] = ["mp4", "mov", "avi", "webm", "mkv"];
|
||||
|
||||
pub async fn init_nip65(client: &Client) {
|
||||
let signer = match client.signer().await {
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
let filter = Filter::new()
|
||||
.author(public_key)
|
||||
.kind(Kind::RelayList)
|
||||
.limit(1);
|
||||
|
||||
if let Ok(events) = client.get_events_of(vec![filter], None).await {
|
||||
if let Some(event) = events.first() {
|
||||
let relay_list = nip65::extract_relay_list(event);
|
||||
for (url, metadata) in relay_list {
|
||||
let opts = match metadata {
|
||||
Some(RelayMetadata::Read) => RelayOptions::new().read(true).write(false),
|
||||
Some(_) => RelayOptions::new().write(true).read(false),
|
||||
None => RelayOptions::default(),
|
||||
};
|
||||
if let Err(e) = client.add_relay_with_opts(&url.to_string(), opts).await {
|
||||
eprintln!("Failed to add relay {}: {:?}", url, e);
|
||||
}
|
||||
if let Err(e) = client.connect_relay(url.to_string()).await {
|
||||
eprintln!("Failed to connect to relay {}: {:?}", url, e);
|
||||
} else {
|
||||
println!("Connecting to relay: {} - {:?}", url, metadata);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
eprintln!("Failed to get events for RelayList.");
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_user_settings(client: &Client) -> Result<Settings, String> {
|
||||
let ident = "lume:settings";
|
||||
let signer = client
|
||||
.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()
|
||||
.author(public_key)
|
||||
.kind(Kind::ApplicationSpecificData)
|
||||
.identifier(ident)
|
||||
.limit(1);
|
||||
|
||||
match client.get_events_of(vec![filter], None).await {
|
||||
Ok(events) => {
|
||||
if let Some(event) = events.first() {
|
||||
let content = event.content();
|
||||
match signer.nip44_decrypt(public_key, content).await {
|
||||
Ok(decrypted) => match serde_json::from_str(&decrypted) {
|
||||
Ok(parsed) => Ok(parsed),
|
||||
Err(_) => Err("Could not parse settings payload".into()),
|
||||
},
|
||||
Err(e) => Err(format!("Failed to decrypt settings content: {:?}", e)),
|
||||
}
|
||||
} else {
|
||||
Err("Settings not found.".into())
|
||||
}
|
||||
}
|
||||
Err(e) => Err(format!(
|
||||
"Failed to get events for ApplicationSpecificData: {:?}",
|
||||
e
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_latest_event(events: &[Event]) -> Option<&Event> {
|
||||
events.iter().next()
|
||||
}
|
||||
@@ -102,7 +185,7 @@ pub async fn parse_event(content: &str) -> Meta {
|
||||
let mut text = content.to_string();
|
||||
|
||||
if !urls.is_empty() {
|
||||
let client = Client::new();
|
||||
let client = ReqClient::new();
|
||||
|
||||
for url in urls {
|
||||
let url_str = url.as_str();
|
||||
@@ -1,5 +1,4 @@
|
||||
use std::ffi::CString;
|
||||
|
||||
use tauri::{AppHandle, Emitter, Listener, Manager, WebviewWindow};
|
||||
use tauri_nspanel::{
|
||||
block::ConcreteBlock,
|
||||
@@ -11,22 +11,27 @@ extern crate objc;
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
use border::WebviewWindowExt as BorderWebviewWindowExt;
|
||||
use commands::{event::*, keys::*, metadata::*, relay::*, window::*};
|
||||
use nostr_sdk::prelude::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use specta::Type;
|
||||
use std::sync::Mutex;
|
||||
use std::time::Duration;
|
||||
use specta_typescript::Typescript;
|
||||
use std::{
|
||||
fs,
|
||||
io::{self, BufRead},
|
||||
str::FromStr,
|
||||
sync::Mutex,
|
||||
time::Duration,
|
||||
};
|
||||
use tauri::{path::BaseDirectory, Manager};
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
use tauri_plugin_decorum::WebviewWindowExt;
|
||||
use tauri_specta::{collect_commands, Builder};
|
||||
|
||||
pub mod commands;
|
||||
pub mod nostr;
|
||||
pub mod common;
|
||||
#[cfg(target_os = "macos")]
|
||||
pub mod macos;
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct Nostr {
|
||||
@@ -70,84 +75,86 @@ pub const NEWSFEED_NEG_LIMIT: usize = 256;
|
||||
pub const NOTIFICATION_NEG_LIMIT: usize = 64;
|
||||
|
||||
fn main() {
|
||||
let mut ctx = tauri::generate_context!();
|
||||
|
||||
let invoke_handler = {
|
||||
let builder = tauri_specta::ts::builder().commands(tauri_specta::collect_commands![
|
||||
nostr::relay::get_relays,
|
||||
nostr::relay::connect_relay,
|
||||
nostr::relay::remove_relay,
|
||||
nostr::relay::get_bootstrap_relays,
|
||||
nostr::relay::save_bootstrap_relays,
|
||||
nostr::keys::get_accounts,
|
||||
nostr::keys::create_account,
|
||||
nostr::keys::save_account,
|
||||
nostr::keys::get_encrypted_key,
|
||||
nostr::keys::get_private_key,
|
||||
nostr::keys::connect_remote_account,
|
||||
nostr::keys::load_account,
|
||||
nostr::metadata::get_current_profile,
|
||||
nostr::metadata::get_profile,
|
||||
nostr::metadata::get_contact_list,
|
||||
nostr::metadata::set_contact_list,
|
||||
nostr::metadata::create_profile,
|
||||
nostr::metadata::is_contact_list_empty,
|
||||
nostr::metadata::check_contact,
|
||||
nostr::metadata::toggle_contact,
|
||||
nostr::metadata::get_nstore,
|
||||
nostr::metadata::set_nstore,
|
||||
nostr::metadata::set_wallet,
|
||||
nostr::metadata::load_wallet,
|
||||
nostr::metadata::remove_wallet,
|
||||
nostr::metadata::zap_profile,
|
||||
nostr::metadata::zap_event,
|
||||
nostr::metadata::friend_to_friend,
|
||||
nostr::metadata::get_notifications,
|
||||
nostr::metadata::get_settings,
|
||||
nostr::metadata::set_new_settings,
|
||||
nostr::metadata::verify_nip05,
|
||||
nostr::event::get_event_meta,
|
||||
nostr::event::get_event,
|
||||
nostr::event::get_event_from,
|
||||
nostr::event::get_replies,
|
||||
nostr::event::listen_event_reply,
|
||||
nostr::event::get_events_by,
|
||||
nostr::event::get_local_events,
|
||||
nostr::event::listen_local_event,
|
||||
nostr::event::get_group_events,
|
||||
nostr::event::get_global_events,
|
||||
nostr::event::get_hashtag_events,
|
||||
nostr::event::publish,
|
||||
nostr::event::reply,
|
||||
nostr::event::repost,
|
||||
nostr::event::event_to_bech32,
|
||||
nostr::event::user_to_bech32,
|
||||
nostr::event::unlisten,
|
||||
commands::window::create_column,
|
||||
commands::window::close_column,
|
||||
commands::window::reposition_column,
|
||||
commands::window::resize_column,
|
||||
commands::window::reload_column,
|
||||
commands::window::open_window,
|
||||
commands::window::open_main_window,
|
||||
commands::window::force_quit,
|
||||
commands::window::set_badge
|
||||
let builder = Builder::<tauri::Wry>::new()
|
||||
// Then register them (separated by a comma)
|
||||
.commands(collect_commands![
|
||||
get_relays,
|
||||
connect_relay,
|
||||
remove_relay,
|
||||
get_bootstrap_relays,
|
||||
save_bootstrap_relays,
|
||||
get_accounts,
|
||||
create_account,
|
||||
save_account,
|
||||
get_encrypted_key,
|
||||
get_private_key,
|
||||
connect_remote_account,
|
||||
load_account,
|
||||
get_current_profile,
|
||||
get_profile,
|
||||
get_contact_list,
|
||||
set_contact_list,
|
||||
create_profile,
|
||||
is_contact_list_empty,
|
||||
check_contact,
|
||||
toggle_contact,
|
||||
get_nstore,
|
||||
set_nstore,
|
||||
set_wallet,
|
||||
load_wallet,
|
||||
remove_wallet,
|
||||
zap_profile,
|
||||
zap_event,
|
||||
friend_to_friend,
|
||||
get_notifications,
|
||||
get_settings,
|
||||
set_new_settings,
|
||||
verify_nip05,
|
||||
get_event_meta,
|
||||
get_event,
|
||||
get_event_from,
|
||||
get_replies,
|
||||
listen_event_reply,
|
||||
get_events_by,
|
||||
get_local_events,
|
||||
listen_local_event,
|
||||
get_group_events,
|
||||
get_global_events,
|
||||
get_hashtag_events,
|
||||
publish,
|
||||
reply,
|
||||
repost,
|
||||
event_to_bech32,
|
||||
user_to_bech32,
|
||||
unlisten,
|
||||
create_column,
|
||||
close_column,
|
||||
reposition_column,
|
||||
resize_column,
|
||||
reload_column,
|
||||
open_window,
|
||||
open_main_window,
|
||||
force_quit,
|
||||
set_badge
|
||||
]);
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
let builder = builder.path("../packages/system/src/commands.ts");
|
||||
|
||||
builder.build().unwrap()
|
||||
};
|
||||
builder
|
||||
.export(Typescript::default(), "../packages/system/src/commands.ts")
|
||||
.expect("Failed to export typescript bindings");
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
let builder = tauri::Builder::default().plugin(tauri_nspanel::init());
|
||||
let tauri_builder = tauri::Builder::default().plugin(tauri_nspanel::init());
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
let builder = tauri::Builder::default();
|
||||
let tauri_builder = tauri::Builder::default();
|
||||
|
||||
let mut ctx = tauri::generate_context!();
|
||||
|
||||
tauri_builder
|
||||
.invoke_handler(builder.invoke_handler())
|
||||
.setup(move |app| {
|
||||
builder.mount_events(app);
|
||||
|
||||
builder
|
||||
.setup(|app| {
|
||||
#[cfg(target_os = "macos")]
|
||||
app.handle().plugin(tauri_nspanel::init()).unwrap();
|
||||
|
||||
@@ -257,7 +264,6 @@ fn main() {
|
||||
.plugin(tauri_plugin_shell::init())
|
||||
.plugin(tauri_plugin_upload::init())
|
||||
.plugin(tauri_plugin_updater::Builder::new().build())
|
||||
.invoke_handler(invoke_handler)
|
||||
.run(ctx)
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
use crate::Settings;
|
||||
use nostr_sdk::prelude::*;
|
||||
|
||||
pub async fn init_nip65(client: &Client) {
|
||||
let signer = match client.signer().await {
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
let filter = Filter::new()
|
||||
.author(public_key)
|
||||
.kind(Kind::RelayList)
|
||||
.limit(1);
|
||||
|
||||
if let Ok(events) = client.get_events_of(vec![filter], None).await {
|
||||
if let Some(event) = events.first() {
|
||||
let relay_list = nip65::extract_relay_list(event);
|
||||
for (url, metadata) in relay_list {
|
||||
let opts = match metadata {
|
||||
Some(RelayMetadata::Read) => RelayOptions::new().read(true).write(false),
|
||||
Some(_) => RelayOptions::new().write(true).read(false),
|
||||
None => RelayOptions::default(),
|
||||
};
|
||||
if let Err(e) = client.add_relay_with_opts(&url.to_string(), opts).await {
|
||||
eprintln!("Failed to add relay {}: {:?}", url, e);
|
||||
}
|
||||
if let Err(e) = client.connect_relay(url.to_string()).await {
|
||||
eprintln!("Failed to connect to relay {}: {:?}", url, e);
|
||||
} else {
|
||||
println!("Connecting to relay: {} - {:?}", url, metadata);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
eprintln!("Failed to get events for RelayList.");
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_user_settings(client: &Client) -> Result<Settings, String> {
|
||||
let ident = "lume:settings";
|
||||
let signer = client
|
||||
.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()
|
||||
.author(public_key)
|
||||
.kind(Kind::ApplicationSpecificData)
|
||||
.identifier(ident)
|
||||
.limit(1);
|
||||
|
||||
match client.get_events_of(vec![filter], None).await {
|
||||
Ok(events) => {
|
||||
if let Some(event) = events.first() {
|
||||
let content = event.content();
|
||||
match signer.nip44_decrypt(public_key, content).await {
|
||||
Ok(decrypted) => match serde_json::from_str(&decrypted) {
|
||||
Ok(parsed) => Ok(parsed),
|
||||
Err(_) => Err("Could not parse settings payload".into()),
|
||||
},
|
||||
Err(e) => Err(format!("Failed to decrypt settings content: {:?}", e)),
|
||||
}
|
||||
} else {
|
||||
Err("Settings not found.".into())
|
||||
}
|
||||
}
|
||||
Err(e) => Err(format!(
|
||||
"Failed to get events for ApplicationSpecificData: {:?}",
|
||||
e
|
||||
)),
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
pub mod event;
|
||||
mod internal;
|
||||
pub mod keys;
|
||||
pub mod metadata;
|
||||
pub mod relay;
|
||||
mod utils;
|
||||
pub use utils::get_latest_event;
|
||||
Reference in New Issue
Block a user