diff --git a/src/comms.rs b/src/comms.rs index 3086856d..26f56e2f 100644 --- a/src/comms.rs +++ b/src/comms.rs @@ -1,24 +1,27 @@ -use nostr_types::{Event, Id, IdHex, PublicKeyHex}; -use serde::Serialize; -use std::ops::Drop; -use zeroize::Zeroize; +use nostr_types::{Event, Id, IdHex, PublicKey, PublicKeyHex}; /// This is a message sent to the Overlord -#[derive(Debug, Clone, Serialize)] -pub struct ToOverlordMessage { - /// What kind of message is this - pub kind: String, - - /// The payload, serialized as a JSON string - pub json_payload: String, -} - -/// We may send passwords through ToOverlordMessage objects, so we zeroize -/// bus message payloads upon drop. -impl Drop for ToOverlordMessage { - fn drop(&mut self) { - self.json_payload.zeroize(); - } +#[derive(Debug, Clone)] +pub enum ToOverlordMessage { + AddRelay(String), + DeletePub, + FollowBech32(String, String), + FollowHex(String, String), + FollowNip35(String), + GeneratePrivateKey(String), + GetMissingEvents, + ImportPriv(String, String), + ImportPub(String), + Like(Id, PublicKey), + MinionIsReady, + ProcessIncomingEvents, + PostReply(String, Id), + PostTextNote(String), + SaveRelays, + SaveSettings, + Shutdown, + UnlockKey(String), + UpdateMetadata(PublicKeyHex), } /// This is a message sent to the minions diff --git a/src/main.rs b/src/main.rs index 559f45a9..0bc62f58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -92,9 +92,6 @@ async fn tokio_main() { // Any task can call this to shutdown pub fn initiate_shutdown() -> Result<(), Error> { let to_overlord = GLOBALS.to_overlord.clone(); - let _ = to_overlord.send(ToOverlordMessage { - kind: "shutdown".to_string(), - json_payload: serde_json::to_string("").unwrap(), - }); // ignore errors + let _ = to_overlord.send(ToOverlordMessage::Shutdown); // ignore errors Ok(()) } diff --git a/src/overlord/minion/mod.rs b/src/overlord/minion/mod.rs index 4f1481cd..756cefc3 100644 --- a/src/overlord/minion/mod.rs +++ b/src/overlord/minion/mod.rs @@ -262,11 +262,7 @@ impl Minion { } async fn tell_overlord_we_are_ready(&self) -> Result<(), Error> { - self.to_overlord.send(ToOverlordMessage { - kind: "minion_is_ready".to_string(), - json_payload: "".to_owned(), - })?; - + self.to_overlord.send(ToOverlordMessage::MinionIsReady)?; Ok(()) } diff --git a/src/overlord/mod.rs b/src/overlord/mod.rs index 518f825e..d47709d9 100644 --- a/src/overlord/mod.rs +++ b/src/overlord/mod.rs @@ -356,55 +356,29 @@ impl Overlord { } async fn handle_message(&mut self, message: ToOverlordMessage) -> Result { - #[allow(clippy::single_match)] // because temporarily so - match &*message.kind { - "shutdown" => { - tracing::info!("Overlord shutting down"); - return Ok(false); + match message { + ToOverlordMessage::AddRelay(relay_str) => { + let dbrelay = DbRelay::new(relay_str)?; + DbRelay::insert(dbrelay).await?; } - "minion_is_ready" => {} - "save_settings" => { - GLOBALS.settings.read().await.save().await?; - tracing::debug!("Settings saved."); + ToOverlordMessage::DeletePub => { + GLOBALS.signer.write().await.clear_public_key(); + GLOBALS.signer.read().await.save_through_settings().await?; } - "get_missing_events" => { - self.get_missing_events().await?; + ToOverlordMessage::FollowBech32(bech32, relay) => { + Overlord::follow_bech32(bech32, relay).await?; } - "follow_nip35" => { - let dns_id: String = serde_json::from_str(&message.json_payload)?; + ToOverlordMessage::FollowHex(hex, relay) => { + Overlord::follow_hexkey(hex, relay).await?; + } + ToOverlordMessage::FollowNip35(dns_id) => { let _ = tokio::spawn(async move { if let Err(e) = Overlord::get_and_follow_nip35(dns_id).await { tracing::error!("{}", e); } }); } - "follow_bech32" => { - let data: (String, String) = serde_json::from_str(&message.json_payload)?; - Overlord::follow_bech32(data.0, data.1).await?; - } - "follow_hexkey" => { - let data: (String, String) = serde_json::from_str(&message.json_payload)?; - Overlord::follow_hexkey(data.0, data.1).await?; - } - "unlock_key" => { - let mut password: String = serde_json::from_str(&message.json_payload)?; - GLOBALS - .signer - .write() - .await - .unlock_encrypted_private_key(&password)?; - password.zeroize(); - - // Update public key from private key - let public_key = GLOBALS.signer.read().await.public_key().unwrap(); - { - let mut settings = GLOBALS.settings.write().await; - settings.public_key = Some(public_key); - settings.save().await?; - } - } - "generate_private_key" => { - let mut password: String = serde_json::from_str(&message.json_payload)?; + ToOverlordMessage::GeneratePrivateKey(mut password) => { GLOBALS .signer .write() @@ -413,9 +387,10 @@ impl Overlord { password.zeroize(); GLOBALS.signer.read().await.save_through_settings().await?; } - "import_priv" => { - let (mut import_priv, mut password): (String, String) = - serde_json::from_str(&message.json_payload)?; + ToOverlordMessage::GetMissingEvents => { + self.get_missing_events().await?; + } + ToOverlordMessage::ImportPriv(mut import_priv, mut password) => { let maybe_pk1 = PrivateKey::try_from_bech32_string(&import_priv); let maybe_pk2 = PrivateKey::try_from_hex_string(&import_priv); import_priv.zeroize(); @@ -434,8 +409,7 @@ impl Overlord { GLOBALS.signer.read().await.save_through_settings().await?; } } - "import_pub" => { - let pubstr: String = serde_json::from_str(&message.json_payload)?; + ToOverlordMessage::ImportPub(pubstr) => { let maybe_pk1 = PublicKey::try_from_bech32_string(&pubstr); let maybe_pk2 = PublicKey::try_from_hex_string(&pubstr); if maybe_pk1.is_err() && maybe_pk2.is_err() { @@ -446,11 +420,30 @@ impl Overlord { GLOBALS.signer.read().await.save_through_settings().await?; } } - "delete_pub" => { - GLOBALS.signer.write().await.clear_public_key(); - GLOBALS.signer.read().await.save_through_settings().await?; + ToOverlordMessage::Like(id, pubkey) => { + self.post_like(id, pubkey).await?; } - "save_relays" => { + ToOverlordMessage::MinionIsReady => { + // currently ignored + } + ToOverlordMessage::ProcessIncomingEvents => { + // Clear new events + GLOBALS.event_is_new.write().await.clear(); + + let _ = tokio::spawn(async move { + for (event, url, sub) in GLOBALS.incoming_events.write().await.drain(..) { + let _ = + crate::process::process_new_event(&event, true, Some(url), sub).await; + } + }); + } + ToOverlordMessage::PostReply(content, reply_to) => { + self.post_reply(content, reply_to).await?; + } + ToOverlordMessage::PostTextNote(content) => { + self.post_textnote(content).await?; + } + ToOverlordMessage::SaveRelays => { let dirty_relays: Vec = GLOBALS .relays .read() @@ -468,37 +461,31 @@ impl Overlord { } } } - "post_textnote" => { - let content: String = serde_json::from_str(&message.json_payload)?; - self.post_textnote(content).await?; + ToOverlordMessage::SaveSettings => { + GLOBALS.settings.read().await.save().await?; + tracing::debug!("Settings saved."); } - "post_reply" => { - let (content, reply_to): (String, Id) = - serde_json::from_str(&message.json_payload)?; - self.post_reply(content, reply_to).await?; + ToOverlordMessage::Shutdown => { + tracing::info!("Overlord shutting down"); + return Ok(false); } - "like" => { - let (id, pubkey): (Id, PublicKey) = serde_json::from_str(&message.json_payload)?; - self.post_like(id, pubkey).await?; - } - "process_incoming_events" => { - // Clear new events - GLOBALS.event_is_new.write().await.clear(); + ToOverlordMessage::UnlockKey(mut password) => { + GLOBALS + .signer + .write() + .await + .unlock_encrypted_private_key(&password)?; + password.zeroize(); - let _ = tokio::spawn(async move { - for (event, url, sub) in GLOBALS.incoming_events.write().await.drain(..) { - let _ = - crate::process::process_new_event(&event, true, Some(url), sub).await; - } - }); + // Update public key from private key + let public_key = GLOBALS.signer.read().await.public_key().unwrap(); + { + let mut settings = GLOBALS.settings.write().await; + settings.public_key = Some(public_key); + settings.save().await?; + } } - "add_relay" => { - let relay_str: String = serde_json::from_str(&message.json_payload)?; - let dbrelay = DbRelay::new(relay_str)?; - DbRelay::insert(dbrelay).await?; - } - "update_metadata" => { - let pubkey: PublicKeyHex = serde_json::from_str(&message.json_payload)?; + ToOverlordMessage::UpdateMetadata(pubkey) => { let person_relays = DbPersonRelay::fetch_for_pubkeys(&[pubkey.clone()]).await?; for person_relay in person_relays.iter() { @@ -514,7 +501,6 @@ impl Overlord { }); } } - _ => {} } Ok(true) diff --git a/src/ui/feed.rs b/src/ui/feed.rs index d8a6002e..6db82402 100644 --- a/src/ui/feed.rs +++ b/src/ui/feed.rs @@ -84,10 +84,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, frame: &mut eframe::Fram .on_hover_text("Query Relays for Missing Events") .clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "get_missing_events".to_string(), - json_payload: serde_json::to_string("").unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::GetMissingEvents); } /* Hide for now, as they are processed automatically at present @@ -96,10 +95,7 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, frame: &mut eframe::Fram .on_hover_text("Process Queue of Incoming Events") .clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "process_incoming_events".to_string(), - json_payload: serde_json::to_string("").unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::ProcessIncomingEvents); } */ @@ -149,21 +145,16 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, frame: &mut eframe::Fram ui.with_layout(Layout::right_to_left(Align::TOP), |ui| { if ui.button("Send").clicked() && !app.draft.is_empty() { match app.replying_to { - Some(_id) => { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "post_reply".to_string(), - json_payload: serde_json::to_string(&( - &app.draft, - &app.replying_to, - )) - .unwrap(), - }); + Some(replying_to_id) => { + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::PostReply( + app.draft.clone(), + replying_to_id, + )); } None => { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "post_textnote".to_string(), - json_payload: serde_json::to_string(&app.draft).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::PostTextNote(app.draft.clone())); } } app.draft = "".to_owned(); @@ -449,13 +440,9 @@ fn render_post_actual( GLOBALS.dismissed.blocking_write().push(event.id); } if ui.button("Update Metadata").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "update_metadata".to_string(), - json_payload: serde_json::to_string( - &event.pubkey.as_hex_string(), - ) - .unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::UpdateMetadata(event.pubkey.into())); } }); @@ -494,11 +481,9 @@ fn render_post_actual( ui.add_space(24.0); if ui.add(LikeButton {}).clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "like".to_string(), - json_payload: serde_json::to_string(&(&event.id, &event.pubkey)) - .unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::Like(event.id, event.pubkey)); } for (ch, count) in reactions.iter() { if *ch == '+' { diff --git a/src/ui/people/follow.rs b/src/ui/people/follow.rs index b645946f..7c6e602d 100644 --- a/src/ui/people/follow.rs +++ b/src/ui/people/follow.rs @@ -24,10 +24,9 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.add(TextEdit::singleline(&mut app.nip35follow).hint_text("user@domain")); }); if ui.button("follow").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "follow_nip35".to_string(), - json_payload: serde_json::to_string(&app.nip35follow).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::FollowNip35(app.nip35follow.clone())); app.nip35follow = "".to_owned(); } @@ -46,14 +45,10 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.add(TextEdit::singleline(&mut app.follow_pubkey_at_relay).hint_text("wss://...")); }); if ui.button("follow").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "follow_bech32".to_string(), - json_payload: serde_json::to_string(&( - &app.follow_bech32_pubkey, - &app.follow_pubkey_at_relay, - )) - .unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::FollowBech32( + app.follow_bech32_pubkey.clone(), + app.follow_pubkey_at_relay.clone(), + )); app.follow_bech32_pubkey = "".to_owned(); app.follow_pubkey_at_relay = "".to_owned(); } @@ -73,14 +68,10 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.add(TextEdit::singleline(&mut app.follow_pubkey_at_relay).hint_text("wss://...")); }); if ui.button("follow").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "follow_hexkey".to_string(), - json_payload: serde_json::to_string(&( - &app.follow_hex_pubkey, - &app.follow_pubkey_at_relay, - )) - .unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::FollowHex( + app.follow_hex_pubkey.clone(), + app.follow_pubkey_at_relay.clone(), + )); app.follow_hex_pubkey = "".to_owned(); app.follow_pubkey_at_relay = "".to_owned(); } diff --git a/src/ui/people/person.rs b/src/ui/people/person.rs index eefa23e1..cccc868c 100644 --- a/src/ui/people/person.rs +++ b/src/ui/people/person.rs @@ -57,10 +57,9 @@ pub(super) fn update(app: &mut GossipUi, ctx: &Context, _frame: &mut eframe::Fra } if ui.button("UPDATE METADATA").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "update_metadata".to_string(), - json_payload: serde_json::to_string(&pubkeyhex).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::UpdateMetadata(pubkeyhex.clone())); } if ui.button("VIEW THEIR FEED").clicked() { diff --git a/src/ui/relays.rs b/src/ui/relays.rs index caa21616..d09ee70d 100644 --- a/src/ui/relays.rs +++ b/src/ui/relays.rs @@ -24,10 +24,9 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr if ui.button("Add").clicked() { let test_url = Url::new(&app.new_relay_url); if test_url.is_valid_relay_url() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "add_relay".to_string(), - json_payload: serde_json::to_string(&app.new_relay_url).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::AddRelay(app.new_relay_url.clone())); app.new_relay_url = "".to_owned(); *GLOBALS.status_message.blocking_write() = format!( "I asked the overlord to add relay {}. Check for it below.", @@ -59,10 +58,7 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.with_layout(Layout::bottom_up(Align::Center), |ui| { if ui.button("SAVE CHANGES").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "save_relays".to_string(), - json_payload: serde_json::to_string("").unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::SaveRelays); } ui.with_layout(Layout::top_down(Align::Center), |ui| { diff --git a/src/ui/settings.rs b/src/ui/settings.rs index f77aacff..6214af53 100644 --- a/src/ui/settings.rs +++ b/src/ui/settings.rs @@ -151,10 +151,7 @@ pub(super) fn update( *GLOBALS.settings.blocking_write() = app.settings.clone(); // Tell the overlord to save them - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "save_settings".to_string(), - json_payload: serde_json::to_string("").unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::SaveSettings); } }); } diff --git a/src/ui/you.rs b/src/ui/you.rs index 27970d48..b2d11ced 100644 --- a/src/ui/you.rs +++ b/src/ui/you.rs @@ -141,10 +141,9 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr }); if ui.button("Unlock Private Key").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "unlock_key".to_string(), - json_payload: serde_json::to_string(&app.password).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::UnlockKey(app.password.clone())); app.password.zeroize(); app.password = "".to_owned(); } @@ -156,10 +155,9 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.add(TextEdit::singleline(&mut app.password).password(true)); }); if ui.button("Generate Now").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "generate_private_key".to_string(), - json_payload: serde_json::to_string(&app.password).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::GeneratePrivateKey(app.password.clone())); app.password.zeroize(); app.password = "".to_owned(); } @@ -183,10 +181,10 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr ui.add(TextEdit::singleline(&mut app.password).password(true)); }); if ui.button("import").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "import_priv".to_string(), - json_payload: serde_json::to_string(&(&app.import_priv, &app.password)).unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::ImportPriv( + app.import_priv.clone(), + app.password.clone(), + )); app.import_priv.zeroize(); app.import_priv = "".to_owned(); app.password.zeroize(); @@ -221,20 +219,16 @@ pub(super) fn update(app: &mut GossipUi, _ctx: &Context, _frame: &mut eframe::Fr } if ui.button("Delete this public key").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "delete_pub".to_string(), - json_payload: serde_json::to_string(&app.import_pub).unwrap(), - }); + let _ = GLOBALS.to_overlord.send(ToOverlordMessage::DeletePub); } } else { ui.horizontal_wrapped(|ui| { ui.label("Enter your public key"); ui.add(TextEdit::singleline(&mut app.import_pub).hint_text("npub1 or hex")); if ui.button("Import a Public Key").clicked() { - let _ = GLOBALS.to_overlord.send(ToOverlordMessage { - kind: "import_pub".to_string(), - json_payload: serde_json::to_string(&app.import_pub).unwrap(), - }); + let _ = GLOBALS + .to_overlord + .send(ToOverlordMessage::ImportPub(app.import_pub.clone())); app.import_pub = "".to_owned(); } });