Merge additional account relay list improvements from Ken
Ken Sedgwick (1):
additional account relay list improvements
This commit is contained in:
@@ -343,6 +343,10 @@ impl Accounts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn needs_relay_config(&mut self) {
|
||||||
|
self.needs_relay_config = true;
|
||||||
|
}
|
||||||
|
|
||||||
fn contains_account(&self, pubkey: &[u8; 32]) -> Option<ContainsAccount> {
|
fn contains_account(&self, pubkey: &[u8; 32]) -> Option<ContainsAccount> {
|
||||||
for (index, account) in self.accounts.iter().enumerate() {
|
for (index, account) in self.accounts.iter().enumerate() {
|
||||||
let has_pubkey = account.pubkey.bytes() == pubkey;
|
let has_pubkey = account.pubkey.bytes() == pubkey;
|
||||||
@@ -422,6 +426,15 @@ impl Accounts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_selected_account_data(&self) -> Option<&AccountData> {
|
||||||
|
if let Some(account) = self.get_selected_account() {
|
||||||
|
if let Some(account_data) = self.account_data.get(account.pubkey.bytes()) {
|
||||||
|
return Some(account_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
pub fn select_account(&mut self, index: usize) {
|
pub fn select_account(&mut self, index: usize) {
|
||||||
if let Some(account) = self.accounts.get(index) {
|
if let Some(account) = self.accounts.get(index) {
|
||||||
self.currently_selected_account = Some(index);
|
self.currently_selected_account = Some(index);
|
||||||
@@ -532,12 +545,17 @@ impl Accounts {
|
|||||||
pool: &mut RelayPool,
|
pool: &mut RelayPool,
|
||||||
wakeup: impl Fn() + Send + Sync + Clone + 'static,
|
wakeup: impl Fn() + Send + Sync + Clone + 'static,
|
||||||
) {
|
) {
|
||||||
|
debug!(
|
||||||
|
"updating relay configuration for currently selected account {:?}",
|
||||||
|
self.currently_selected_account
|
||||||
|
);
|
||||||
|
|
||||||
// If forced relays are set use them only
|
// If forced relays are set use them only
|
||||||
let mut desired_relays = self.forced_relays.clone();
|
let mut desired_relays = self.forced_relays.clone();
|
||||||
|
|
||||||
// Compose the desired relay lists from the accounts
|
// Compose the desired relay lists from the selected account
|
||||||
if desired_relays.is_empty() {
|
if desired_relays.is_empty() {
|
||||||
for data in self.account_data.values() {
|
if let Some(data) = self.get_selected_account_data() {
|
||||||
desired_relays.extend(data.relay.local.iter().cloned());
|
desired_relays.extend(data.relay.local.iter().cloned());
|
||||||
desired_relays.extend(data.relay.advertised.iter().cloned());
|
desired_relays.extend(data.relay.advertised.iter().cloned());
|
||||||
}
|
}
|
||||||
@@ -621,9 +639,17 @@ impl Accounts {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_advertised_relay(&mut self, relay_to_add: &str, pool: &mut RelayPool) {
|
fn modify_advertised_relays(
|
||||||
let relay_to_add = AccountRelayData::canonicalize_url(relay_to_add);
|
&mut self,
|
||||||
info!("add advertised relay \"{}\"", relay_to_add);
|
relay_url: &str,
|
||||||
|
pool: &mut RelayPool,
|
||||||
|
action: RelayAction,
|
||||||
|
) {
|
||||||
|
let relay_url = AccountRelayData::canonicalize_url(relay_url);
|
||||||
|
match action {
|
||||||
|
RelayAction::Add => info!("add advertised relay \"{}\"", relay_url),
|
||||||
|
RelayAction::Remove => info!("remove advertised relay \"{}\"", relay_url),
|
||||||
|
}
|
||||||
match self.currently_selected_account {
|
match self.currently_selected_account {
|
||||||
None => error!("no account is currently selected."),
|
None => error!("no account is currently selected."),
|
||||||
Some(index) => match self.accounts.get(index) {
|
Some(index) => match self.accounts.get(index) {
|
||||||
@@ -635,13 +661,21 @@ impl Accounts {
|
|||||||
Some(account_data) => {
|
Some(account_data) => {
|
||||||
let advertised = &mut account_data.relay.advertised;
|
let advertised = &mut account_data.relay.advertised;
|
||||||
if advertised.is_empty() {
|
if advertised.is_empty() {
|
||||||
// If the selected account has no advertised relays
|
// If the selected account has no advertised relays,
|
||||||
// iniitialize with the bootstrapping set.
|
// initialize with the bootstrapping set.
|
||||||
advertised.extend(self.bootstrap_relays.iter().cloned());
|
advertised.extend(self.bootstrap_relays.iter().cloned());
|
||||||
}
|
}
|
||||||
advertised.insert(RelaySpec::new(relay_to_add, false, false));
|
match action {
|
||||||
|
RelayAction::Add => {
|
||||||
|
advertised.insert(RelaySpec::new(relay_url, false, false));
|
||||||
|
}
|
||||||
|
RelayAction::Remove => {
|
||||||
|
advertised.remove(&RelaySpec::new(relay_url, false, false));
|
||||||
|
}
|
||||||
|
}
|
||||||
self.needs_relay_config = true;
|
self.needs_relay_config = true;
|
||||||
// If we have the secret key publish the nip-65 relay list
|
|
||||||
|
// If we have the secret key publish the NIP-65 relay list
|
||||||
if let Some(secretkey) = &keypair.secret_key {
|
if let Some(secretkey) = &keypair.secret_key {
|
||||||
account_data
|
account_data
|
||||||
.relay
|
.relay
|
||||||
@@ -653,6 +687,19 @@ impl Accounts {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn add_advertised_relay(&mut self, relay_to_add: &str, pool: &mut RelayPool) {
|
||||||
|
self.modify_advertised_relays(relay_to_add, pool, RelayAction::Add);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn remove_advertised_relay(&mut self, relay_to_remove: &str, pool: &mut RelayPool) {
|
||||||
|
self.modify_advertised_relays(relay_to_remove, pool, RelayAction::Remove);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum RelayAction {
|
||||||
|
Add,
|
||||||
|
Remove,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_selected_index(accounts: &[UserAccount], keystore: &KeyStorageType) -> Option<usize> {
|
fn get_selected_index(accounts: &[UserAccount], keystore: &KeyStorageType) -> Option<usize> {
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ pub fn process_accounts_view_response(
|
|||||||
router.route_to(Route::add_account());
|
router.route_to(Route::add_account());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
accounts.needs_relay_config();
|
||||||
selection
|
selection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ impl<'a> RelayPoolManager<'a> {
|
|||||||
indices.iter().for_each(|index| self.remove_relay(*index));
|
indices.iter().for_each(|index| self.remove_relay(*index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME - this is not ever called?
|
||||||
pub fn add_relay(&mut self, ctx: &egui::Context, relay_url: String) {
|
pub fn add_relay(&mut self, ctx: &egui::Context, relay_url: String) {
|
||||||
let _ = self.pool.add_url(relay_url, create_wakeup(ctx));
|
let _ = self.pool.add_url(relay_url, create_wakeup(ctx));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,9 @@ impl View for RelayView<'_> {
|
|||||||
.scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden)
|
.scroll_bar_visibility(egui::scroll_area::ScrollBarVisibility::AlwaysHidden)
|
||||||
.auto_shrink([false; 2])
|
.auto_shrink([false; 2])
|
||||||
.show(ui, |ui| {
|
.show(ui, |ui| {
|
||||||
if let Some(indices) = self.show_relays(ui) {
|
if let Some(relay_to_remove) = self.show_relays(ui) {
|
||||||
self.manager.remove_relays(indices);
|
self.accounts
|
||||||
|
.remove_advertised_relay(&relay_to_remove, self.manager.pool);
|
||||||
}
|
}
|
||||||
ui.add_space(8.0);
|
ui.add_space(8.0);
|
||||||
if let Some(relay_to_add) = self.show_add_relay_ui(ui) {
|
if let Some(relay_to_add) = self.show_add_relay_ui(ui) {
|
||||||
@@ -66,9 +67,9 @@ impl<'a> RelayView<'a> {
|
|||||||
egui::CentralPanel::default().show(ui.ctx(), |ui| self.ui(ui));
|
egui::CentralPanel::default().show(ui.ctx(), |ui| self.ui(ui));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Show the current relays, and returns the indices of relays the user requested to delete
|
/// Show the current relays and return a relay the user selected to delete
|
||||||
fn show_relays(&'a self, ui: &mut Ui) -> Option<Vec<usize>> {
|
fn show_relays(&'a self, ui: &mut Ui) -> Option<String> {
|
||||||
let mut indices_to_remove: Option<Vec<usize>> = None;
|
let mut relay_to_remove = None;
|
||||||
for (index, relay_info) in self.manager.get_relay_infos().iter().enumerate() {
|
for (index, relay_info) in self.manager.get_relay_infos().iter().enumerate() {
|
||||||
ui.add_space(8.0);
|
ui.add_space(8.0);
|
||||||
ui.vertical_centered_justified(|ui| {
|
ui.vertical_centered_justified(|ui| {
|
||||||
@@ -106,7 +107,7 @@ impl<'a> RelayView<'a> {
|
|||||||
|
|
||||||
ui.with_layout(Layout::right_to_left(Align::Center), |ui| {
|
ui.with_layout(Layout::right_to_left(Align::Center), |ui| {
|
||||||
if ui.add(delete_button(ui.visuals().dark_mode)).clicked() {
|
if ui.add(delete_button(ui.visuals().dark_mode)).clicked() {
|
||||||
indices_to_remove.get_or_insert_with(Vec::new).push(index);
|
relay_to_remove = Some(relay_info.relay_url.to_string());
|
||||||
};
|
};
|
||||||
|
|
||||||
show_connection_status(ui, relay_info.status);
|
show_connection_status(ui, relay_info.status);
|
||||||
@@ -115,8 +116,7 @@ impl<'a> RelayView<'a> {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
relay_to_remove
|
||||||
indices_to_remove
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const RELAY_PREFILL: &'static str = "wss://";
|
const RELAY_PREFILL: &'static str = "wss://";
|
||||||
|
|||||||
Reference in New Issue
Block a user