diff --git a/server.go b/server.go index 163c6c97..35388ce9 100644 --- a/server.go +++ b/server.go @@ -220,14 +220,19 @@ func newServer(listenAddrs []string, chanDB *channeldb.DB, cc *chainControl, chanGraph := chanDB.ChannelGraph() - defaultColor := color.RGBA{ // #3399FF - R: 51, - G: 153, - B: 255, + // Parse node color from configuration. + color, err := parseHexColor(cfg.Color) + if err != nil { + srvrLog.Errorf("unable to parse color: %v\n", err) + return nil, err } - // TODO(roasbeef): make alias configurable - alias, err := lnwire.NewNodeAlias(hex.EncodeToString(serializedPubKey[:10])) + // If no alias is provided, default to first 10 characters of public key + alias := cfg.Alias + if alias == "" { + alias = hex.EncodeToString(serializedPubKey[:10]) + } + nodeAlias, err := lnwire.NewNodeAlias(alias) if err != nil { return nil, err } @@ -236,9 +241,9 @@ func newServer(listenAddrs []string, chanDB *channeldb.DB, cc *chainControl, LastUpdate: time.Now(), Addresses: selfAddrs, PubKey: privKey.PubKey(), - Alias: alias.String(), + Alias: nodeAlias.String(), Features: s.globalFeatures, - Color: defaultColor, + Color: color, } // If our information has changed since our last boot, then we'll @@ -250,9 +255,9 @@ func newServer(listenAddrs []string, chanDB *channeldb.DB, cc *chainControl, Timestamp: uint32(selfNode.LastUpdate.Unix()), Addresses: selfNode.Addresses, NodeID: selfNode.PubKey, - Alias: alias, + Alias: nodeAlias, Features: selfNode.Features.RawFeatureVector, - RGBColor: defaultColor, + RGBColor: color, } selfNode.AuthSig, err = discovery.SignAnnouncement(s.nodeSigner, s.identityPriv.PubKey(), nodeAnn, @@ -1703,3 +1708,21 @@ func (s *server) Peers() []*peer { return peers } + +// parseHexColor takes a hex string representation of a color in the +// form "#RRGGBB", parses the hex color values, and returns a color.RGBA +// struct of the same color. +func parseHexColor(colorStr string) (color.RGBA, error) { + if len(colorStr) != 7 || colorStr[0] != '#' { + return color.RGBA{}, errors.New("Color must be in format #RRGGBB") + } + + // Decode the hex color string to bytes. + // The resulting byte array is in the form [R, G, B]. + colorBytes, err := hex.DecodeString(colorStr[1:]) + if err != nil { + return color.RGBA{}, err + } + + return color.RGBA{R: colorBytes[0], G: colorBytes[1], B: colorBytes[2]}, nil +} diff --git a/server_test.go b/server_test.go new file mode 100644 index 00000000..bd0d1444 --- /dev/null +++ b/server_test.go @@ -0,0 +1,34 @@ +package main + +import "testing" + +func TestParseHexColor(t *testing.T) { + empty := "" + color, err := parseHexColor(empty) + if err == nil { + t.Fatalf("Empty color string should return error, but did not") + } + + tooLong := "#1234567" + color, err = parseHexColor(tooLong) + if err == nil { + t.Fatalf("Invalid color string %s should return error, but did not", + tooLong) + } + + invalidFormat := "$123456" + color, err = parseHexColor(invalidFormat) + if err == nil { + t.Fatalf("Invalid color string %s should return error, but did not", + invalidFormat) + } + + valid := "#C0FfeE" + color, err = parseHexColor(valid) + if err != nil { + t.Fatalf("Color %s valid to parse: %s", valid, err) + } + if color.R != 0xc0 || color.G != 0xff || color.B != 0xee { + t.Fatalf("Color %s incorrectly parsed as %v", valid, color) + } +}