26 releases (breaking)

0.20.3 Jan 26, 2023
0.19.2 Jan 11, 2023
0.16.0 Dec 27, 2022
0.11.0 Nov 17, 2022

#125 in WebSocket

Download history 337/week @ 2024-05-20 162/week @ 2024-05-27 97/week @ 2024-06-03 157/week @ 2024-06-10 241/week @ 2024-06-17 177/week @ 2024-06-24 179/week @ 2024-07-01 62/week @ 2024-07-08 17/week @ 2024-07-15 2/week @ 2024-07-22 39/week @ 2024-07-29 8/week @ 2024-08-05 7/week @ 2024-08-12 2/week @ 2024-08-19 12/week @ 2024-08-26 38/week @ 2024-09-02

60 downloads per month
Used in gnostr-bins

MIT license

135KB
2K SLoC

nostr_rust

crates.io Documentation MIT/Apache-2 licensed CI Issues

An ergonomic, Nostr API Client for Rust.

Example

[dependencies]
nostr_rust = "*"

And then the code:

use std::{
    str::FromStr,
    sync::{Arc, Mutex},
    thread,
};

use nostr_rust::{nostr_client::Client, req::ReqFilter, Identity, Message, events::extract_events_ws, utils::parse_content_tags};

fn handle_message(relay_url: &String, message: &Message) -> Result<(), String> {
    println!("Received message from {}: {:?}", relay_url, message);

    let events = extract_events_ws(message);
    println!("Events: {:?}", events);

    Ok(())
}

fn main() {
    let my_identity =
        Identity::from_str("your private key as hex string")
            .unwrap();

    let nostr_client = Arc::new(Mutex::new(
        Client::new(vec!["wss://relay.nostr.info"]).unwrap(),
    ));

    // Run a new thread to handle messages
    let nostr_clone = nostr_client.clone();
    let handle_thread = thread::spawn(move || {
        println!("Listening...");
        let events = nostr_clone.lock().unwrap().next_data().unwrap();

        for (relay_url, message) in events.iter() {
            handle_message(relay_url, message).unwrap();
        }
    });

    // Change metadata
    nostr_client
        .lock()
        .unwrap()
        .set_metadata(
            &my_identity,
            Some("Rust Nostr Client test account"),
            Some("Hello Nostr! #5"),
            None,
            None,
            0,
        )
        .unwrap();

    // Subscribe to my last text note
    let subscription_id = nostr_client
        .lock()
        .unwrap()
        .subscribe(vec![ReqFilter {
            ids: None,
            authors: Some(vec![
                "884704bd421721e292edbff42eb77547fe115c6ff9825b08fc366be4cd69e9f6".to_string(),
            ]),
            kinds: None,
            e: None,
            p: None,
            since: None,
            until: None,
            limit: Some(1),
        }])
        .unwrap();

    // Unsubscribe
    nostr_client
        .lock()
        .unwrap()
        .unsubscribe(&subscription_id)
        .unwrap();

    // You can use the parse content tags method to get the content and the tags from a string
    // let tags = parse_content_tags("hello #world", vec![], Some(nostr_rust::DEFAULT_HASHTAG), true, true);
    // assert_eq!(tags.content, "hello #world");
    //  assert_eq!(tags.tags, vec![vec!["t", "world"]]);

    // Publish a text note
    nostr_client
        .lock()
        .unwrap()
        .publish_text_note(&my_identity, "Hello Nostr! :)", &[], 0)
        .unwrap();

    // Publish a proof of work text note with a difficulty target of 15
    nostr_client
        .lock()
        .unwrap()
        .publish_text_note(&my_identity, "Hello Nostr! :)", &[], 15)
        .unwrap();

    // Wait for the thread to finish
    handle_thread.join().unwrap();
}

## Async feature

If you want to use the async version of the client, you can enable the `async` feature:

```toml
[dependencies]
nostr_rust = { version = "*", features = ["async"] }

NIPs Supported

NIP Supported Client Version Description
01 0.1.0 Basic protocol flow description
02 0.3.0 Contact List and Petnames
03 Not supported OpenTimestamps Attestations for Events
04 0.6.0 Encrypted Direct Message
05 0.15.0 Mapping Nostr keys to DNS-based internet identifiers
06 Not supported Basic key derivation from mnemonic seed phrase
07 Not concerned Not supported window.nostr capability for web browsers
08 Not concerned Not supported Handling Mentions
09 0.5.0 Event Deletion
10 Not concerned Not supported Conventions for clients' use of e and p tags in text events.
11 0.9.0 Relay Information Document
12 Not supported Generic Tag Queries
13 0.8.0 Proof of Work
14 Not concerned Not supported Subject tag in text events.
15 Not supported End of Stored Events Notice
16 0.13.0 Event Treatment
22 Not supported Event created_at Limits
25 0.4.0 Reactions
28 Not supported Public Chat

License

Licensed under MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)

Dependencies

~19–31MB
~553K SLoC