a library for creating NIP-29 relays, based on khatru.
Caution
|
This is probably broken so please don’t trust it for anything serious and be prepared to delete your database. |
package main
import (
"fmt"
"log"
"net/http"
"github.com/fiatjaf/eventstore/slicestore"
"github.com/fiatjaf/khatru/policies"
"github.com/fiatjaf/relay29"
"github.com/nbd-wtf/go-nostr"
"golang.org/x/exp/slices"
)
func main() {
relayPrivateKey := nostr.GeneratePrivateKey()
state := relay29.Init(relay29.Options{
Domain: "localhost:2929",
DB: &slicestore.SliceStore{},
SecretKey: relayPrivateKey,
})
// init relay
state.Relay.Info.Name = "very ephemeral chat relay"
state.Relay.Info.Description = "everything will be deleted as soon as I turn off my computer"
// extra policies
state.Relay.RejectEvent = slices.Insert(state.Relay.RejectEvent, 0,
policies.PreventLargeTags(64),
policies.PreventTooManyIndexableTags(6, []int{9005}, nil),
policies.RestrictToSpecifiedKinds(
9, 10, 11, 12,
30023, 31922, 31923, 9802,
9000, 9001, 9002, 9003, 9004, 9005, 9006, 9007,
9021,
),
policies.PreventTimestampsInThePast(60),
policies.PreventTimestampsInTheFuture(30),
)
// http routes
state.Relay.Router().HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "nothing to see here, you must use a nip-29 powered client")
})
fmt.Println("running on http://0.0.0.0:2929")
if err := http.ListenAndServe(":2929", state.Relay); err != nil {
log.Fatal("failed to serve")
}
}
Basically you just call relay29.Init()
and then you get back a relay29.State
object that has a normal khatru.Relay
inside and and also a map of Group
objects that you can read but you should not modify manually. To modify these groups you must write moderation events with the .AddEvent()
method of the Relay
. This API may be improved later.
See examples/groups.fiatjaf.com/main.go for a (not very much) more complex example.