package lnwire
import (
"bytes"
"fmt"
"image/color"
"io"
"io/ioutil"
"net"
"unicode/utf8"
)
type ErrUnknownAddrType struct {
addrType addressType
}
func (e ErrUnknownAddrType) Error() string {
return fmt.Sprintf("unknown address type: %v", e.addrType)
}
type ErrInvalidNodeAlias struct{}
func (e ErrInvalidNodeAlias) Error() string {
return "node alias has non-utf8 characters"
}
type NodeAlias [32]byte
func NewNodeAlias(s string) (NodeAlias, error) {
var n NodeAlias
if len(s) > 32 {
return n, fmt.Errorf("alias too large: max is %v, got %v", 32,
len(s))
}
if !utf8.ValidString(s) {
return n, &ErrInvalidNodeAlias{}
}
copy(n[:], []byte(s))
return n, nil
}
func (n NodeAlias) String() string {
return string(bytes.Trim(n[:], "\x00"))
}
type NodeAnnouncement struct {
Signature Sig
Features *RawFeatureVector
Timestamp uint32
NodeID [33]byte
RGBColor color.RGBA
Alias NodeAlias
Addresses []net.Addr
ExtraOpaqueData []byte
}
var _ Message = (*NodeAnnouncement)(nil)
func (a *NodeAnnouncement) Decode(r io.Reader, pver uint32) error {
err := ReadElements(r,
&a.Signature,
&a.Features,
&a.Timestamp,
&a.NodeID,
&a.RGBColor,
&a.Alias,
&a.Addresses,
)
if err != nil {
return err
}
a.ExtraOpaqueData, err = ioutil.ReadAll(r)
if err != nil {
return err
}
if len(a.ExtraOpaqueData) == 0 {
a.ExtraOpaqueData = nil
}
return nil
}
func (a *NodeAnnouncement) Encode(w io.Writer, pver uint32) error {
return WriteElements(w,
a.Signature,
a.Features,
a.Timestamp,
a.NodeID,
a.RGBColor,
a.Alias,
a.Addresses,
a.ExtraOpaqueData,
)
}
func (a *NodeAnnouncement) MsgType() MessageType {
return MsgNodeAnnouncement
}
func (a *NodeAnnouncement) MaxPayloadLength(pver uint32) uint32 {
return 65533
}
func (a *NodeAnnouncement) DataToSign() ([]byte, error) {
var w bytes.Buffer
err := WriteElements(&w,
a.Features,
a.Timestamp,
a.NodeID,
a.RGBColor,
a.Alias[:],
a.Addresses,
a.ExtraOpaqueData,
)
if err != nil {
return nil, err
}
return w.Bytes(), nil
}