26 个版本 (重大更改)

0.20.3 2023年1月26日
0.19.2 2023年1月11日
0.16.0 2022年12月27日
0.11.0 2022年11月17日

#786 in 网页编程

Download history 4/week @ 2024-03-14 65/week @ 2024-03-28 10/week @ 2024-04-04 62/week @ 2024-04-25 303/week @ 2024-05-02 394/week @ 2024-05-09 364/week @ 2024-05-16 234/week @ 2024-05-23 163/week @ 2024-05-30 88/week @ 2024-06-06 174/week @ 2024-06-13 255/week @ 2024-06-20 131/week @ 2024-06-27

660 每月下载量
用于 gnostr-bins

MIT 许可证

135KB
2K SLoC

nostr_rust

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

一个 Rust 编写的,方便使用的 Nostr API 客户端。

示例

[dependencies]
nostr_rust = "*"

然后是代码

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"] }

支持的 NIP

NIP 支持 客户端版本 描述
01 0.1.0 基本协议流程描述
02 0.3.0 联系人和昵称列表
03 不支持 事件 OpenTimestamps 认证
04 0.6.0 加密直接消息
05 0.15.0 Nostr 密钥映射到基于 DNS 的互联网标识符
06 不支持 从助记词种子短语派生基本密钥
07 不关心 不支持 web 浏览器 window.nostr 功能
08 不关心 不支持 处理提及
09 0.5.0 事件删除
10 不关心 不支持 文本事件中客户端使用 e 和 p 标签的约定。
11 0.9.0 中继信息文档
12 不支持 通用标签查询
13 0.8.0 工作量证明
14 不关心 不支持 文本事件中的主题标签。
15 不支持 存储事件结束通知
16 0.13.0 事件处理
22 不支持 事件 created_at 限制
25 0.4.0 反应
28 不支持 公开聊天

许可证

许可协议:MIT 许可证 (LICENSE-MIThttp://opensource.org/licenses/MIT)

依赖关系

~18–34MB
~556K SLoC