mirror of https://github.com/edouardparis/lntop
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.0 KiB
Go
120 lines
2.0 KiB
Go
5 years ago
|
package models
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"sort"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/edouardparis/lntop/network/models"
|
||
|
)
|
||
|
|
||
|
type TransactionsSort func(*models.Transaction, *models.Transaction) bool
|
||
|
|
||
|
type Transactions struct {
|
||
|
current *models.Transaction
|
||
|
list []*models.Transaction
|
||
|
sort TransactionsSort
|
||
|
mu sync.RWMutex
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Current() *models.Transaction {
|
||
|
return t.current
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) SetCurrent(index int) {
|
||
|
t.current = t.Get(index)
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) List() []*models.Transaction {
|
||
|
return t.list
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Len() int {
|
||
|
return len(t.list)
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Swap(i, j int) {
|
||
|
t.list[i], t.list[j] = t.list[j], t.list[i]
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Less(i, j int) bool {
|
||
|
return t.sort(t.list[i], t.list[j])
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Sort(s TransactionsSort) {
|
||
|
if s == nil {
|
||
|
return
|
||
|
}
|
||
|
t.sort = s
|
||
|
sort.Sort(t)
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Get(index int) *models.Transaction {
|
||
|
if index < 0 || index > len(t.list)-1 {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return t.list[index]
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Contains(tx *models.Transaction) bool {
|
||
|
if tx == nil {
|
||
|
return false
|
||
|
}
|
||
|
for i := range t.list {
|
||
|
if t.list[i].TxHash == tx.TxHash {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Add(tx *models.Transaction) {
|
||
|
t.mu.Lock()
|
||
|
defer t.mu.Unlock()
|
||
|
if t.Contains(tx) {
|
||
|
return
|
||
|
}
|
||
|
t.list = append(t.list, tx)
|
||
|
if t.sort != nil {
|
||
|
sort.Sort(t)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (t *Transactions) Update(tx *models.Transaction) {
|
||
|
if tx == nil {
|
||
|
return
|
||
|
}
|
||
|
if !t.Contains(tx) {
|
||
|
t.Add(tx)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
t.mu.Lock()
|
||
|
defer t.mu.Unlock()
|
||
|
|
||
|
for i := range t.list {
|
||
|
if t.list[i].TxHash == tx.TxHash {
|
||
|
t.list[i].NumConfirmations = tx.NumConfirmations
|
||
|
t.list[i].BlockHeight = tx.BlockHeight
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if t.sort != nil {
|
||
|
sort.Sort(t)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *Models) RefreshTransactions(ctx context.Context) error {
|
||
|
transactions, err := m.network.GetTransactions(ctx)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for i := range transactions {
|
||
|
m.Transactions.Update(transactions[i])
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|