aboutsummaryrefslogtreecommitdiff
path: root/tracker/peer.go
blob: 11fd7484eca799f1b16f6e833a35273db4c7e46b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package tracker

import (
	"fmt"

	"dim13.org/btget/bencode"
)

type Peer struct {
	IP   string `bencode:"ip"`
	ID   []byte `bencode:"peer id"`
	Port int    `bencode:"port"`
}

func (p Peer) String() string {
	return fmt.Sprintf("%v %s %v", p.IP, p.ID, p.Port)
}

type Peers []Peer

func (p *Peers) UnmarshalBencode(b []byte) (int, error) {
	switch b[0] {
	case 'l':
		var tmp []Peer
		n, err := bencode.Unmarshal(b, &tmp)
		*p = Peers(tmp)
		return n, err
	default:
		var tmp []byte
		n, err := bencode.Unmarshal(b, &tmp)
		addr, err := peerAddr(tmp)
		*p = make(Peers, len(addr))
		for i, v := range addr {
			(*p)[i] = Peer{
				IP:   v.IP.String(),
				Port: int(v.Port),
			}
		}
		return n, err
	}
}