forked from coracle/nostrlib
75 lines
1.4 KiB
Go
75 lines
1.4 KiB
Go
package nostr
|
|
|
|
import (
|
|
stdjson "encoding/json"
|
|
"fmt"
|
|
"unsafe"
|
|
|
|
"github.com/templexxx/xhex"
|
|
)
|
|
|
|
// RelayEvent represents an event received from a specific relay.
|
|
type RelayEvent struct {
|
|
Event
|
|
Relay *Relay
|
|
}
|
|
|
|
var ZeroID = ID{}
|
|
|
|
// ID represents an event id
|
|
type ID [32]byte
|
|
|
|
var (
|
|
_ stdjson.Marshaler = ID{}
|
|
_ stdjson.Unmarshaler = (*ID)(nil)
|
|
)
|
|
|
|
func (id ID) String() string { return "id::" + id.Hex() }
|
|
func (id ID) Hex() string { return HexEncodeToString(id[:]) }
|
|
|
|
func (id ID) MarshalJSON() ([]byte, error) {
|
|
res := make([]byte, 66)
|
|
xhex.Encode(res[1:], id[:])
|
|
res[0] = '"'
|
|
res[65] = '"'
|
|
return res, nil
|
|
}
|
|
|
|
func (id *ID) UnmarshalJSON(buf []byte) error {
|
|
if len(buf) != 66 {
|
|
return fmt.Errorf("must be a quoted hex string of 64 characters")
|
|
}
|
|
err := xhex.Decode(id[:], buf[1:65])
|
|
return err
|
|
}
|
|
|
|
func IDFromHex(idh string) (ID, error) {
|
|
id := ID{}
|
|
|
|
if len(idh) != 64 {
|
|
return id, fmt.Errorf("pubkey should be 64-char hex, got '%s'", idh)
|
|
}
|
|
if err := xhex.Decode(id[:], unsafe.Slice(unsafe.StringData(idh), 64)); err != nil {
|
|
return id, fmt.Errorf("'%s' is not valid hex: %w", idh, err)
|
|
}
|
|
|
|
return id, nil
|
|
}
|
|
|
|
func MustIDFromHex(idh string) ID {
|
|
id := ID{}
|
|
if err := xhex.Decode(id[:], unsafe.Slice(unsafe.StringData(idh), 64)); err != nil {
|
|
panic(err)
|
|
}
|
|
return id
|
|
}
|
|
|
|
func ContainsID(haystack []ID, needle ID) bool {
|
|
for _, cand := range haystack {
|
|
if cand == needle {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|