github.com/anacrolix/torrent@v1.61.0/tracker/http/peer.go (about)

     1  package httpTracker
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"net/netip"
     7  
     8  	"github.com/anacrolix/dht/v2/krpc"
     9  )
    10  
    11  // TODO: Use netip.Addr and Option[[20]byte].
    12  type Peer struct {
    13  	IP   net.IP `bencode:"ip"`
    14  	Port int    `bencode:"port"`
    15  	ID   []byte `bencode:"peer id"`
    16  }
    17  
    18  func (p Peer) ToNetipAddrPort() (addrPort netip.AddrPort, ok bool) {
    19  	addr, ok := netip.AddrFromSlice(p.IP)
    20  	addrPort = netip.AddrPortFrom(addr, uint16(p.Port))
    21  	return
    22  }
    23  
    24  func (p Peer) String() string {
    25  	loc := net.JoinHostPort(p.IP.String(), fmt.Sprintf("%d", p.Port))
    26  	if len(p.ID) != 0 {
    27  		return fmt.Sprintf("%x at %s", p.ID, loc)
    28  	} else {
    29  		return loc
    30  	}
    31  }
    32  
    33  // Set from the non-compact form in BEP 3.
    34  func (p *Peer) FromDictInterface(d map[string]interface{}) {
    35  	p.IP = net.ParseIP(d["ip"].(string))
    36  	if _, ok := d["peer id"]; ok {
    37  		p.ID = []byte(d["peer id"].(string))
    38  	}
    39  	p.Port = int(d["port"].(int64))
    40  }
    41  
    42  func (p Peer) FromNodeAddr(na krpc.NodeAddr) Peer {
    43  	p.IP = na.IP
    44  	p.Port = na.Port
    45  	return p
    46  }