]> Sergey Matveev's repositories - btrtrc.git/blob - tracker/tracker.go
Almost completed http tracker support
[btrtrc.git] / tracker / tracker.go
1 package tracker
2
3 import (
4         "errors"
5         "net"
6         "net/url"
7 )
8
9 type AnnounceRequest struct {
10         InfoHash   [20]byte
11         PeerId     [20]byte
12         Downloaded int64
13         Left       int64
14         Uploaded   int64
15         Event      AnnounceEvent
16         IPAddress  int32
17         Key        int32
18         NumWant    int32 // How many peer addresses are desired. -1 for default.
19         Port       int16
20 } // 82 bytes
21
22 type AnnounceResponse struct {
23         Interval int32 // Minimum seconds the local peer should wait before next announce.
24         Leechers int32
25         Seeders  int32
26         Peers    []Peer
27 }
28
29 type AnnounceEvent int32
30
31 func (me AnnounceEvent) String() string {
32         // See BEP 3, "event".
33         return []string{"empty", "completed", "started", "stopped"}[me]
34 }
35
36 type Peer struct {
37         IP   net.IP
38         Port int
39 }
40
41 const (
42         None      AnnounceEvent = iota
43         Completed               // The local peer just completed the torrent.
44         Started                 // The local peer has just resumed this torrent.
45         Stopped                 // The local peer is leaving the swarm.
46 )
47
48 type Client interface {
49         // Returns ErrNotConnected if Connect needs to be called.
50         Announce(*AnnounceRequest) (AnnounceResponse, error)
51         Connect() error
52         String() string
53         URL() string
54 }
55
56 var (
57         ErrNotConnected = errors.New("not connected")
58         ErrBadScheme    = errors.New("unknown scheme")
59
60         schemes = make(map[string]func(*url.URL) Client)
61 )
62
63 func RegisterClientScheme(scheme string, newFunc func(*url.URL) Client) {
64         schemes[scheme] = newFunc
65 }
66
67 // Returns ErrBadScheme if the tracker scheme isn't recognised.
68 func New(rawurl string) (cl Client, err error) {
69         url_s, err := url.Parse(rawurl)
70         if err != nil {
71                 return
72         }
73         newFunc, ok := schemes[url_s.Scheme]
74         if !ok {
75                 err = ErrBadScheme
76                 return
77         }
78         cl = newFunc(url_s)
79         return
80 }