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 } }