From b76331701428e88a697f52e4dbbafef1bdcbb5c3 Mon Sep 17 00:00:00 2001 From: Edouard Paris Date: Thu, 4 Apr 2019 13:06:38 +0200 Subject: [PATCH] network: GetNode --- network/backend/backend.go | 4 +++- network/backend/lnd/lnd.go | 18 ++++++++++++++++++ network/backend/lnd/proto.go | 25 +++++++++++++++++++++++++ network/backend/mock/mock.go | 4 ++++ network/models/node.go | 17 +++++++++++++++++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 network/models/node.go diff --git a/network/backend/backend.go b/network/backend/backend.go index b99feeb..7f3b8c6 100644 --- a/network/backend/backend.go +++ b/network/backend/backend.go @@ -14,7 +14,9 @@ type Backend interface { NodeName() string - Info(ctx context.Context) (*models.Info, error) + Info(context.Context) (*models.Info, error) + + GetNode(context.Context, string) (*models.Node, error) GetWalletBalance(context.Context) (*models.WalletBalance, error) diff --git a/network/backend/lnd/lnd.go b/network/backend/lnd/lnd.go index 1cac6f6..552b695 100644 --- a/network/backend/lnd/lnd.go +++ b/network/backend/lnd/lnd.go @@ -230,6 +230,24 @@ func (l Backend) GetChannelInfo(ctx context.Context, channel *models.Channel) er return nil } +func (l Backend) GetNode(ctx context.Context, pubkey string) (*models.Node, error) { + l.logger.Debug("GetNode") + + clt, err := l.Client(ctx) + if err != nil { + return nil, err + } + defer clt.Close() + + req := &lnrpc.NodeInfoRequest{PubKey: pubkey} + resp, err := clt.GetNodeInfo(ctx, req) + if err != nil { + return nil, errors.WithStack(err) + } + + return nodeProtoToNode(resp), nil +} + func (l Backend) CreateInvoice(ctx context.Context, amount int64, desc string) (*models.Invoice, error) { l.logger.Debug("Create invoice...", logging.Int64("amount", amount), diff --git a/network/backend/lnd/proto.go b/network/backend/lnd/proto.go index 405dd5e..0f3c529 100644 --- a/network/backend/lnd/proto.go +++ b/network/backend/lnd/proto.go @@ -1,6 +1,8 @@ package lnd import ( + "time" + "github.com/lightningnetwork/lnd/lnrpc" "github.com/edouardparis/lntop/network/models" @@ -160,3 +162,26 @@ func infoProtoToInfo(resp *lnrpc.GetInfoResponse) *models.Info { Testnet: resp.Testnet, } } + +func nodeProtoToNode(resp *lnrpc.NodeInfo) *models.Node { + if resp == nil || resp.Node == nil { + return nil + } + + addresses := make([]*models.NodeAddress, len(resp.Node.Addresses)) + for i := range resp.Node.Addresses { + addresses[i] = &models.NodeAddress{ + Network: resp.Node.Addresses[i].Network, + Addr: resp.Node.Addresses[i].Addr, + } + } + + return &models.Node{ + NumChannels: resp.NumChannels, + TotalCapacity: resp.TotalCapacity, + LastUpdate: time.Unix(int64(resp.Node.LastUpdate), 0), + PubKey: resp.Node.PubKey, + Alias: resp.Node.Alias, + Addresses: addresses, + } +} diff --git a/network/backend/mock/mock.go b/network/backend/mock/mock.go index ac51e04..b404bb0 100644 --- a/network/backend/mock/mock.go +++ b/network/backend/mock/mock.go @@ -42,6 +42,10 @@ func (b *Backend) SubscribeChannels(context.Context, chan *models.ChannelUpdate) return nil } +func (l *Backend) GetNode(ctx context.Context, pubkey string) (*models.Node, error) { + return &models.Node{}, nil +} + func (b *Backend) GetWalletBalance(ctx context.Context) (*models.WalletBalance, error) { return &models.WalletBalance{}, nil } diff --git a/network/models/node.go b/network/models/node.go new file mode 100644 index 0000000..c67199d --- /dev/null +++ b/network/models/node.go @@ -0,0 +1,17 @@ +package models + +import "time" + +type Node struct { + NumChannels uint32 + TotalCapacity int64 + LastUpdate time.Time + PubKey string + Alias string + Addresses []*NodeAddress +} + +type NodeAddress struct { + Network string + Addr string +}