package main import ( "context" "encoding/json" "fmt" "log" "time" "github.com/fiatjaf/relayer/v2" "github.com/fiatjaf/relayer/v2/storage/postgresql" "github.com/kelseyhightower/envconfig" "github.com/nbd-wtf/go-nostr" ) type Relay struct { PostgresDatabase string `envconfig:"POSTGRESQL_DATABASE"` storage *postgresql.PostgresBackend } func (r *Relay) Name() string { return "BasicRelay" } func (r *Relay) Storage(ctx context.Context) relayer.Storage { return r.storage } func (r *Relay) Init() error { err := envconfig.Process("", r) if err != nil { return fmt.Errorf("couldn't process envconfig: %w", err) } // every hour, delete all very old events go func() { db := r.Storage(context.TODO()).(*postgresql.PostgresBackend) for { time.Sleep(60 * time.Minute) db.DB.Exec(`DELETE FROM event WHERE created_at < $1`, time.Now().AddDate(0, -3, 0).Unix()) // 3 months } }() return nil } func (r *Relay) AcceptEvent(ctx context.Context, evt *nostr.Event) bool { // block events that are too large jsonb, _ := json.Marshal(evt) if len(jsonb) > 10000 { return false } return true } func main() { r := Relay{} if err := envconfig.Process("", &r); err != nil { log.Fatalf("failed to read from env: %v", err) return } r.storage = &postgresql.PostgresBackend{DatabaseURL: r.PostgresDatabase} server, err := relayer.NewServer(&r) if err != nil { log.Fatalf("failed to create server: %v", err) } if err := server.Start("0.0.0.0", 7447); err != nil { log.Fatalf("server terminated: %v", err) } }