mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-20 03:57:03 +00:00
Thread relay changes through the overlord so that subscriptions can be updated
This commit is contained in:
parent
a7a36bdd9b
commit
6373b0550a
@ -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));
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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>),
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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>>,
|
||||
|
Loading…
Reference in New Issue
Block a user