mirror of
https://github.com/nbd-wtf/go-nostr.git
synced 2025-03-17 13:22:56 +01:00
130 lines
3.0 KiB
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)
|
|
}
|
|
}
|