Event Building
A convenient way to create events is by using the EventBuilder
.
It allows to build standard
and/or custom
events.
Construct the event
Standard events can be composed by using the dedicated constructors. In the below example we are going to build a text note:
Rust
let builder = EventBuilder::text_note("Hello");
Python
builder1 = EventBuilder.text_note("Hello")
JavaScript
let builder1 = EventBuilder.textNote("Hello");
Kotlin
val builder1 = EventBuilder.textNote("Hello")
Swift
let builder1 = EventBuilder.textNote(content: "Hello")
Flutter
EventBuilder builder1 = EventBuilder.textNote(content: "Hello");
You can also customize the builder, for example, by specifying a POW difficulty, setting a fixed timestamp or adding more tags:
Rust
let builder =
EventBuilder::text_note("Hello with POW")
.tag(Tag::alt("POW text-note"))
.pow(20)
.custom_created_at(Timestamp::from_secs(1737976769));
Python
tag = Tag.alt("POW text-note")
custom_timestamp = Timestamp.from_secs(1737976769)
builder2 = EventBuilder.text_note("Hello with POW").tags([tag]).pow(20).custom_created_at(custom_timestamp)
JavaScript
let builder2 =
EventBuilder.textNote("Hello with POW")
.tags([Tag.alt("POW text-note")])
.pow(20)
.customCreatedAt(Timestamp.fromSecs(1737976769));
Kotlin
val tag = Tag.alt("POW text-note")
val builder2 =
EventBuilder.textNote("Hello with POW")
.tags(listOf(tag))
.pow(20u)
.customCreatedAt(Timestamp.fromSecs(1737976769u))
Swift
let tag = Tag.alt(summary: "POW text-note")
let timestamp = Timestamp.fromSecs(secs: 1737976769)
let builder2 = EventBuilder.textNote(content: "Hello with POW")
.tags(tags: [tag])
.pow(difficulty: 20)
.customCreatedAt(createdAt: timestamp)
Flutter
Tag tag = Tag.parse(tag: ["client", "rust-nostr"]);
EventBuilder builder2 =
EventBuilder.textNote(content: "Hello with POW")
.tag(tag: tag)
.pow(difficulty: 20)
.customCreatedAt(createdAt: BigInt.from(1737976769));
If you need to create a non-standard event, you can use the default EventBuilder
constructor:
Rust
let builder = EventBuilder::new(Kind::Custom(33001), "My custom event");
Python
kind = Kind(33001)
builder3 = EventBuilder(kind, "My custom event")
JavaScript
let kind = new Kind(33001);
let builder3 = new EventBuilder(kind, "My custom event");
Kotlin
val kind = Kind(33001u)
val builder3 =EventBuilder(kind = kind, content = "My custom event")
Swift
let kind = Kind(kind: 33001)
let builder3 = EventBuilder(kind: kind, content: "My custom event")
Flutter
EventBuilder builder3 = EventBuilder(kind: 33001, content: "My custom event");
Build and sign the event
After the EventBuilder
construction, you can finally build and sign the event:
Rust
let event: Event = builder.sign(signer).await?;
Python
event = await builder.sign(signer)
JavaScript
let event = await builder.sign(signer);
Kotlin
val event: Event = builder.sign(signer)
Swift
let event = try await builder.sign(signer: signer)
Flutter
Event event = await builder.sign(signer);
Full example
Rust
use nostr_sdk::prelude::*;
async fn sign_and_print<T>(signer: &T, builder: EventBuilder) -> Result<()>
where
T: NostrSigner,
{
let event: Event = builder.sign(signer).await?;
println!("{}", event.as_json());
Ok(())
}
pub async fn event() -> Result<()> {
let keys = Keys::generate();
let builder = EventBuilder::text_note("Hello");
sign_and_print(&keys, builder).await?;
let builder =
EventBuilder::text_note("Hello with POW")
.tag(Tag::alt("POW text-note"))
.pow(20)
.custom_created_at(Timestamp::from_secs(1737976769));
sign_and_print(&keys, builder).await?;
let builder = EventBuilder::new(Kind::Custom(33001), "My custom event");
sign_and_print(&keys, builder).await
}
Python
from nostr_sdk import Keys, EventBuilder, Kind, Tag, NostrSigner, Timestamp
async def sign_and_print(signer: NostrSigner, builder: EventBuilder):
event = await builder.sign(signer)
print(event.as_json())
async def event_builder():
keys = Keys.generate()
signer = NostrSigner.keys(keys)
builder1 = EventBuilder.text_note("Hello")
await sign_and_print(signer, builder1)
tag = Tag.alt("POW text-note")
custom_timestamp = Timestamp.from_secs(1737976769)
builder2 = EventBuilder.text_note("Hello with POW").tags([tag]).pow(20).custom_created_at(custom_timestamp)
await sign_and_print(signer, builder2)
kind = Kind(33001)
builder3 = EventBuilder(kind, "My custom event")
await sign_and_print(signer, builder3)
JavaScript
import {Keys, EventBuilder, Tag, Timestamp, Kind, loadWasmSync, NostrSigner} from "@rust-nostr/nostr-sdk"
async function signAndPrint(signer: NostrSigner, builder: EventBuilder) {
let event = await builder.sign(signer);
console.log(event.asJson())
}
async function run() {
// Load WASM
loadWasmSync();
let keys = Keys.generate();
let signer = NostrSigner.keys(keys);
let builder1 = EventBuilder.textNote("Hello");
await signAndPrint(signer, builder1);
let builder2 =
EventBuilder.textNote("Hello with POW")
.tags([Tag.alt("POW text-note")])
.pow(20)
.customCreatedAt(Timestamp.fromSecs(1737976769));
await signAndPrint(signer, builder2);
let kind = new Kind(33001);
let builder3 = new EventBuilder(kind, "My custom event");
await signAndPrint(signer, builder3);
}
run();
Kotlin
import kotlinx.coroutines.runBlocking
import rust.nostr.sdk.Event
import rust.nostr.sdk.EventBuilder
import rust.nostr.sdk.Keys
import rust.nostr.sdk.Kind
import rust.nostr.sdk.NostrSigner
import rust.nostr.sdk.Tag
import rust.nostr.sdk.Timestamp
suspend fun signAndPrint(signer: NostrSigner, builder: EventBuilder) {
val event: Event = builder.sign(signer)
print(event.asJson())
}
suspend fun builder() {
val keys = Keys.generate()
val signer = NostrSigner.keys(keys)
val builder1 = EventBuilder.textNote("Hello")
signAndPrint(signer, builder1)
val tag = Tag.alt("POW text-note")
val builder2 =
EventBuilder.textNote("Hello with POW")
.tags(listOf(tag))
.pow(20u)
.customCreatedAt(Timestamp.fromSecs(1737976769u))
signAndPrint(signer, builder2)
val kind = Kind(33001u)
val builder3 =EventBuilder(kind = kind, content = "My custom event")
signAndPrint(signer, builder3)
}
fun main() {
runBlocking { builder() }
}
Swift
import NostrSDK
import Foundation
func signAndPrint(signer: NostrSigner, builder: EventBuilder) async throws {
let event = try await builder.sign(signer: signer)
print(try event.asJson())
}
func builder() async throws{
let keys = Keys.generate()
let signer = NostrSigner.keys(keys: keys)
let builder1 = EventBuilder.textNote(content: "Hello")
try await signAndPrint(signer: signer, builder: builder1)
let tag = Tag.alt(summary: "POW text-note")
let timestamp = Timestamp.fromSecs(secs: 1737976769)
let builder2 = EventBuilder.textNote(content: "Hello with POW")
.tags(tags: [tag])
.pow(difficulty: 20)
.customCreatedAt(createdAt: timestamp)
try await signAndPrint(signer: signer, builder: builder2)
let kind = Kind(kind: 33001)
let builder3 = EventBuilder(kind: kind, content: "My custom event")
try await signAndPrint(signer: signer, builder: builder3)
}
Flutter
import 'package:nostr_sdk/nostr_sdk.dart';
Future<void> signAndPrint({signer = NostrSigner, builder = EventBuilder}) async {
Event event = await builder.sign(signer);
print(event.asJson());
}
Future<void> event() async {
Keys keys = Keys.generate();
NostrSigner signer = NostrSigner.keys(keys: keys);
EventBuilder builder1 = EventBuilder.textNote(content: "Hello");
await signAndPrint(signer: signer, builder: builder1);
Tag tag = Tag.parse(tag: ["client", "rust-nostr"]);
EventBuilder builder2 =
EventBuilder.textNote(content: "Hello with POW")
.tag(tag: tag)
.pow(difficulty: 20)
.customCreatedAt(createdAt: BigInt.from(1737976769));
await signAndPrint(signer: signer, builder: builder2);
EventBuilder builder3 = EventBuilder(kind: 33001, content: "My custom event");
await signAndPrint(signer: signer, builder: builder3);
}