go-nostr/example/example.go

130 lines
3.0 KiB
Go

package main
import (
"context"
"fmt"
"io"
"os"
"strings"
"time"
jsoniter "github.com/json-iterator/go"
"github.com/nbd-wtf/go-nostr"
"github.com/nbd-wtf/go-nostr/nip19"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
// connect to relay
url := "wss://relay.stoner.com"
relay, err := nostr.RelayConnect(ctx, url)
if err != nil {
panic(err)
}
reader := os.Stdin
var npub string
var b [64]byte
fmt.Fprintf(os.Stderr, "using %s\n----\nexample subscription for three most recent notes mentioning user\npaste npub key: ", url)
if n, err := reader.Read(b[:]); err == nil {
npub = strings.TrimSpace(fmt.Sprintf("%s", b[:n]))
} else {
panic(err)
}
// create filters
var filters nostr.Filters
if _, v, err := nip19.Decode(npub); err == nil {
t := make(map[string][]string)
// making a "p" tag for the above public key.
// this filters for messages tagged with the user, mainly replies.
t["p"] = []string{v.(string)}
filters = []nostr.Filter{{
Kinds: []int{nostr.KindTextNote},
Tags: t,
// limit = 3, get the three most recent notes
Limit: 3,
}}
} else {
panic("not a valid npub!")
}
// create a subscription and submit to relay
// results will be returned on the sub.Events channel
sub, _ := relay.Subscribe(ctx, filters)
// we will append the returned events to this slice
evs := make([]nostr.Event, 0)
go func() {
<-sub.EndOfStoredEvents
cancel()
}()
for ev := range sub.Events {
evs = append(evs, *ev)
}
filename := "example_output.json"
if f, err := os.Create(filename); err == nil {
fmt.Fprintf(os.Stderr, "returned events saved to %s\n", filename)
// encode the returned events in a file
enc := jsoniter.NewEncoder(f)
enc.SetIndent("", " ")
enc.Encode(evs)
f.Close()
} else {
panic(err)
}
fmt.Fprintf(os.Stderr, "----\nexample publication of note.\npaste nsec key (leave empty to autogenerate): ")
var nsec string
if n, err := reader.Read(b[:]); err == nil {
nsec = strings.TrimSpace(fmt.Sprintf("%s", b[:n]))
} else {
panic(err)
}
var sk string
ev := nostr.Event{}
if _, s, e := nip19.Decode(nsec); e == nil {
sk = s.(string)
} else {
sk = nostr.GeneratePrivateKey()
}
if pub, e := nostr.GetPublicKey(sk); e == nil {
ev.PubKey = pub
if npub, e := nip19.EncodePublicKey(pub); e == nil {
fmt.Fprintln(os.Stderr, "using:", npub)
}
} else {
panic(e)
}
ev.CreatedAt = nostr.Now()
ev.Kind = nostr.KindTextNote
var content string
fmt.Fprintln(os.Stderr, "enter content of note, ending with an empty newline (ctrl+d):")
for {
if n, err := reader.Read(b[:]); err == nil {
content = fmt.Sprintf("%s%s", content, fmt.Sprintf("%s", b[:n]))
} else if err == io.EOF {
break
} else {
panic(err)
}
}
ev.Content = strings.TrimSpace(content)
ev.Sign(sk)
for _, url := range []string{"wss://relay.stoner.com"} {
ctx := context.WithValue(context.Background(), "url", url)
relay, e := nostr.RelayConnect(ctx, url)
if e != nil {
fmt.Println(e)
continue
}
fmt.Println("posting to: ", url)
relay.Publish(ctx, ev)
}
}