diff --git a/p2p/peers.go b/p2p/peers.go index 8b5e7c0..a2b62d9 100644 --- a/p2p/peers.go +++ b/p2p/peers.go @@ -6,26 +6,68 @@ import ( "github.com/libp2p/go-libp2p/core/peer" ) -// Get list of connected peers for the given host -func (p *P2P) GetConnectedPeers() map[string]*peer.AddrInfo { +// GetAllConnectedPeers returns a slice of peer.ID for all connected peers of the given host. +func (p *P2P) GetAllConnectedPeers() peer.IDSlice { + h := p.Node + var connectedPeers peer.IDSlice + + for _, p := range h.Network().Peers() { + if h.Network().Connectedness(p) == network.Connected { + connectedPeers = append(connectedPeers, p) + } + } + return connectedPeers +} + +// GetConnectedProtectedPeers returns a slice of peer.ID for all protected connected peers. +func (p *P2P) GetConnectedProtectedPeers() peer.IDSlice { h := p.Node + var connectedProtectedPeers peer.IDSlice - connectedPeers := make(map[string]*peer.AddrInfo) + for _, connectedPeer := range p.GetAllConnectedPeers() { + if h.ConnManager().IsProtected(connectedPeer, ma.RENDEZVOUS) { + connectedProtectedPeers = append(connectedProtectedPeers, connectedPeer) + } + } - for _, p := range h.Network().Peers() { + return connectedProtectedPeers +} - if h.ConnManager().IsProtected(p, ma.RENDEZVOUS) { +// GetConnectedUnprotectedPeers returns a slice of peer.ID for all unprotected connected peers. +func (p *P2P) GetConnectedUnprotectedPeers() peer.IDSlice { + connectedPeers := p.GetAllConnectedPeers() + connectedProtectedPeers := p.GetConnectedProtectedPeers() - if h.Network().Connectedness(p) == network.Connected { + var connectedUnprotectedPeers peer.IDSlice + for _, connectedPeer := range connectedPeers { + if !containsPeer(connectedProtectedPeers, connectedPeer) { + connectedUnprotectedPeers = append(connectedUnprotectedPeers, connectedPeer) + } + } - connectedPeer := h.Peerstore().PeerInfo(p) + return connectedUnprotectedPeers +} - connectedPeers[p.String()] = &connectedPeer - } +// containsPeer checks if a peer.ID is present in a slice of peer.ID. +func containsPeer(slice peer.IDSlice, peerID peer.ID) bool { + for _, p := range slice { + if p == peerID { + return true } + } + return false +} +// GetConnectedProtectedPeersAddrInfo returns a map of peer.ID to AddrInfo for all protected connected peers. +func (p *P2P) GetConnectedProtectedPeersAddrInfo() map[string]*peer.AddrInfo { + h := p.Node + connectedPeersAddrInfo := make(map[string]*peer.AddrInfo) + + for _, connectedPeer := range p.GetConnectedProtectedPeers() { + peerAddrInfo := h.Peerstore().PeerInfo(connectedPeer) + connectedPeersAddrInfo[connectedPeer.String()] = &peerAddrInfo } - return connectedPeers + return connectedPeersAddrInfo } diff --git a/ui/peers.go b/ui/peers.go index e2c83f2..0d34930 100644 --- a/ui/peers.go +++ b/ui/peers.go @@ -25,7 +25,7 @@ func (ui *ChatUI) handleAliasCommand(args []string) { func (ui *ChatUI) refreshPeers() { // Tweak this to change the timeout for peer discovery - peers := ui.p.GetConnectedPeers() + peers := ui.p.GetConnectedProtectedPeersAddrInfo() // clear is thread-safe ui.peersList.Clear()