feat: add support for launch arguments #40

Merged
reya merged 2 commits from feat/launch-arg into master 2026-08-02 07:10:47 +00:00
5 changed files with 43 additions and 9 deletions
Showing only changes of commit 2ecad5e273 - Show all commits

1
Cargo.lock generated
View File

@@ -1369,6 +1369,7 @@ dependencies = [
"gpui_platform", "gpui_platform",
"gpui_windows", "gpui_windows",
"log", "log",
"nostr-sdk",
"person", "person",
"reqwest_client", "reqwest_client",
"settings", "settings",

View File

@@ -24,7 +24,7 @@ pub use nip4e::*;
pub use nip05::*; pub use nip05::*;
pub use signer::{CoopAuthUrlHandler, UniversalSigner}; pub use signer::{CoopAuthUrlHandler, UniversalSigner};
pub fn init(window: &mut Window, cx: &mut App) { pub fn init(window: &mut Window, cx: &mut App, cli_key: Option<SecretKey>) {
// rustls uses the `aws_lc_rs` provider by default // rustls uses the `aws_lc_rs` provider by default
// This only errors if the default provider has already // This only errors if the default provider has already
// been installed. We can ignore this `Result`. // been installed. We can ignore this `Result`.
@@ -37,7 +37,7 @@ pub fn init(window: &mut Window, cx: &mut App) {
#[cfg(not(target_arch = "wasm32"))] #[cfg(not(target_arch = "wasm32"))]
gpui_tokio::init(cx); gpui_tokio::init(cx);
NostrRegistry::set_global(cx.new(|cx| NostrRegistry::new(window, cx)), cx); NostrRegistry::set_global(cx.new(|cx| NostrRegistry::new(window, cx, cli_key)), cx);
} }
struct GlobalNostrRegistry(Entity<NostrRegistry>); struct GlobalNostrRegistry(Entity<NostrRegistry>);
@@ -58,16 +58,16 @@ pub enum StateEvent {
} }
impl StateEvent { impl StateEvent {
pub fn signer_changed(&self) -> bool {
matches!(self, StateEvent::SignerChanged)
}
pub fn error<T>(error: T) -> Self pub fn error<T>(error: T) -> Self
where where
T: Into<String>, T: Into<String>,
{ {
Self::Error(error.into()) Self::Error(error.into())
} }
pub fn signer_changed(&self) -> bool {
matches!(self, StateEvent::SignerChanged)
}
} }
/// Nostr Registry /// Nostr Registry
@@ -100,7 +100,7 @@ impl NostrRegistry {
} }
/// Create a new nostr instance /// Create a new nostr instance
fn new(window: &mut Window, cx: &mut Context<Self>) -> Self { fn new(window: &mut Window, cx: &mut Context<Self>, cli_key: Option<SecretKey>) -> Self {
let signer = UniversalSigner::new(Keys::generate()); let signer = UniversalSigner::new(Keys::generate());
let authenticator = SignerAuthenticator::new(signer.clone()); let authenticator = SignerAuthenticator::new(signer.clone());
@@ -133,6 +133,10 @@ impl NostrRegistry {
if cfg!(target_arch = "wasm32") { if cfg!(target_arch = "wasm32") {
cx.emit(StateEvent::NoSigner); cx.emit(StateEvent::NoSigner);
} else if let Some(secret) = cli_key {
// Use CLI-provided key -- same path as get_user_credential
let keys = Keys::new(secret);
this.set_signer(keys, cx);
} else { } else {
this.get_user_credential(cx); this.get_user_credential(cx);
} }

View File

@@ -48,3 +48,4 @@ reqwest_client.workspace = true
log.workspace = true log.workspace = true
tracing-subscriber.workspace = true tracing-subscriber.workspace = true
nostr-sdk.workspace = true

View File

@@ -7,6 +7,7 @@ use gpui::{
actions, point, px, size, actions, point, px, size,
}; };
use gpui_platform::application; use gpui_platform::application;
use nostr_sdk::prelude::SecretKey;
use state::{APP_ID, CLIENT_NAME}; use state::{APP_ID, CLIENT_NAME};
use ui::Root; use ui::Root;
@@ -16,6 +17,14 @@ fn main() {
// Initialize logging // Initialize logging
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
// Parse CLI arguments for --sec <nsec1>
let cli_key = parse_cli_key();
if let Err(ref e) = cli_key {
eprintln!("Failed to parse --sec argument: {e}");
std::process::exit(1);
}
let cli_key = cli_key.unwrap();
// Run application // Run application
application() application()
.with_assets(Assets) .with_assets(Assets)
@@ -75,7 +84,7 @@ fn main() {
settings::init(window, cx); settings::init(window, cx);
// Initialize the nostr client // Initialize the nostr client
state::init(window, cx); state::init(window, cx, cli_key);
// Initialize person registry // Initialize person registry
person::init(window, cx); person::init(window, cx);
@@ -125,6 +134,25 @@ fn load_embedded_fonts(cx: &App) {
.unwrap(); .unwrap();
} }
fn parse_cli_key() -> Result<Option<SecretKey>, String> {
let args: Vec<String> = std::env::args().collect();
let mut i = 0;
while i < args.len() {
if args[i] == "--sec" {
if i + 1 < args.len() {
let nsec = &args[i + 1];
return SecretKey::parse(nsec)
.map(Some)
.map_err(|e| format!("Invalid nsec key '{nsec}': {e}"));
} else {
return Err("--sec requires a value (nsec1...)".to_string());
}
}
i += 1;
}
Ok(None)
}
fn quit(_ev: &Quit, cx: &mut App) { fn quit(_ev: &Quit, cx: &mut App) {
log::info!("Gracefully quitting the application . . ."); log::info!("Gracefully quitting the application . . .");
cx.quit(); cx.quit();

View File

@@ -59,7 +59,7 @@ pub fn run() -> Result<(), JsValue> {
settings::init(window, cx); settings::init(window, cx);
// Initialize the nostr client // Initialize the nostr client
state::init(window, cx); state::init(window, cx, None);
// Initialize person registry // Initialize person registry
person::init(window, cx); person::init(window, cx);