commit b3d8ef373a5284b254cb8ccac81250d251024500
parent adc74dd7c91ca884d6cdae390fb72666df7e4d64
Author: William Casarin <jb55@jb55.com>
Date: Sat, 10 Feb 2024 15:11:10 -0800
profiles: fetch missing profiles when receiving notes
Diffstat:
M | src/app.rs | | | 38 | +++++++++++++++++++++++++++++++------- |
1 file changed, 31 insertions(+), 7 deletions(-)
diff --git a/src/app.rs b/src/app.rs
@@ -151,7 +151,7 @@ fn send_initial_filters(pool: &mut RelayPool, relay_url: &str) {
}
}
-fn try_process_event(damus: &mut Damus, ctx: &egui::Context) {
+fn try_process_event(damus: &mut Damus, ctx: &egui::Context) -> Result<()> {
let amount = 0.2;
if ctx.input(|i| i.key_pressed(egui::Key::Equals)) {
ctx.set_pixels_per_point(ctx.pixels_per_point() + amount);
@@ -179,14 +179,42 @@ fn try_process_event(damus: &mut Damus, ctx: &egui::Context) {
}
}
+ let txn = Transaction::new(&damus.ndb)?;
+ let mut seen_pubkeys: HashSet<&[u8; 32]> = HashSet::new();
for timeline in 0..damus.timelines.len() {
- if let Err(err) = poll_notes_for_timeline(damus, timeline) {
+ if let Err(err) = poll_notes_for_timeline(damus, &txn, timeline, &mut seen_pubkeys) {
error!("{}", err);
}
}
+
+ let mut pubkeys_to_fetch: Vec<&[u8; 32]> = vec![];
+ for pubkey in seen_pubkeys {
+ if let Err(_) = damus.ndb.get_profile_by_pubkey(&txn, pubkey) {
+ pubkeys_to_fetch.push(pubkey)
+ }
+ }
+
+ if pubkeys_to_fetch.len() > 0 {
+ let filter = Filter::new()
+ .authors(pubkeys_to_fetch.iter().map(|p| Pubkey::new(*p)).collect())
+ .kinds(vec![0]);
+ info!(
+ "Getting {} unknown author profiles from relays",
+ pubkeys_to_fetch.len()
+ );
+ let msg = ClientMessage::req("profiles".to_string(), vec![filter]);
+ damus.pool.send(&msg);
+ }
+
+ Ok(())
}
-fn poll_notes_for_timeline(damus: &mut Damus, timeline: usize) -> Result<()> {
+fn poll_notes_for_timeline<'a>(
+ damus: &mut Damus,
+ txn: &'a Transaction,
+ timeline: usize,
+ pubkeys: &mut HashSet<&'a [u8; 32]>,
+) -> Result<()> {
let sub = if let Some(sub) = &damus.timelines[timeline].subscription {
sub
} else {
@@ -198,10 +226,6 @@ fn poll_notes_for_timeline(damus: &mut Damus, timeline: usize) -> Result<()> {
info!("{} new notes! {:?}", new_note_ids.len(), new_note_ids);
}
- let txn = Transaction::new(&damus.ndb)?;
-
- let mut pubkeys: HashSet<&[u8; 32]> = HashSet::new();
-
let new_refs = new_note_ids
.iter()
.map(|key| {