]> Sergey Matveev's repositories - btrtrc.git/blob - tracker/http/peer.go
Support upstream trackers
[btrtrc.git] / tracker / http / peer.go
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 }