Thread relay changes through the overlord so that subscriptions can be updated

This commit is contained in:
Mike Dilger 2024-01-18 10:29:12 +13:00
parent a7a36bdd9b
commit 6373b0550a
7 changed files with 111 additions and 74 deletions

View File

@ -1,6 +1,6 @@
//#![allow(dead_code)]
use eframe::egui::{self, *};
use nostr_types::{PublicKeyHex, Unixtime};
use nostr_types::{PublicKeyHex, RelayUrl, Unixtime};
use crate::ui::{widgets, GossipUi};
use gossip_lib::{comms::ToOverlordMessage, Relay, GLOBALS};
@ -356,16 +356,12 @@ impl RelayEntry {
true,
);
if response.clicked() {
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| {
relay.clear_usage_bits(
//Relay::ADVERTISE
Relay::DISCOVER | Relay::INBOX | Relay::OUTBOX | Relay::READ | Relay::WRITE,
)
},
None,
);
modify_relay(&self.relay.url, |relay| {
relay.clear_usage_bits(
//Relay::ADVERTISE
Relay::DISCOVER | Relay::INBOX | Relay::OUTBOX | Relay::READ | Relay::WRITE,
)
});
}
let pos = pos + vec2(200.0, 0.0);
@ -707,19 +703,15 @@ impl RelayEntry {
off_fill,
);
if response.changed() {
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::READ, self.usage.read),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::READ, self.usage.read)
});
if !self.usage.read {
// if read was turned off, inbox must also be turned off
self.usage.inbox = false;
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::INBOX, self.usage.inbox),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::INBOX, self.usage.inbox)
});
}
}
response.on_hover_text(READ_HOVER_TEXT);
@ -767,11 +759,9 @@ impl RelayEntry {
off_fill,
);
if response.changed() {
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::INBOX, self.usage.inbox),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::INBOX, self.usage.inbox)
});
}
response.on_hover_text(INBOX_HOVER_TEXT);
draw_text_at(
@ -799,19 +789,15 @@ impl RelayEntry {
off_fill,
);
if response.changed() {
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::WRITE, self.usage.write),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::WRITE, self.usage.write)
});
if !self.usage.write {
// if write was turned off, outbox must also be turned off
self.usage.outbox = false;
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::OUTBOX, self.usage.outbox),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::OUTBOX, self.usage.outbox)
});
}
}
response.on_hover_text(WRITE_HOVER_TEXT);
@ -859,11 +845,9 @@ impl RelayEntry {
off_fill,
);
if response.changed() {
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::OUTBOX, self.usage.outbox),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::OUTBOX, self.usage.outbox)
});
}
response.on_hover_text(OUTBOX_HOVER_TEXT);
draw_text_at(
@ -891,11 +875,9 @@ impl RelayEntry {
off_fill,
);
if response.changed() {
let _ = GLOBALS.storage.modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::DISCOVER, self.usage.discover),
None,
);
modify_relay(&self.relay.url, |relay| {
relay.adjust_usage_bit(Relay::DISCOVER, self.usage.discover)
});
}
response.on_hover_text(DISCOVER_HOVER_TEXT);
draw_text_at(
@ -924,10 +906,9 @@ impl RelayEntry {
off_fill,
);
if response.changed() {
let _ = GLOBALS.storage.modify_relay(
modify_relay(
&self.relay.url,
|relay| relay.adjust_usage_bit(Relay::ADVERTISE, self.usage.advertise),
None,
);
}
response.on_hover_text(ADVERTISE_HOVER_TEXT);
@ -1108,3 +1089,23 @@ impl Widget for RelayEntry {
}
}
}
fn modify_relay<M>(relay_url: &RelayUrl, mut modify: M)
where
M: FnMut(&mut Relay),
{
// Load relay record
let mut relay = GLOBALS
.storage
.read_or_create_relay(relay_url, None)
.unwrap();
let old = relay.clone();
// Run modification
modify(&mut relay);
// Save relay via the Overlord, so minions can be updated
let _ = GLOBALS
.to_overlord
.send(ToOverlordMessage::UpdateRelay(old, relay));
}

View File

@ -4,6 +4,7 @@ use egui::widgets::{Button, Slider};
use egui::{Align, Context, Layout};
use gossip_lib::comms::ToOverlordMessage;
use gossip_lib::{FeedKind, PersonList, Relay, GLOBALS};
use nostr_types::RelayUrl;
mod follow_people;
mod import_keys;
@ -276,3 +277,23 @@ fn complete_wizard(app: &mut GossipUi, ctx: &Context) {
.to_overlord
.send(ToOverlordMessage::StartLongLivedSubscriptions);
}
fn modify_relay<M>(relay_url: &RelayUrl, mut modify: M)
where
M: FnMut(&mut Relay),
{
// Load relay record
let mut relay = GLOBALS
.storage
.read_or_create_relay(relay_url, None)
.unwrap();
let old = relay.clone();
// Run modification
modify(&mut relay);
// Save relay via the Overlord, so minions can be updated
let _ = GLOBALS
.to_overlord
.send(ToOverlordMessage::UpdateRelay(old, relay));
}

View File

@ -1,3 +1,4 @@
use super::modify_relay;
use crate::ui::wizard::{WizardPage, DEFAULT_RELAYS};
use crate::ui::{GossipUi, Page};
use eframe::egui;
@ -72,9 +73,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
for relay in outbox_relays.iter() {
ui.horizontal(|ui| {
if ui.button("🗑").clicked() {
let mut r = relay.clone();
r.clear_usage_bits(Relay::OUTBOX | Relay::WRITE);
let _ = GLOBALS.storage.write_relay(&r, None);
modify_relay(&relay.url, |relay| {
relay.clear_usage_bits(Relay::OUTBOX | Relay::WRITE);
});
}
ui.label(relay.url.as_str());
});
@ -101,9 +102,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
for relay in inbox_relays.iter() {
ui.horizontal(|ui| {
if ui.button("🗑").clicked() {
let mut r = relay.clone();
r.clear_usage_bits(Relay::INBOX | Relay::READ);
let _ = GLOBALS.storage.write_relay(&r, None);
modify_relay(&relay.url, |relay| {
relay.clear_usage_bits(Relay::INBOX | Relay::READ);
});
}
ui.label(relay.url.as_str());
});
@ -129,9 +130,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
for relay in discovery_relays.iter() {
ui.horizontal(|ui| {
if ui.button("🗑").clicked() {
let mut r = relay.clone();
r.clear_usage_bits(Relay::DISCOVER);
let _ = GLOBALS.storage.write_relay(&r, None);
modify_relay(&relay.url, |relay| {
relay.clear_usage_bits(Relay::DISCOVER);
});
}
ui.label(relay.url.as_str());
});
@ -180,9 +181,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
if !relay_options.contains_key(&rurl) {
relay_options.insert(rurl.clone(), read_relay(&rurl));
}
let r = relay_options.get_mut(&rurl).unwrap();
r.set_usage_bits(Relay::OUTBOX | Relay::WRITE);
let _ = GLOBALS.storage.write_relay(r, None);
modify_relay(&rurl, |relay| {
relay.set_usage_bits(Relay::OUTBOX | Relay::WRITE);
});
} else {
app.wizard_state.error = Some("ERROR: Invalid Relay URL".to_owned());
}
@ -193,9 +194,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
if !relay_options.contains_key(&rurl) {
relay_options.insert(rurl.clone(), read_relay(&rurl));
}
let r = relay_options.get_mut(&rurl).unwrap();
r.set_usage_bits(Relay::INBOX | Relay::READ);
let _ = GLOBALS.storage.write_relay(r, None);
modify_relay(&rurl, |relay| {
relay.set_usage_bits(Relay::INBOX | Relay::READ);
});
} else {
app.wizard_state.error = Some("ERROR: Invalid Relay URL".to_owned());
}
@ -206,9 +207,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra
if !relay_options.contains_key(&rurl) {
relay_options.insert(rurl.clone(), read_relay(&rurl));
}
let r = relay_options.get_mut(&rurl).unwrap();
r.set_usage_bits(Relay::DISCOVER);
let _ = GLOBALS.storage.write_relay(r, None);
modify_relay(&rurl, |relay| {
relay.set_usage_bits(Relay::DISCOVER);
});
} else {
app.wizard_state.error = Some("ERROR: Invalid Relay URL".to_owned());
}

View File

@ -91,11 +91,7 @@ impl WizardState {
if self.need_discovery_relays() {
let purplepages = RelayUrl::try_from_str("wss://purplepag.es/").unwrap();
let _ = GLOBALS.storage.modify_relay(
&purplepages,
|relay| relay.set_usage_bits(Relay::DISCOVER),
None,
);
super::modify_relay(&purplepages, |relay| relay.set_usage_bits(Relay::DISCOVER));
}
// Copy any new status queue messages into our local error variable

View File

@ -1,5 +1,6 @@
use crate::dm_channel::DmChannel;
use crate::people::PersonList;
use crate::relay::Relay;
use nostr_types::{
Event, EventAddr, Id, IdHex, Metadata, MilliSatoshi, Profile, PublicKey, RelayUrl, Tag,
UncheckedUrl, Unixtime,
@ -177,6 +178,9 @@ pub enum ToOverlordMessage {
merge: bool,
},
/// Calls [update_relay](crate::Overlord::update_relay)
UpdateRelay(Relay, Relay),
/// Calls [visible_notes_changed](crate::Overlord::visible_notes_changed)
VisibleNotesChanged(Vec<Id>),

View File

@ -694,6 +694,9 @@ impl Overlord {
ToOverlordMessage::UpdatePersonList { person_list, merge } => {
self.update_person_list(person_list, merge).await?;
}
ToOverlordMessage::UpdateRelay(old, new) => {
self.update_relay(old, new).await?;
}
ToOverlordMessage::VisibleNotesChanged(visible) => {
self.visible_notes_changed(visible).await?;
}
@ -2938,6 +2941,17 @@ impl Overlord {
Ok(())
}
/// Update the relay. This saves the new relay and also adjusts active
/// subscriptions based on the changes.
pub async fn update_relay(&mut self, _old: Relay, new: Relay) -> Result<(), Error> {
// FIXME: update minion subscriptions here based on the diff
// write new
let _ = GLOBALS.storage.write_relay(&new, None);
Ok(())
}
/// Set which notes are currently visible to the user. This is used to modify subscriptions
/// that query for likes, zaps, and deletions. Such subscriptions only query for that data
/// for events currently in view, to keep them small.

View File

@ -949,7 +949,7 @@ impl Storage {
/// NOTE: this overwrites. You may wish to read first, or you might prefer
/// [modify_relay](Storage::modify_relay)
#[inline]
pub fn write_relay<'a>(
pub(crate) fn write_relay<'a>(
&'a self,
relay: &Relay,
rw_txn: Option<&mut RwTxn<'a>>,
@ -983,7 +983,7 @@ impl Storage {
/// Modify a relay record
#[inline]
pub fn modify_relay<'a, M>(
pub(crate) fn modify_relay<'a, M>(
&'a self,
url: &RelayUrl,
modify: M,
@ -997,7 +997,7 @@ impl Storage {
//// Modify all relay records
#[inline]
pub fn modify_all_relays<'a, M>(
pub(crate) fn modify_all_relays<'a, M>(
&'a self,
modify: M,
rw_txn: Option<&mut RwTxn<'a>>,