aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-21 21:10:37 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-21 21:10:37 +0200
commitc7cf369ed820d3468daca2312698a1d2770cd6b9 (patch)
treea0a0a435e2aa54fc4c6681caaa7a7e0620b77306
parentf36a3ce525964ed0cf9136556a1a875bace8c153 (diff)
Poll
-rw-r--r--cmd/btcheck/main.go11
-rw-r--r--tracker/messages.go24
-rw-r--r--tracker/peer.go4
3 files changed, 32 insertions, 7 deletions
diff --git a/cmd/btcheck/main.go b/cmd/btcheck/main.go
index aff241b..d9162d8 100644
--- a/cmd/btcheck/main.go
+++ b/cmd/btcheck/main.go
@@ -35,10 +35,11 @@ func main() {
Compact: true,
Port: 6881,
}
- resp, err := req.Send(tor.Announce)
- if err != nil {
- log.Fatal(err)
+ pool := make(map[string]tracker.Peer)
+ for p := range req.Poll(tor.Announce) {
+ if _, ok := pool[p.IP]; !ok {
+ log.Println("new peer", p)
+ pool[p.IP] = p
+ }
}
- fmt.Println(resp.Interval)
- fmt.Println(resp.Peers)
}
diff --git a/tracker/messages.go b/tracker/messages.go
index 96cc069..3c739e8 100644
--- a/tracker/messages.go
+++ b/tracker/messages.go
@@ -3,6 +3,7 @@ package tracker
import (
"crypto/sha1"
"io/ioutil"
+ "log"
"net"
"net/http"
"time"
@@ -51,6 +52,29 @@ type Response struct {
WarningMessage string `bencode:"warning message"`
}
+func (r *Request) Poll(announce string) chan Peer {
+ c := make(chan Peer)
+ go func() {
+ defer close(c)
+ for {
+ resp, err := r.Send(announce)
+ if err != nil {
+ log.Println(err)
+ return
+ }
+ for _, p := range resp.Peers {
+ c <- p
+ }
+ if resp.Interval == 0 {
+ resp.Interval = DefaultInterval
+ }
+ log.Println("waiting", resp.Interval)
+ time.Sleep(resp.Interval)
+ }
+ }()
+ return c
+}
+
func (r Request) Send(announce string) (Response, error) {
fail := func(err error) (Response, error) {
return Response{}, err
diff --git a/tracker/peer.go b/tracker/peer.go
index 686dca9..81b1175 100644
--- a/tracker/peer.go
+++ b/tracker/peer.go
@@ -12,12 +12,12 @@ import (
type Peer struct {
IP string `bencode:"ip"`
- ID []byte `bencode:"peer id"`
+ ID []byte `bencode:"peer id"` // not present in compact mode
Port int `bencode:"port"`
}
func (p Peer) String() string {
- return fmt.Sprint(p.IP, url.QueryEscape(string(p.ID)), p.Port)
+ return fmt.Sprintf("%v:%v %v", p.IP, p.Port, url.QueryEscape(string(p.ID)))
}
type Peers []Peer