notecrumbs

a nostr opengraph server build on nostrdb and egui
git clone git://jb55.com/notecrumbs
Log | Files | Refs | README | LICENSE

commit 37befba77bce92b1a3855a3bab341429dcbbe2aa
parent da066aa63215f1704291dd1679d756e0179a20e0
Author: William Casarin <jb55@jb55.com>
Date:   Mon, 18 Dec 2023 08:15:13 -0800

rename Context to Notecrumbs

since the overlap with egui::Context is confusing

Diffstat:
Msrc/main.rs | 34+++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/main.rs b/src/main.rs @@ -21,7 +21,7 @@ use nostr_sdk::Kind; mod error; #[derive(Debug, Clone)] -struct Context { +struct Notecrumbs { ndb: Ndb, keys: Keys, @@ -44,7 +44,7 @@ fn nip19_target(nip19: &Nip19) -> Option<Target> { } } -fn note_ui(ctx: &egui::Context, content: &str) { +fn note_ui(app: &Notecrumbs, ctx: &egui::Context, content: &str) { use egui::{FontId, RichText}; egui::CentralPanel::default().show(&ctx, |ui| { @@ -57,7 +57,7 @@ fn note_ui(ctx: &egui::Context, content: &str) { }); } -fn render_note(_app_ctx: &Context, content: &str) -> Vec<u8> { +fn render_note(app: &Notecrumbs, content: &str) -> Vec<u8> { use egui_skia::{rasterize, RasterizeOptions}; use skia_safe::EncodedImageFormat; @@ -66,7 +66,7 @@ fn render_note(_app_ctx: &Context, content: &str) -> Vec<u8> { frames_before_screenshot: 1, }; - let mut surface = rasterize((1200, 630), |ctx| note_ui(ctx, content), Some(options)); + let mut surface = rasterize((1200, 630), |ctx| note_ui(app, ctx, content), Some(options)); surface .image_snapshot() @@ -108,9 +108,9 @@ fn nip19_relays(nip19: &Nip19) -> Vec<String> { relays } -async fn find_note(ctx: &Context, nip19: &Nip19) -> Result<nostr_sdk::Event, Error> { +async fn find_note(app: &Notecrumbs, nip19: &Nip19) -> Result<nostr_sdk::Event, Error> { let opts = Options::new().shutdown_on_drop(true); - let client = Client::with_opts(&ctx.keys, opts); + let client = Client::with_opts(&app.keys, opts); let _ = client.add_relay("wss://relay.damus.io").await; @@ -124,7 +124,7 @@ async fn find_note(ctx: &Context, nip19: &Nip19) -> Result<nostr_sdk::Event, Err let filters = nip19_to_filters(nip19)?; client - .req_events_of(filters.clone(), Some(ctx.timeout)) + .req_events_of(filters.clone(), Some(app.timeout)) .await; loop { @@ -147,7 +147,7 @@ async fn find_note(ctx: &Context, nip19: &Nip19) -> Result<nostr_sdk::Event, Err } async fn serve( - ctx: &Context, + app: &Notecrumbs, r: Request<hyper::body::Incoming>, ) -> Result<Response<Full<Bytes>>, Error> { let nip19 = match Nip19::from_bech32(&r.uri().to_string()[1..]) { @@ -169,9 +169,9 @@ async fn serve( }; let content = { - let mut txn = Transaction::new(&ctx.ndb)?; + let mut txn = Transaction::new(&app.ndb)?; match target { - Target::Profile(pk) => ctx + Target::Profile(pk) => app .ndb .get_profile_by_pubkey(&mut txn, &pk.serialize()) .and_then(|n| { @@ -183,7 +183,7 @@ async fn serve( .ok_or(nostrdb::Error::NotFound)? .to_string()) }), - Target::Event(evid) => ctx + Target::Event(evid) => app .ndb .get_note_by_id(&mut txn, evid.as_bytes().try_into()?) .map(|n| { @@ -197,9 +197,9 @@ async fn serve( Ok(content) => content, Err(nostrdb::Error::NotFound) => { debug!("Finding {:?}", nip19); - match find_note(ctx, &nip19).await { + match find_note(app, &nip19).await { Ok(note) => { - let _ = ctx + let _ = app .ndb .process_event(&json!(["EVENT", "s", note]).to_string()); note.content @@ -218,7 +218,7 @@ async fn serve( } }; - let data = render_note(&ctx, &content); + let data = render_note(&app, &content); Ok(Response::builder() .header(header::CONTENT_TYPE, "image/png") @@ -248,7 +248,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { let ndb = Ndb::new(".", &cfg).expect("ndb failed to open"); let keys = Keys::generate(); let timeout = get_env_timeout(); - let ctx = Context { ndb, keys, timeout }; + let app = Notecrumbs { ndb, keys, timeout }; // We start a loop to continuously accept incoming connections loop { @@ -258,14 +258,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { // `hyper::rt` IO traits. let io = TokioIo::new(stream); - let ctx_copy = ctx.clone(); + let app_copy = app.clone(); // Spawn a tokio task to serve multiple connections concurrently tokio::task::spawn(async move { // Finally, we bind the incoming connection to our `hello` service if let Err(err) = http1::Builder::new() // `service_fn` converts our function in a `Service` - .serve_connection(io, service_fn(|req| serve(&ctx_copy, req))) + .serve_connection(io, service_fn(|req| serve(&app_copy, req))) .await { println!("Error serving connection: {:?}", err);