diff --git a/network/backend/backend.go b/network/backend/backend.go index 8fc21c5..d72c551 100644 --- a/network/backend/backend.go +++ b/network/backend/backend.go @@ -12,6 +12,8 @@ type Backend interface { NodeName() string + Info(ctx context.Context) (*models.Info, error) + GetWalletBalance(context.Context) (*models.WalletBalance, error) GetChannelBalance(context.Context) (*models.ChannelBalance, error) diff --git a/network/backend/lnd/lnd.go b/network/backend/lnd/lnd.go index c4f5e50..52205bd 100644 --- a/network/backend/lnd/lnd.go +++ b/network/backend/lnd/lnd.go @@ -39,6 +39,20 @@ func (l Backend) NodeName() string { return l.cfg.ID } +func (l Backend) Info(ctx context.Context) (*models.Info, error) { + clt, err := l.Client(ctx) + if err != nil { + return nil, err + } + + resp, err := clt.GetInfo(ctx, &lnrpc.GetInfoRequest{}) + if err != nil { + return nil, err + } + + return infoProtoToInfo(resp), nil +} + func (l Backend) SubscribeInvoice(ctx context.Context, channelInvoice chan *models.Invoice) error { clt, err := l.Client(ctx) if err != nil { diff --git a/network/backend/lnd/proto.go b/network/backend/lnd/proto.go index 34a7c7a..40fe4c5 100644 --- a/network/backend/lnd/proto.go +++ b/network/backend/lnd/proto.go @@ -139,3 +139,22 @@ func sendPaymentProtoToPayment(payreq *models.PayReq, resp *lnrpc.SendResponse) return payment } + +func infoProtoToInfo(resp *lnrpc.GetInfoResponse) *models.Info { + if resp == nil { + return nil + } + + return &models.Info{ + PubKey: resp.IdentityPubkey, + Alias: resp.Alias, + NumPendingChannels: resp.NumPendingChannels, + NumActiveChannels: resp.NumActiveChannels, + NumInactiveChannels: resp.NumInactiveChannels, + NumPeers: resp.NumPeers, + BlockHeight: resp.BlockHeight, + BlockHash: resp.BlockHash, + Synced: resp.SyncedToChain, + Version: resp.Version, + } +} diff --git a/network/backend/mock/mock.go b/network/backend/mock/mock.go index e75b7a4..27b2dab 100644 --- a/network/backend/mock/mock.go +++ b/network/backend/mock/mock.go @@ -22,6 +22,10 @@ type Backend struct { sync.RWMutex } +func (b *Backend) Info(ctx context.Context) (*models.Info, error) { + return nil, nil +} + func (l *Backend) SendPayment(ctx context.Context, payreq *models.PayReq) (*models.Payment, error) { return nil, nil } diff --git a/network/models/info.go b/network/models/info.go new file mode 100644 index 0000000..b22d9ec --- /dev/null +++ b/network/models/info.go @@ -0,0 +1,22 @@ +package models + +import "github.com/edouardparis/lntop/logging" + +type Info struct { + PubKey string + Alias string + NumPendingChannels uint32 + NumActiveChannels uint32 + NumInactiveChannels uint32 + NumPeers uint32 + BlockHeight uint32 + BlockHash string + Synced bool + Version string +} + +func (i Info) MarshalLogObject(enc logging.ObjectEncoder) error { + enc.AddString("pubkey", i.PubKey) + enc.AddString("Alias", i.Alias) + return nil +} diff --git a/ui/views/channels.go b/ui/views/channels.go index 6dd95ae..3f7d43f 100644 --- a/ui/views/channels.go +++ b/ui/views/channels.go @@ -53,11 +53,12 @@ func (c *Channels) Set(g *gocui.Gui, x0, y0, x1, y1 int) error { } func displayChannelsColumns(v *gocui.View) { - fmt.Fprintln(v, fmt.Sprintf("%-9s %-26s %12s %12s", + fmt.Fprintln(v, fmt.Sprintf("%-9s %-26s %12s %12s %5s", "Status", "Gauge", "Local", "Capacity", + "pHTLC", )) } @@ -68,11 +69,12 @@ func (c *Channels) Update(items []*models.Channel) { func (c *Channels) display() { c.Clear() for _, item := range c.items { - line := fmt.Sprintf("%s %s %s %12d", + line := fmt.Sprintf("%s %s %s %12d %5d", active(item), gauge(item), color.Cyan(fmt.Sprintf("%12d", item.LocalBalance)), item.Capacity, + len(item.PendingHTLC), ) fmt.Fprintln(c.View, line) }