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 }