Merge commit 'cfd0a06a9a0dba726fe46a09adc125a63d2efac2' into feature/pending-notifications

# Conflicts:
#	gossip-bin/src/ui/notifications/mod.rs
This commit is contained in:
Bu5hm4nn 2024-03-28 22:48:11 -06:00
commit 5b0d07daaa
9 changed files with 76 additions and 70 deletions

View File

@ -47,7 +47,7 @@ tracing-subscriber = { version = "0.3", features = [ "std", "env-filter" ] }
url = "2.4"
usvg = "0.35.0"
zeroize = "1.6"
chrono = "0.4.37"
chrono = ">=0.4.37"
[package.metadata.deb]
section = "web"

View File

@ -65,26 +65,30 @@ pub(super) fn calc(app: &mut GossipUi) {
for (item, time) in GLOBALS.pending.read().iter() {
match item {
PendingItem::RelayConnectionRequest(url, jobs) => {
PendingItem::RelayConnectionRequest { relay, jobs } => {
app.notification_data.active.push(ConnRequest::new(
url.clone(),
relay.clone(),
jobs.clone(),
*time,
));
app.notification_data.num_notif_relays.add_assign(1);
}
PendingItem::RelayAuthenticationRequest(pubkey, url) => {
PendingItem::RelayAuthenticationRequest { account, relay } => {
app.notification_data.active.push(AuthRequest::new(
pubkey.clone(),
url.clone(),
*account,
relay.clone(),
*time,
));
app.notification_data.num_notif_relays.add_assign(1);
}
PendingItem::Nip46Request(name, account, command) => {
PendingItem::Nip46Request {
client_name,
account,
command,
} => {
app.notification_data.active.push(Nip46Request::new(
name.clone(),
account.clone(),
client_name.clone(),
*account,
command.clone(),
*time,
));

View File

@ -33,9 +33,9 @@ impl Notification for Pending {
fn show(&mut self, theme: &Theme, ui: &mut Ui) -> Option<Page> {
match self.inner {
PendingItem::RelayAuthenticationRequest(_, _) => None,
PendingItem::RelayConnectionRequest(_, _) => None,
PendingItem::Nip46Request(_, _, _) => None,
PendingItem::RelayAuthenticationRequest { .. } => None,
PendingItem::RelayConnectionRequest { .. } => None,
PendingItem::Nip46Request { .. } => None,
PendingItem::RelayListNeverAdvertised => relay_list_never_advertised(theme, ui),
PendingItem::RelayListChangedSinceAdvertised => {
relay_list_changed_since_advertised(theme, ui)

View File

@ -11,6 +11,7 @@ pub(crate) mod list_entry;
pub use copy_button::{CopyButton, COPY_SYMBOL_SIZE};
mod nav_item;
use crate::ui::egui::Rounding;
use eframe::egui::Galley;
use egui_winit::egui::text::LayoutJob;
use egui_winit::egui::text_edit::TextEditOutput;

View File

@ -455,11 +455,11 @@ pub fn handle_command(event: &Event, seen_on: Option<RelayUrl>) -> Result<(), Er
if matches!(e.kind, ErrorKind::Nip46NeedApproval) {
GLOBALS
.pending
.insert(crate::pending::PendingItem::Nip46Request(
server.name.clone(),
event.pubkey,
parsed_command,
));
.insert(crate::pending::PendingItem::Nip46Request {
client_name: server.name.clone(),
account: event.pubkey,
command: parsed_command,
});
} else {
// Return the error
return Err(e);

View File

@ -197,10 +197,10 @@ impl Minion {
None => {
if let Some(pubkey) = GLOBALS.identity.public_key() {
GLOBALS.pending.insert(
crate::pending::PendingItem::RelayAuthenticationRequest(
pubkey,
self.url.clone(),
),
crate::pending::PendingItem::RelayAuthenticationRequest {
account: pubkey,
relay: self.url.clone(),
},
);
}
}

View File

@ -488,10 +488,10 @@ impl Minion {
self.authenticate().await?;
if let Some(pubkey) = GLOBALS.identity.public_key() {
GLOBALS.pending.remove(
&crate::pending::PendingItem::RelayAuthenticationRequest(
pubkey,
self.url.clone(),
),
&crate::pending::PendingItem::RelayAuthenticationRequest {
account: pubkey,
relay: self.url.clone(),
},
);
}
}
@ -499,10 +499,10 @@ impl Minion {
self.dbrelay.allow_auth = Some(false); // save in our memory copy of the relay
if let Some(pubkey) = GLOBALS.identity.public_key() {
GLOBALS.pending.remove(
&crate::pending::PendingItem::RelayAuthenticationRequest(
pubkey,
self.url.clone(),
),
&crate::pending::PendingItem::RelayAuthenticationRequest {
account: pubkey,
relay: self.url.clone(),
},
);
}
}

View File

@ -319,10 +319,10 @@ impl Overlord {
Some(false) => return Ok(()), // don't connect to this relay
None => {
// Save the engage_minion request and Ask the user
GLOBALS.pending.insert(PendingItem::RelayConnectionRequest(
url.clone(),
jobs.clone(),
));
GLOBALS.pending.insert(PendingItem::RelayConnectionRequest {
relay: url.clone(),
jobs: jobs.clone(),
});
return Ok(());
}
}

View File

@ -15,17 +15,23 @@ use tokio::time::Instant;
#[derive(Debug, Clone, Hash, PartialEq)]
pub enum PendingItem {
/// Relay picker wants to connect to this relay
RelayConnectionRequest(RelayUrl /* relay */, Vec<RelayJob> /* reasons */),
RelayConnectionRequest {
relay: RelayUrl,
jobs: Vec<RelayJob>,
},
/// Relay picker wants to authenticate to this relay with a private key signature
RelayAuthenticationRequest(PublicKey /* account */, RelayUrl /* relay */),
RelayAuthenticationRequest {
account: PublicKey,
relay: RelayUrl,
},
/// A NIP46 remote signing request was received and requires permission
Nip46Request(
String, /* client name */
PublicKey, /* account */
crate::nip46::ParsedCommand, /* NIP46 command */
),
Nip46Request {
client_name: String,
account: PublicKey,
command: crate::nip46::ParsedCommand,
},
// Your relay list has changed since last advertisement, or your last advertisement
// was over 30 days ago.
@ -52,6 +58,12 @@ pub struct Pending {
pending_hash: PRwLock<u64>,
}
impl Default for Pending {
fn default() -> Pending {
Self::new()
}
}
fn calculate_pending_hash(vec: &Vec<(PendingItem, u64)>) -> u64 {
let mut s = DefaultHasher::new();
vec.hash(&mut s);
@ -60,8 +72,8 @@ fn calculate_pending_hash(vec: &Vec<(PendingItem, u64)>) -> u64 {
impl PendingItem {
fn matches(&self, other: &PendingItem) -> bool {
match self {
PendingItem::RelayConnectionRequest(a_url, _) => match other {
PendingItem::RelayConnectionRequest(b_url, _) => a_url == b_url,
PendingItem::RelayConnectionRequest { relay: a_url, .. } => match other {
PendingItem::RelayConnectionRequest { relay: b_url, .. } => a_url == b_url,
_ => false,
},
item => item == other,
@ -104,9 +116,9 @@ impl Pending {
if entry.matches(&item) {
match entry {
// merge jobs for connection requests to the same relay
PendingItem::RelayConnectionRequest(_, jobs) => {
PendingItem::RelayConnectionRequest { jobs, .. } => {
let new_jobs = match &item {
PendingItem::RelayConnectionRequest(_, jobs) => Some(jobs),
PendingItem::RelayConnectionRequest { jobs, .. } => Some(jobs),
_ => None,
};
if let Some(new_jobs) = new_jobs {
@ -128,10 +140,10 @@ impl Pending {
list.sort_by(|a, b| b.1.cmp(&a.1));
*self.pending_hash.write() = calculate_pending_hash(&list);
}
return true;
true
} else {
false
}
return false;
}
pub fn take_relay_connection_request(
@ -139,15 +151,12 @@ impl Pending {
relay_url: &RelayUrl,
) -> Option<(RelayUrl, Vec<RelayJob>)> {
let mut pending = self.pending.write();
let index = pending.iter().position(|(item, _)| match item {
PendingItem::RelayConnectionRequest(url, _) if url == relay_url => true,
_ => false,
});
let index = pending.iter().position(|(item, _)| matches!(item, PendingItem::RelayConnectionRequest { relay, .. } if relay == relay_url));
if let Some(index) = index {
let entry = pending.remove(index);
*self.pending_hash.write() = calculate_pending_hash(&pending);
match entry.0 {
PendingItem::RelayConnectionRequest(url, jobs) => Some((url, jobs)),
PendingItem::RelayConnectionRequest { relay, jobs } => Some((relay, jobs)),
_ => None,
}
} else {
@ -161,19 +170,14 @@ impl Pending {
relay_url: &RelayUrl,
) -> Option<(PublicKey, RelayUrl)> {
let mut pending = self.pending.write();
let index = pending.iter().position(|(item, _)| match item {
PendingItem::RelayAuthenticationRequest(pubkey, url)
if url == relay_url && pubkey == account =>
{
true
}
_ => false,
});
let index = pending.iter().position(|(item, _)| matches!(item, PendingItem::RelayAuthenticationRequest { account: pubkey, relay } if relay == relay_url && pubkey == account));
if let Some(index) = index {
let entry = pending.remove(index);
*self.pending_hash.write() = calculate_pending_hash(&pending);
match entry.0 {
PendingItem::RelayAuthenticationRequest(pubkey, url) => Some((pubkey, url)),
PendingItem::RelayAuthenticationRequest { account, relay } => {
Some((account, relay))
}
_ => None,
}
} else {
@ -187,19 +191,16 @@ impl Pending {
command: &ParsedCommand,
) -> Option<(String, PublicKey, ParsedCommand)> {
let mut pending = self.pending.write();
let index = pending.iter().position(|(item, _)| match item {
PendingItem::Nip46Request(_, item_pubkey, item_command)
if item_pubkey == account && item_command == command =>
{
true
}
_ => false,
});
let index = pending.iter().position(|(item, _)| matches!(item, PendingItem::Nip46Request { account: item_account, command: item_command, .. } if item_account == account && item_command == command));
if let Some(index) = index {
let entry = pending.remove(index);
*self.pending_hash.write() = calculate_pending_hash(&pending);
match entry.0 {
PendingItem::Nip46Request(name, account, cmd) => Some((name, account, cmd)),
PendingItem::Nip46Request {
client_name,
account,
command,
} => Some((client_name, account, command)),
_ => None,
}
} else {