From bd1f2b899d0a2a5ada2ec7c5c8a4b12057b714ad Mon Sep 17 00:00:00 2001 From: reya Date: Mon, 4 Nov 2024 09:40:33 +0700 Subject: [PATCH] refactor: sync based on interval not window event --- src-tauri/Cargo.lock | 16 +-- src-tauri/icons/tray.png | Bin 0 -> 620 bytes src-tauri/src/main.rs | 200 ++++++++++++++++++-------------------- src-tauri/tauri.conf.json | 7 ++ tray.png | Bin 0 -> 7717 bytes 5 files changed, 111 insertions(+), 112 deletions(-) create mode 100644 src-tauri/icons/tray.png create mode 100644 tray.png diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 69904299..9014722a 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3480,7 +3480,7 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "nostr" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "aes", "async-trait", @@ -3511,7 +3511,7 @@ dependencies = [ [[package]] name = "nostr-connect" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "async-trait", "async-utility", @@ -3525,7 +3525,7 @@ dependencies = [ [[package]] name = "nostr-database" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "async-trait", "flatbuffers", @@ -3539,7 +3539,7 @@ dependencies = [ [[package]] name = "nostr-lmdb" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "heed", "nostr", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "nostr-relay-pool" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "async-utility", "async-wsocket", @@ -3570,7 +3570,7 @@ dependencies = [ [[package]] name = "nostr-sdk" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "async-utility", "atomic-destructor", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "nostr-zapper" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "async-trait", "nostr", @@ -3733,7 +3733,7 @@ dependencies = [ [[package]] name = "nwc" version = "0.35.0" -source = "git+https://github.com/rust-nostr/nostr#497c72f5a255c3d0cdf2a837e85c24be3d162fc0" +source = "git+https://github.com/rust-nostr/nostr#4da48df74e494f8705e4887ce31a63adeba7b47b" dependencies = [ "async-trait", "async-utility", diff --git a/src-tauri/icons/tray.png b/src-tauri/icons/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..a96645bfc0b6f49f1e1da69b2a89691533334998 GIT binary patch literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di3`~rkE{-7;jBjW6<{mN-XpLXRH$iZZ0=7!GsUNz_bbCpK!XY+i$I|J0be*!!mKrJwNQK_o7jSp; z_GfoyY-Dy?JnR04m=kL%`M)PCPKsY$r@3aQv9Z`O)>Xe>{}c4i=KU4#be}uO;#14B zKVM6(vuCgV@3?UC`3D}#j3JfZV-kwt-(zA~ zS9kQxt8i%z^;s4P9R3N1UU`4fIiP(gIr<+D{~i{F-`TG@eHh}|&lm{Su+B(U`oX1O zAQ-{$L(xF+)(!3+DKUnLhnW@2^X^{73vP!-P zx5cB<1gHH=+W$?|xX)%i^WVnaX5sS^a=TVpzA|>UN(q17=ESu?c#_EcWqVa`e`j2| zk7dG(1N(9>Y-12gRjq&H-6?07P{S(GQY*R4@_vy}TKvH+XKI0ogTd3)&t;ucLK6T| CoB4?V literal 0 HcmV?d00001 diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index e9187331..348227e6 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -30,7 +30,6 @@ pub mod common; pub struct Nostr { client: Client, queue: RwLock>, - is_syncing: RwLock, settings: RwLock, } @@ -68,7 +67,7 @@ pub const QUEUE_DELAY: u64 = 300; pub const NOTIFICATION_SUB_ID: &str = "lume_notification"; fn main() { - tracing_subscriber::fmt::init(); + // tracing_subscriber::fmt::init(); let builder = Builder::::new().commands(collect_commands![ get_relays, @@ -231,110 +230,9 @@ fn main() { app.manage(Nostr { client, queue: RwLock::new(HashSet::new()), - is_syncing: RwLock::new(false), settings: RwLock::new(Settings::default()), }); - // Trigger some actions for window events - main_window.on_window_event(move |event| match event { - tauri::WindowEvent::Focused(focused) => { - if !focused { - let handle = handle_clone_event.clone(); - - tauri::async_runtime::spawn(async move { - let state = handle.state::(); - let client = &state.client; - - if *state.is_syncing.read().await { - return; - } - - let mut is_syncing = state.is_syncing.write().await; - - // Mark sync in progress - *is_syncing = true; - - let opts = SyncOptions::default(); - let accounts = get_all_accounts(); - - if !accounts.is_empty() { - let public_keys: Vec = accounts - .iter() - .filter_map(|acc| PublicKey::from_str(acc).ok()) - .collect(); - - let filter = Filter::new().pubkeys(public_keys).kinds(vec![ - Kind::TextNote, - Kind::Repost, - Kind::Reaction, - Kind::ZapReceipt, - ]); - - if let Ok(output) = client.sync(filter, &opts).await { - println!("Received: {}", output.received.len()) - } - } - - let filter = Filter::new().kinds(vec![ - Kind::TextNote, - Kind::Repost, - Kind::ContactList, - Kind::FollowSet, - ]); - - // Get all public keys in database - if let Ok(events) = client.database().query(vec![filter]).await { - let public_keys: HashSet = events - .iter() - .flat_map(|ev| ev.tags.public_keys().copied()) - .collect(); - let pk_vec: Vec = public_keys.into_iter().collect(); - - for chunk in pk_vec.chunks(500) { - if chunk.is_empty() { - return; - } - - let authors = chunk.to_owned(); - - let filter = Filter::new() - .authors(authors.clone()) - .kinds(vec![ - Kind::Metadata, - Kind::FollowSet, - Kind::Interests, - Kind::InterestSet, - ]) - .limit(1000); - - if let Ok(output) = client.sync(filter, &opts).await { - println!("Received: {}", output.received.len()) - } - - let filter = Filter::new() - .authors(authors) - .kinds(vec![ - Kind::TextNote, - Kind::Repost, - Kind::EventDeletion, - ]) - .limit(500); - - if let Ok(output) = client.sync(filter, &opts).await { - println!("Received: {}", output.received.len()) - } - } - } - - // Mark sync is done - *is_syncing = false; - }); - } - } - tauri::WindowEvent::Moved(_size) => {} - _ => {} - }); - // Listen for request metadata app.listen_any("request_metadata", move |event| { let payload = event.payload(); @@ -379,7 +277,101 @@ fn main() { }); }); - // Run notification thread + // Run a thread for negentropy + tauri::async_runtime::spawn(async move { + let state = handle_clone_event.state::(); + let client = &state.client; + + // Use default sync options + let opts = SyncOptions::default(); + + // Set interval + let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(600)); + + loop { + interval.tick().await; + + let accounts = get_all_accounts(); + let public_keys: Vec = accounts + .iter() + .filter_map(|acc| PublicKey::from_str(acc).ok()) + .collect(); + + if !public_keys.is_empty() { + // Create filter for notification + // + let filter = Filter::new().pubkeys(public_keys.clone()).kinds(vec![ + Kind::TextNote, + Kind::Repost, + Kind::Reaction, + Kind::ZapReceipt, + ]); + + // Sync notification + // + if let Ok(output) = client.sync(filter, &opts).await { + println!("Received: {}", output.received.len()) + } + + // Create filter for contact list + // + let filter = Filter::new() + .authors(public_keys) + .kinds(vec![Kind::ContactList, Kind::FollowSet]); + + // Sync events for contact list + // + if let Ok(events) = client.database().query(vec![filter]).await { + // Get unique public keys + let public_keys: HashSet = events + .iter() + .flat_map(|ev| ev.tags.public_keys().copied()) + .collect(); + + // Convert to vector + let public_keys: Vec = public_keys.into_iter().collect(); + + for chunk in public_keys.chunks(1000) { + if chunk.is_empty() { + return; + } + + let authors = chunk.to_owned(); + + // Create filter for metadata + // + let filter = Filter::new().authors(authors.clone()).kinds(vec![ + Kind::Metadata, + Kind::FollowSet, + Kind::Interests, + Kind::InterestSet, + ]); + + // Sync metadata + // + if let Ok(output) = client.sync(filter, &opts).await { + println!("Received: {}", output.received.len()) + } + + // Create filter for text note + // + let filter = Filter::new() + .authors(authors) + .kinds(vec![Kind::TextNote, Kind::Repost, Kind::EventDeletion]) + .limit(100); + + // Sync text note + // + if let Ok(output) = client.sync(filter, &opts).await { + println!("Received: {}", output.received.len()) + } + } + } + } + } + }); + + // Run a thread for handle notification tauri::async_runtime::spawn(async move { let state = handle_clone.state::(); let client = &state.client; diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 59db9e07..f2f0aecf 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -30,6 +30,13 @@ "$RESOURCE/*" ] } + }, + "trayIcon": { + "id": "main", + "iconAsTemplate": true, + "menuOnLeftClick": true, + "tooltip": "Lume", + "iconPath": "./icons/tray.png" } }, "bundle": { diff --git a/tray.png b/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..b9102bbea220e6bff25cebb9d3644583ac3ec856 GIT binary patch literal 7717 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 literal 0 HcmV?d00001