nostr package, readme updates accordingly, matching example program (#14)

This commit is contained in:
BitcoinCoderBob 2022-10-12 16:24:30 -04:00 committed by GitHub
parent e47c80a63d
commit 9549c3624a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 102 additions and 9 deletions

View File

@ -13,12 +13,8 @@ A set of useful things for [Nostr Protocol](https://github.com/fiatjaf/nostr) im
```go
pool := nostr.NewRelayPool()
pool.Add("wss://relay.nostr.com/", &nostr.RelayPoolPolicy{
SimplePolicy: nostr.SimplePolicy{Read: true, Write: true},
})
pool.Add("wss://nostrrelay.example.com/", &nostr.RelayPoolPolicy{
SimplePolicy: nostr.SimplePolicy{Read: true, Write: true},
})
pool.Add("wss://relay.nostr.com/", nostr.SimplePolicy{Read: true, Write: true})
pool.Add("wss://nostrrelay.example.com/", nostr.SimplePolicy{Read: true, Write: true})
for notice := range pool.Notices {
log.Printf("%s has sent a notice: '%s'\n", notice.Relay, notice.Message)
@ -28,10 +24,10 @@ for notice := range pool.Notices {
### Listening for events
```go
sub := pool.Sub(nostr.EventFilters{
sub := pool.Sub(nostr.Filters{
{
Authors: []string{"0ded86bf80c76847320b16f22b7451c08169434837a51ad5fe3b178af6c35f5d"},
Kinds: []string{nostr.KindTextNote}, // or {1}
Kinds: []int{nostr.KindTextNote}, // or {1}
},
})
@ -53,7 +49,7 @@ secretKey := "3f06a81e0a0c2ad34ee9df2a30d87a810da9e3c3881f780755ace5e5e64d30a7"
pool.SecretKey = &secretKey
event, statuses, _ := pool.PublishEvent(&nostr.Event{
CreatedAt: uint32(time.Now().Unix()),
CreatedAt: time.Now(),
Kind: nostr.KindTextNote,
Tags: make(nostr.Tags, 0),
Content: "hello",
@ -83,3 +79,9 @@ sk, _ := nostr.GenerateKey()
fmt.Println("sk:", sk)
fmt.Println("pk:", nostr.GetPublicKey(sk))
```
### Example Program
```
go run example/example.go
```

91
example/example.go Normal file
View File

@ -0,0 +1,91 @@
package main
import (
"fmt"
"time"
"github.com/fiatjaf/go-nostr/nostr"
)
// some nostr relay in the wild
var relayURL = "wss://nostr-relay.wlvs.space"
func main() {
// create key pair
secretKey := nostr.GeneratePrivateKey()
publicKey, err := nostr.GetPublicKey(secretKey)
if err != nil {
fmt.Printf("error with GetPublicKey(): %s\n", err)
return
}
fmt.Printf("Our Pubkey: %s\n\n", publicKey)
fmt.Printf("Lets send and receive 4 events...\n\n")
// subscribe to relay
pool := nostr.NewRelayPool()
pool.SecretKey = &secretKey
// add a nostr relay to our pool
err = pool.Add(relayURL, nostr.SimplePolicy{Read: true, Write: true})
if err != nil {
fmt.Printf("error calling Add(): %s\n", err.Error())
}
// subscribe to relays in our pool, with filtering
sub := pool.Sub(nostr.Filters{
{
Authors: []string{publicKey},
Kinds: []int{nostr.KindTextNote},
},
})
// listen for events from our subscriptions
go func() {
for event := range sub.UniqueEvents {
fmt.Printf("Received Event: %+v\n\n", event)
}
}()
// create and publish events
go func() {
for {
content := fmt.Sprintf("henlo world at time: %s", time.Now().String())
event, statuses, err := pool.PublishEvent(&nostr.Event{
CreatedAt: time.Now(),
Kind: nostr.KindTextNote,
Tags: make(nostr.Tags, 0),
Content: content,
})
if err != nil {
fmt.Printf("error calling PublishEvent(): %s\n", err.Error())
}
StatusProcess(event, statuses)
// sleep between publishing events
time.Sleep(time.Second * 5)
}
}()
// after 20 seconds, unsubscribe from our pool and terminate program
time.Sleep(20 * time.Second)
fmt.Println("unsubscribing from nostr subscription")
sub.Unsub()
}
// handle events from out publish events
func StatusProcess(event *nostr.Event, statuses chan nostr.PublishStatus) {
for status := range statuses {
switch status.Status {
case nostr.PublishStatusSent:
fmt.Printf("Sent event with id %s to '%s'.\n", event.ID, status.Relay)
return
case nostr.PublishStatusFailed:
fmt.Printf("Failed to send event with id %s to '%s'.\n", event.ID, status.Relay)
return
case nostr.PublishStatusSucceeded:
fmt.Printf("Event with id %s seen on '%s'.\n", event.ID, status.Relay)
return
}
}
}