Files
nostrlib/types.go
T
2025-04-15 17:13:57 -03:00

91 lines
2.0 KiB
Go

package nostr
import (
"encoding/hex"
"fmt"
"unsafe"
)
// RelayEvent represents an event received from a specific relay.
type RelayEvent struct {
Event
Relay *Relay
}
var (
ZeroID = [32]byte{}
ZeroPK = [32]byte{}
)
type PubKey [32]byte
func (pk PubKey) String() string { return hex.EncodeToString(pk[:]) }
func (pk PubKey) Hex() string { return hex.EncodeToString(pk[:]) }
func PubKeyFromHex(pkh string) (PubKey, error) {
pk := PubKey{}
if len(pkh) != 64 {
return pk, fmt.Errorf("pubkey should be 64-char hex, got '%s'", pkh)
}
if _, err := hex.Decode(pk[:], unsafe.Slice(unsafe.StringData(pkh), 64)); err != nil {
return pk, fmt.Errorf("'%s' is not valid hex: %w", pkh, err)
}
if !IsValidPublicKey(pk) {
return pk, fmt.Errorf("'%s' is not a valid pubkey", pkh)
}
return pk, nil
}
func PubKeyFromHexCheap(pkh string) (PubKey, error) {
pk := PubKey{}
if len(pkh) != 64 {
return pk, fmt.Errorf("pubkey should be 64-char hex, got '%s'", pkh)
}
if _, err := hex.Decode(pk[:], unsafe.Slice(unsafe.StringData(pkh), 64)); err != nil {
return pk, fmt.Errorf("'%s' is not valid hex: %w", pkh, err)
}
return pk, nil
}
func MustPubKeyFromHex(pkh string) PubKey {
pk := PubKey{}
hex.Decode(pk[:], unsafe.Slice(unsafe.StringData(pkh), 64))
return pk
}
func ContainsPubKey(haystack []PubKey, needle PubKey) bool {
for _, cand := range haystack {
if cand == needle {
return true
}
}
return false
}
type ID [32]byte
func (id ID) String() string { return hex.EncodeToString(id[:]) }
func (id ID) Hex() string { return hex.EncodeToString(id[:]) }
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 := hex.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{}
hex.Decode(id[:], unsafe.Slice(unsafe.StringData(idh), 64))
return id
}