handle event responses as per NIP-20

This commit is contained in:
0x0ff 2022-12-23 15:55:52 +01:00 committed by fiatjaf
parent 05e8f03d43
commit f2ab8020a8
4 changed files with 34 additions and 15 deletions

View File

@ -3,6 +3,7 @@ package relayer
import (
"fmt"
"github.com/fiatjaf/relayer/storage"
"github.com/nbd-wtf/go-nostr"
)
@ -32,7 +33,7 @@ func AddEvent(relay Relay, evt nostr.Event) (accepted bool, message string) {
}
if !relay.AcceptEvent(&evt) {
return false, "blocked"
return false, "blocked: event blocked by relay"
}
if 20000 <= evt.Kind && evt.Kind < 30000 {
@ -42,8 +43,13 @@ func AddEvent(relay Relay, evt nostr.Event) (accepted bool, message string) {
advancedSaver.BeforeSave(&evt)
}
if err := store.SaveEvent(&evt); err != nil {
return false, fmt.Sprintf("error: failed to save: %s", err.Error())
if saveErr := store.SaveEvent(&evt); saveErr != nil {
switch saveErr {
case storage.ErrDupEvent:
return true, saveErr.Error()
default:
return false, fmt.Sprintf("error: failed to save: %s", saveErr.Error())
}
}
if advancedSaver != nil {

View File

@ -9,9 +9,9 @@ import (
"time"
"github.com/cockroachdb/pebble"
"github.com/nbd-wtf/go-nostr"
"github.com/fiatjaf/relayer"
"github.com/kelseyhightower/envconfig"
"github.com/nbd-wtf/go-nostr"
)
var relay = &Relay{
@ -101,9 +101,13 @@ type store struct {
db *pebble.DB
}
func (b store) Init() error { return nil }
func (b store) SaveEvent(_ *nostr.Event) error { return errors.New("we don't accept any events") }
func (b store) DeleteEvent(_, _ string) error { return errors.New("we can't delete any events") }
func (b store) Init() error { return nil }
func (b store) SaveEvent(_ *nostr.Event) error {
return errors.New("blocked: we don't accept any events")
}
func (b store) DeleteEvent(_, _ string) error {
return errors.New("blocked: we can't delete any events")
}
func (b store) QueryEvents(filter *nostr.Filter) ([]nostr.Event, error) {
var evts []nostr.Event

5
storage/errors.go Normal file
View File

@ -0,0 +1,5 @@
package storage
import "errors"
var ErrDupEvent = errors.New("duplicate: event already exists")

View File

@ -2,9 +2,8 @@ package postgresql
import (
"encoding/json"
"fmt"
"strings"
"github.com/fiatjaf/relayer/storage"
"github.com/nbd-wtf/go-nostr"
)
@ -21,17 +20,22 @@ func (b *PostgresBackend) SaveEvent(evt *nostr.Event) error {
// insert
tagsj, _ := json.Marshal(evt.Tags)
_, err := b.DB.Exec(`
res, err := b.DB.Exec(`
INSERT INTO event (id, pubkey, created_at, kind, tags, content, sig)
VALUES ($1, $2, $3, $4, $5, $6, $7)
ON CONFLICT (id) DO NOTHING
`, evt.ID, evt.PubKey, evt.CreatedAt.Unix(), evt.Kind, tagsj, evt.Content, evt.Sig)
if err != nil {
if strings.Index(err.Error(), "UNIQUE") != -1 {
// already exists
return nil
}
return err
}
return fmt.Errorf("failed to save event %s: %w", evt.ID, err)
nr, err := res.RowsAffected()
if err != nil {
return err
}
if nr == 0 {
return storage.ErrDupEvent
}
return nil