mirror of
https://github.com/mikedilger/gossip.git
synced 2024-09-20 03:57:03 +00:00
Merge commit 'cfd0a06a9a0dba726fe46a09adc125a63d2efac2' into feature/pending-notifications
# Conflicts: # gossip-bin/src/ui/notifications/mod.rs
This commit is contained in:
commit
5b0d07daaa
@ -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"
|
||||
|
@ -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,
|
||||
));
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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(),
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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(());
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user